skyline-apiserver/src/skyline_apiserver/client/openstack/system.py

93 lines
3.2 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 pathlib import PurePath
from typing import Any, Dict
from keystoneauth1.identity.v3 import Token
from keystoneauth1.session import Session
from skyline_log import LOG
from starlette.concurrency import run_in_threadpool
from skyline_apiserver.client import utils
from skyline_apiserver.client.utils import get_system_session
from skyline_apiserver.config import CONF
async def get_project_scope_token(
keystone_token: str,
region: str,
project_id: str,
) -> str:
auth_url = await utils.get_endpoint(
region=region,
service="keystone",
session=get_system_session(),
)
kwargs = {"project_id": project_id}
scope_auth = Token(auth_url=auth_url, token=keystone_token, **kwargs)
session = Session(auth=scope_auth, verify=False)
keystone_token = session.get_token()
return keystone_token
async def get_endpoints(region: str) -> Dict[str, Any]:
access = await utils.get_access(session=get_system_session())
catalogs = access.service_catalog.get_endpoints(
region_name=region,
interface=CONF.openstack.interface_type,
)
endpoints = {}
for service_type, endpoint in catalogs.items():
service = CONF.openstack.service_mapping.get(service_type)
if service is None:
continue
path = PurePath("/").joinpath(CONF.openstack.nginx_prefix, region.lower(), service)
endpoints[service] = str(path)
nc = await utils.neutron_client(session=get_system_session(), region=region)
neutron_extentions = await run_in_threadpool(nc.list_extensions)
extentions_set = {i["alias"] for i in neutron_extentions["extensions"]}
for alias, mapping_name in CONF.openstack.extension_mapping.items():
if alias in extentions_set:
endpoints[mapping_name] = endpoints["neutron"]
else:
LOG.info(f"The {alias} resource could not be found.")
return endpoints
async def get_projects(region: str, user: str) -> Dict[str, Any]:
kc = await utils.keystone_client(session=get_system_session(), region=region)
projects = {
i.id: {"name": i.name, "domain_id": i.domain_id} for i in kc.projects.list(user=user)
}
return projects
async def get_domains(region: str) -> Any:
kc = await utils.keystone_client(session=get_system_session(), region=region)
domains = [i.name for i in kc.domains.list(enabled=True)]
return domains
async def get_regions() -> Any:
access = await utils.get_access(session=get_system_session())
catalogs = access.service_catalog.get_endpoints(interface=CONF.openstack.interface_type)
regions = list(set(j["region_id"] for i in catalogs for j in catalogs[i]))
return regions