skyline-apiserver/skyline_apiserver/schemas/extension.py
Boxiang Zhu c6fd1d4147 fix: Lack of Octavia device owner of port
Add Octavia device owner of port

Closes-Bug: #1989551
Change-Id: Ic1d544bd9e61f68549cb052c40c666d6306524ef
2022-09-14 15:53:23 +08:00

542 lines
19 KiB
Python

# 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 enum import Enum
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
from pydantic.types import UUID4
SERVERS_LIST_DOCS_LINKS = "https://docs.openstack.org/api-ref/compute/?expanded=list-servers-detailed-detail#list-servers-detailed" # noqa
VOLUMES_LIST_DOCS_LINKS = "https://docs.openstack.org/api-ref/block-storage/v3/index.html?expanded=list-accessible-volumes-with-details-detail#list-accessible-volumes-with-details" # noqa
VOLUME_SNAPSHOTS_LIST_DOCS_LINKS = "https://docs.openstack.org/api-ref/block-storage/v3/index.html?expanded=list-snapshots-and-details-detail#list-snapshots-and-details" # noqa
PORTS_LIST_DOCS_LINKS = "https://docs.openstack.org/api-ref/network/v2/index.html?expanded=list-ports-detail#list-ports" # noqa
class ServerStatus(str, Enum):
ACTIVE = "ACTIVE"
BUILD = "BUILD"
# DELETED = "DELETED"
ERROR = "ERROR"
HARD_REBOOT = "HARD_REBOOT"
MIGRATING = "MIGRATING"
# PASSWORD = "PASSWORD"
PAUSED = "PAUSED"
REBOOT = "REBOOT"
REBUILD = "REBUILD"
RESCUE = "RESCUE"
RESIZE = "RESIZE"
# REVERT_RESIZE = "REVERT_RESIZE"
SHELVED = "SHELVED"
SHELVED_OFFLOADED = "SHELVED_OFFLOADED"
SHUTOFF = "SHUTOFF"
SOFT_DELETED = "SOFT_DELETED"
SUSPENDED = "SUSPENDED"
UNKNOWN = "UNKNOWN"
# VERIFY_RESIZE = "VERIFY_RESIZE"
def __str__(self):
return self.value
class VolumeStatus(str, Enum):
creating = "creating"
available = "available"
reserved = "reserved"
attaching = "attaching"
detaching = "detaching"
in_use = "in-use"
maintenance = "maintenance"
deleting = "deleting"
awaiting_transfer = "awaiting-transfer"
error = "error"
error_deleting = "error_deleting"
backing_up = "backing-up"
restoring_backup = "restoring-backup"
error_backing_up = "error_backing-up"
error_restoring = "error_restoring"
error_extending = "error_extending"
downloading = "downloading"
uploading = "uploading"
retyping = "retyping"
extending = "extending"
def __str__(self):
return self.value
class VolumeSnapshotStatus(str, Enum):
CREATING = "CREATING"
AVAILABLE = "AVAILABLE"
# BACKING_UP = "BACKING_UP"
DELETING = "DELETING"
ERROR = "ERROR"
# DELETED = "DELETED"
# UNMANAGING = "UNMANAGING"
# RESTORING = "RESTORING"
ERROR_DELETING = "ERROR_DELETING"
def __str__(self):
return self.value
class PortStatus(str, Enum):
ACTIVE = "ACTIVE"
DOWN = "DOWN"
BUILD = "BUILD"
ERROR = "ERROR"
N_A = "N/A"
def __str__(self):
return self.value
class PortDeviceOwner(str, Enum):
null = ""
# prefix compute
compute_nova = "compute:nova"
compute_kuryr = "compute:kuryr"
# prefix network
network_router_ha_interface = "network:router_ha_interface"
network_ha_router_replicated_interface = "network:ha_router_replicated_interface"
network_router_interface = "network:router_interface"
network_router_gateway = "network:router_gateway"
network_floatingip = "network:floatingip"
network_local_ip = "network:local_ip"
network_dhcp = "network:dhcp"
network_router_interface_distributed = "network:router_interface_distributed"
network_floatingip_agent_gateway = "network:floatingip_agent_gateway"
network_router_centralized_snat = "network:router_centralized_snat"
network_routed = "network:routed"
network_distributed = "network:distributed"
# octavia
octavia = "Octavia"
def __str__(self):
return self.value
class SortDir(str, Enum):
desc = "desc"
asc = "asc"
def __str__(self):
return self.value
class ServerSortKey(str, Enum):
uuid = "uuid"
display_name = "display_name"
vm_state = "vm_state"
locked = "locked"
created_at = "created_at"
host = "host"
project_id = "project_id"
def __str__(self):
return self.value
class RecycleServerSortKey(str, Enum):
uuid = "uuid"
display_name = "display_name"
updated_at = "updated_at"
project_id = "project_id"
def __str__(self):
return self.value
class VolumeSortKey(str, Enum):
id = "id"
name = "name"
size = "size"
status = "status"
bootable = "bootable"
created_at = "created_at"
def __str__(self):
return self.value
class VolumeSnapshotSortKey(str, Enum):
id = "id"
name = "name"
status = "status"
created_at = "created_at"
def __str__(self):
return self.value
class PortSortKey(str, Enum):
id = "id"
name = "name"
mac_address = "mac_address"
status = "status"
project_id = "project_id"
def __str__(self):
return self.value
class FlavorInServer(BaseModel):
ephemeral: Optional[int] = Field(None, description="Ephemeral disk size in GB")
ram: Optional[int] = Field(None, description="RAM size in MB")
original_name: Optional[str] = Field(None, description="Original flavor name")
vcpus: Optional[int] = Field(None, description="Number of vCPUs")
extra_specs: Optional[Dict[str, Any]] = Field(None, description="Extra specs")
swap: Optional[int] = Field(None, description="Swap size in MB")
disk: Optional[int] = Field(None, description="Disk size in GB")
class ServersResponseBase(BaseModel):
id: UUID4 = Field(..., description="Server ID")
origin_data: Dict[str, Any] = Field(
description=f"The origin_data is the same like the response of {SERVERS_LIST_DOCS_LINKS}",
)
project_name: Optional[str] = Field(None, description="Project name")
image: Optional[UUID4] = Field(None, description="Image ID")
image_name: Optional[str] = Field(None, description="Image name")
image_os_distro: Optional[str] = Field(None, description="Image OS distro")
fixed_addresses: Optional[List] = Field(None, description="Fixed addresses")
floating_addresses: Optional[List] = Field(None, description="Floating addresses")
name: Optional[str] = Field(
description="Will be removed, please use origin_data[name]",
deprecated=True,
)
project_id: Optional[str] = Field(
description="Will be removed, please use origin_data[tenant_id]",
deprecated=True,
)
host: Optional[str] = Field(
description="Will be removed, please use origin_data[OS-EXT-SRV-ATTR:host]",
deprecated=True,
)
hostname: Optional[str] = Field(
description="Will be removed, please use origin_data[OS-EXT-SRV-ATTR:hostname]",
deprecated=True,
)
flavor: Optional[str] = Field(
description="Will be removed, please use origin_data[flavor][original_name]",
deprecated=True,
)
flavor_info: Optional[FlavorInServer] = Field(
description="Will be removed, please use origin_data[flavor]",
deprecated=True,
)
status: Optional[str] = Field(
description="Will be removed, please use origin_data[status]",
deprecated=True,
)
locked: Optional[bool] = Field(
description="Will be removed, please use origin_data[locked]",
deprecated=True,
)
created_at: Optional[str] = Field(
description="Will be removed, please use origin_data[created]",
deprecated=True,
)
task_state: Optional[str] = Field(
description="Will be removed, please use origin_data[OS-EXT-STS:task_state]",
deprecated=True,
)
vm_state: Optional[str] = Field(
description="Will be removed, please use origin_data[OS-EXT-STS:vm_state]",
deprecated=True,
)
power_state: Optional[int] = Field(
description="Will be removed, please use origin_data[OS-EXT-STS:power_state]",
deprecated=True,
)
root_device_name: Optional[str] = Field(
description="Will be removed, please use origin_data[OS-EXT-SRV-ATTR:root_device_name]",
deprecated=True,
)
metadata: Optional[Dict[str, Any]] = Field(
description="Will be removed, please use origin_data[metadata]",
deprecated=True,
)
class ServersResponse(BaseModel):
servers: List[ServersResponseBase] = Field(..., description="Servers list")
class RecycleServersResponseBase(BaseModel):
id: UUID4 = Field(..., description="Recycle server id")
origin_data: Dict[str, Any] = Field(
description=f"The origin_data is the same like the response of {SERVERS_LIST_DOCS_LINKS}",
)
project_name: Optional[str] = Field(None, description="Project name")
image: Optional[UUID4] = Field(None, description="Image id")
image_name: Optional[str] = Field(None, description="Image name")
image_os_distro: Optional[str] = Field(None, description="Image os distro")
fixed_addresses: Optional[List] = Field(None, description="Fixed addresses")
floating_addresses: Optional[List] = Field(None, description="Floating addresses")
deleted_at: Optional[str] = Field(None, description="Deleted at")
reclaim_timestamp: float = Field(..., description="Reclaim timestamp")
name: Optional[str] = Field(
description="Will be removed, please use origin_data[name]",
deprecated=True,
)
project_id: Optional[str] = Field(
description="Will be removed, please use origin_data[tenant_id]",
deprecated=True,
)
host: Optional[str] = Field(
description="Will be removed, please use origin_data[OS-EXT-SRV-ATTR:host]",
deprecated=True,
)
hostname: Optional[str] = Field(
description="Will be removed, please use origin_data[OS-EXT-SRV-ATTR:hostname]",
deprecated=True,
)
flavor: Optional[str] = Field(
description="Will be removed, please use origin_data[flavor][original_name]",
deprecated=True,
)
flavor_info: Optional[FlavorInServer] = Field(
description="Will be removed, please use origin_data[flavor]",
deprecated=True,
)
status: Optional[str] = Field(
description="Will be removed, please use origin_data[status]",
deprecated=True,
)
class RecycleServersResponse(BaseModel):
recycle_servers: List[RecycleServersResponseBase] = Field(
..., description="Recycle servers list"
)
class VolumeAttachment(BaseModel):
id: str = Field(..., description="Volume attachment id")
device: Optional[str] = Field(None, description="Device name")
server_id: Optional[str] = Field(None, description="Server id")
server_name: Optional[str] = Field(None, description="Server name")
class VolumesResponseBase(BaseModel):
id: UUID4 = Field(..., description="Volume ID")
origin_data: Dict[str, Any] = Field(
description=f"The origin_data is the same like the response of {VOLUMES_LIST_DOCS_LINKS}",
)
project_name: Optional[str] = Field(None, description="Project name")
attachments: Optional[List[VolumeAttachment]] = Field(None, description="Volume attachments")
name: Optional[str] = Field(
description="Will be removed, please use origin_data[name]",
deprecated=True,
)
project_id: Optional[str] = Field(
description="Will be removed, please use origin_data[os-vol-tenant-attr:tenant_id]",
deprecated=True,
)
host: Optional[str] = Field(
description="Will be removed, please use origin_data[os-vol-host-attr:host]",
deprecated=True,
)
snapshot_id: Optional[str] = Field(
description="Will be removed, please use origin_data[snapshot_id]",
deprecated=True,
)
source_volid: Optional[str] = Field(
description="Will be removed, please use origin_data[source_volid]",
deprecated=True,
)
size: Optional[int] = Field(
description="Will be removed, please use origin_data[size]",
deprecated=True,
)
status: Optional[str] = Field(
description="Will be removed, please use origin_data[status]",
deprecated=True,
)
volume_type: Optional[str] = Field(
description="Will be removed, please use origin_data[volume_type]",
deprecated=True,
)
encrypted: Optional[bool] = Field(
description="Will be removed, please use origin_data[encrypted]",
deprecated=True,
)
bootable: Optional[str] = Field(
description="Will be removed, please use origin_data[bootable]",
deprecated=True,
)
multiattach: Optional[bool] = Field(
description="Will be removed, please use origin_data[multiattach]",
deprecated=True,
)
availability_zone: Optional[str] = Field(
description="Will be removed, please use origin_data[availability_zone]",
deprecated=True,
)
created_at: Optional[str] = Field(
description="Will be removed, please use origin_data[created_at]",
deprecated=True,
)
class VolumesResponse(BaseModel):
count: Optional[int] = Field(0, description="Count of volumes")
volumes: List[VolumesResponseBase] = Field(..., description="Volumes list")
class VolumeSnapshotChildVolume(BaseModel):
volume_id: str = Field(
None, description="ID of volume", example="00000000-0000-0000-0000-000000000000"
)
volume_name: str = Field(None, description="Name of volume", example="child-volume-demo")
class VolumeSnapshotsResponseBase(BaseModel):
id: str = Field(..., description="Snapshot ID")
origin_data: Dict[str, Any] = Field(
description=f"The origin_data is the same like the response of {VOLUME_SNAPSHOTS_LIST_DOCS_LINKS}", # noqa
)
project_name: Optional[str] = Field(None, description="Project name")
host: Optional[str] = Field(None, description="Host name")
volume_name: Optional[str] = Field(None, description="Name of volume", example="volume-demo")
child_volumes: Optional[List[VolumeSnapshotChildVolume]] = Field(
None, description="Child volumes"
)
name: Optional[str] = Field(
description="Will be removed, please use origin_data[name]",
deprecated=True,
)
project_id: Optional[str] = Field(
description="Will be removed, please use origin_data[os-extended-snapshot-attributes:project_id]", # noqa
deprecated=True,
)
size: Optional[int] = Field(
description="Will be removed, please use origin_data[size]",
deprecated=True,
)
status: Optional[str] = Field(
description="Will be removed, please use origin_data[status]",
deprecated=True,
)
volume_id: Optional[str] = Field(
description="Will be removed, please use origin_data[volume_id]",
deprecated=True,
)
created_at: Optional[str] = Field(
description="Will be removed, please use origin_data[created_at]",
deprecated=True,
)
metadata: Optional[Dict[Any, Any]] = Field(
description="Will be removed, please use origin_data[metadata]",
deprecated=True,
)
class VolumeSnapshotsResponse(BaseModel):
count: Optional[int] = Field(0, description="Count of volume snapshots")
volume_snapshots: List[VolumeSnapshotsResponseBase] = Field(
..., description="Volume snapshots list"
)
class PortsResponseBase(BaseModel):
id: str = Field(..., description="Port ID")
origin_data: Dict[str, Any] = Field(
description=f"The origin_data is the same like the response of {PORTS_LIST_DOCS_LINKS}", # noqa
)
server_name: Optional[str] = Field(None, description="Server name")
network_name: Optional[str] = Field(None, description="Network name")
ipv4: Optional[List] = Field(None, description="IPv4 addresses")
ipv6: Optional[List] = Field(None, description="IPv6 addresses")
name: Optional[str] = Field(
description="Will be removed, please use origin_data[name]",
deprecated=True,
)
mac_address: Optional[str] = Field(
description="Will be removed, please use origin_data[mac_address]",
deprecated=True,
)
project_id: Optional[str] = Field(
description="Will be removed, please use origin_data[project_id]",
deprecated=True,
)
device_owner: Optional[str] = Field(
description="Will be removed, please use origin_data[device_owner]",
deprecated=True,
)
device_id: Optional[str] = Field(
description="Will be removed, please use origin_data[device_id]",
deprecated=True,
)
status: Optional[str] = Field(
description="Will be removed, please use origin_data[status]",
deprecated=True,
)
created_at: Optional[str] = Field(
description="Will be removed, please use origin_data[created_at]",
deprecated=True,
)
network_id: Optional[str] = Field(
description="Will be removed, please use origin_data[network_id]",
deprecated=True,
)
binding_vnic_type: Optional[str] = Field(
description="Will be removed, please use origin_data[binding:vnic_type]",
deprecated=True,
)
description: Optional[str] = Field(
description="Will be removed, please use origin_data[description]",
deprecated=True,
)
port_security_enabled: Optional[bool] = Field(
description="Will be removed, please use origin_data[port_security_enabled]",
deprecated=True,
)
qos_policy_id: Optional[str] = Field(
description="Will be removed, please use origin_data[qos_policy_id]",
deprecated=True,
)
fixed_ips: Optional[List] = Field(
description="Will be removed, please use origin_data[fixed_ips]",
deprecated=True,
)
class PortsResponse(BaseModel):
ports: List[PortsResponseBase] = Field(..., description="Ports list")
class ComputeServicesResponseBase(BaseModel):
id: Optional[str] = Field(None, description="Service id")
binary: str = Field(..., description="Service binary")
disabled_reason: Optional[str] = Field(None, description="Disabled reason")
host: str = Field(..., description="Host name")
state: Optional[str] = Field(None, description="Service state")
status: str = Field(..., description="Service status")
updated_at: Optional[str] = Field(None, description="Updated at")
forced_down: Optional[bool] = Field(None, description="Forced down")
zone: Optional[str] = Field(None, description="Zone")
class ComputeServicesResponse(BaseModel):
services: List[ComputeServicesResponseBase] = Field(..., description="Services list")