chore: Remove poetry

1. remove poetry dependency
2. add requirements.tx, test-requirements.txt, setup.py and setup.cfg
3. add more env into tox.ini
4. remove some command from Makefile
5. cleanup the dependencies
6. change some commands of README
7. update the devstack

Depends-On: https://review.opendev.org/c/openstack/skyline-console/+/843257

Change-Id: I4cefc4cfdaadf7b3ba03ffe8441e9ae760772349
This commit is contained in:
zhu.boxiang 2022-05-23 11:51:19 +08:00
parent 60144767cd
commit 1a050ec2c4
29 changed files with 310 additions and 4870 deletions

View File

@ -70,6 +70,8 @@ docs/_build/
.vscode/
/log/
tmp/
test_results.html
nginx.conf
# MAC OS
.DS_Store

View File

@ -1,5 +0,0 @@
[flake8]
max-line-length = 99
max-doc-length = 99
show-source = True
extend-ignore = E203

4
.gitignore vendored
View File

@ -26,6 +26,8 @@ wheels/
.installed.cfg
*.egg
MANIFEST
AUTHORS
ChangeLog
# Installer logs
pip-log.txt
@ -72,8 +74,8 @@ venv.bak/
tmp/
test_results.html
skyline-console-*
nginx.conf
# MAC OS
.DS_Store
.idea
requirements.txt

9
.isort.cfg Normal file
View File

@ -0,0 +1,9 @@
[settings]
multi_line_output = 3
include_trailing_comma = True
force_grid_wrap = 0
use_parentheses = True
ensure_newline_before_comments = True
line_length = 98
reverse_relative = true
combine_as_imports = true

2
.vscode/launch.json vendored
View File

@ -11,7 +11,7 @@
"module": "uvicorn",
"args": [
"--reload",
"--reload-dir", "libs/skyline-apiserver/skyline_apiserver",
"--reload-dir", "skyline_apiserver",
"--port", "28000",
"--log-level", "debug",
"skyline_apiserver.main:app"

View File

@ -12,6 +12,7 @@
- playbooks/devstack/post.yaml
required-projects:
- openstack/skyline-apiserver
- openstack/skyline-console
vars:
devstack_plugins:
skyline-apiserver: https://opendev.org/openstack/skyline-apiserver
@ -25,38 +26,27 @@
tox_envlist: functional
- job:
name: skyline-tox-unittest-py38
name: skyline-tox-py38
parent: openstack-tox-py38
description: |
Skyline py38 unittest tests
vars:
python_version: 3.8
tox_envlist: unittest-py38
tox_envlist: py38
- job:
name: skyline-tox-lint-py38
name: skyline-tox-pep8-py38
parent: openstack-tox-py38
description: |
Skyline code static analysis
vars:
python_version: 3.8
tox_envlist: lint
- job:
name: publish-skyline-python-branch-tarball
parent: publish-openstack-artifacts
description: |
Publish the results tar.gz and whl packages to tarballs.openstack.org.
pre-run: playbooks/python-tarball/pre.yaml
run: playbooks/python-tarball/run.yaml
post-run: playbooks/python-tarball/post.yaml
vars:
release_python: python3
tox_envlist: pep8
- project:
check:
jobs:
- skyline-tox-unittest-py38:
- skyline-tox-py38:
irrelevant-files:
- ^container/.*$
- ^devstack/.*$
@ -65,7 +55,7 @@
- ^.*\.rst$
- ^.*\.md$
- ^kolla/.*$
- skyline-tox-lint-py38
- skyline-tox-pep8-py38
- skyline-functional-devstack:
irrelevant-files:
- ^container/.*$
@ -78,7 +68,7 @@
- ^releasenotes/.*$
gate:
jobs:
- skyline-tox-unittest-py38:
- skyline-tox-py38:
irrelevant-files:
- ^container/.*$
- ^devstack/.*$
@ -87,7 +77,7 @@
- ^.*\.rst$
- ^.*\.md$
- ^kolla/.*$
- skyline-tox-lint-py38
- skyline-tox-pep8-py38
- skyline-functional-devstack:
irrelevant-files:
- ^container/.*$
@ -100,4 +90,4 @@
- ^releasenotes/.*$
post:
jobs:
- publish-skyline-python-branch-tarball
- publish-openstack-python-tarball

1
MANIFEST.in Normal file
View File

@ -0,0 +1 @@
include skyline_apiserver/templates/nginx.conf.j2

View File

@ -1,5 +1,3 @@
PYTHON ?= python3
PY_FILES := $(shell git ls-files -- *.py | xargs)
ROOT_DIR ?= $(shell git rev-parse --show-toplevel)
# Color
@ -21,9 +19,6 @@ GIT_COMMIT ?= $(shell git rev-parse --verify HEAD)
# URL for skyline-console packages
SKYLINE_CONSOLE_PACKAGE_URL ?= "https://tarballs.opendev.org/openstack/skyline-console/skyline-console-master.tar.gz"
.PHONY: all
all: install fmt lint test package
.PHONY: help
help:
@ -33,17 +28,10 @@ help:
@echo
@echo "Target:"
@echo " git_config Initialize git configuration."
@echo " venv Create virtualenvs."
@echo " install Installs the project dependencies."
@echo " package Build package from source code."
@echo " build Build container image."
@echo " lint Check python code."
@echo " fmt Format python code style."
@echo " test Run unit tests."
@echo " clean Clean up."
@echo " build Build docker image."
@echo " db_revision Generate database alembic version revision with model."
@echo " db_sync Sync database from alembic version revision."
@echo " swagger Generate swagger json file."
@echo " genconfig Generate sample config file."
@echo " future_check Find python files without 'type annotations'.(Alpha)"
@echo
@ -72,46 +60,9 @@ endif
@printf "${yellow}You may need to run 'pip install git-review' install git review tools.\n\n${no_color}"
.PHONY: venv
venv:
poetry env use $(PYTHON)
.PHONY: install
install: venv
poetry run pip install -U pip setuptools'<58.0.0'
poetry install -vvv
tools/post_install.sh
.PHONY: package
package:
poetry build
.PHONY: fmt
fmt:
poetry run isort $(PY_FILES)
poetry run black --config pyproject.toml $(PY_FILES)
poetry run add-trailing-comma --py36-plus --exit-zero-even-if-changed $(PY_FILES)
.PHONY: lint
lint:
# poetry run mypy --strict --config-file=mypy.ini $(PY_FILES)
poetry run isort --check-only --diff $(PY_FILES)
poetry run black --check --diff --color --config pyproject.toml $(PY_FILES)
poetry run flake8 --config .flake8 $(PY_FILES)
.PHONY: test
test:
poetry run pytest
.PHONY: clean
clean:
rm -rf .venv dist htmlcov .coverage log test_results.html
rm -rf .venv dist htmlcov .coverage log test_results.html build .tox skyline_apiserver.egg-info AUTHORS ChangeLog
.PHONY: build
@ -133,28 +84,18 @@ build:
rm -rf skyline-console-*
.PHONY: swagger
swagger:
poetry run swagger-generator -o $(ROOT_DIR)/docs/api/swagger.json
.PHONY: genconfig
genconfig:
poetry run config-sample-generator -o $(ROOT_DIR)/etc/skyline.yaml.sample
.PHONY: db_revision
HEAD_REV ?= $(shell poetry run alembic -c skyline_apiserver/db/alembic/alembic.ini heads | awk '{print $$1}')
HEAD_REV ?= $(shell alembic -c skyline_apiserver/db/alembic/alembic.ini heads | awk '{print $$1}')
NEW_REV ?= $(shell python3 -c 'import sys; print(f"{int(sys.argv[1])+1:03}")' $(HEAD_REV))
REV_MEG ?=
db_revision:
$(shell [ -z "$(REV_MEG)" ] && printf '$(red)Missing required message, use "make db_revision REV_MEG=<some message>"$(no_color)')
poetry run alembic -c skyline_apiserver/db/alembic/alembic.ini revision --autogenerate --rev-id $(NEW_REV) -m '$(REV_MEG)'
alembic -c skyline_apiserver/db/alembic/alembic.ini revision --autogenerate --rev-id $(NEW_REV) -m '$(REV_MEG)'
.PHONY: db_sync
db_sync:
poetry run alembic -c skyline_apiserver/db/alembic/alembic.ini upgrade head
alembic -c skyline_apiserver/db/alembic/alembic.ini upgrade head
# Find python files without "type annotations"

View File

@ -151,7 +151,6 @@ Skyline 的吉祥物是九色鹿。九色鹿源自于敦煌壁画《九色鹿本
- make >= 3.82
- python >= 3.8
- poetry >= 1.1.0 ([安装指南](https://python-poetry.org/docs/#installation))
- node >= 10.22.0 (可选,只开发 API 就用不到)
- yarn >= 1.22.4 (可选,只开发 API 就用不到)
@ -160,7 +159,7 @@ Skyline 的吉祥物是九色鹿。九色鹿源自于敦煌壁画《九色鹿本
1. 安装依赖包
```bash
make install
tox -e venv
```
2. 配置 `skyline.yaml` 文件
@ -190,13 +189,16 @@ Skyline 的吉祥物是九色鹿。九色鹿源自于敦煌壁画《九色鹿本
3. 初始化 skyline 数据库
```bash
source .tox/venv/bin/activate
make db_sync
deactivate
```
4. 运行 skyline-apiserver
```bash
$ poetry run uvicorn --reload --reload-dir skyline_apiserver --port 28000 --log-level debug skyline_apiserver.main:app
```console
$ source .tox/venv/bin/activate
$ uvicorn --reload --reload-dir skyline_apiserver --port 28000 --log-level debug skyline_apiserver.main:app
INFO: Uvicorn running on http://127.0.0.1:28000 (Press CTRL+C to quit)
INFO: Started reloader process [154033] using statreload

View File

@ -151,7 +151,6 @@ You can now access the dashboard: `https://<ip_address>:9999`
- make >= 3.82
- python >= 3.8
- poetry >= 1.1.0 ([Installation Guide](https://python-poetry.org/docs/#installation))
- node >= 10.22.0 (Optional if you only develop with apiserver)
- yarn >= 1.22.4 (Optional if you only develop with apiserver)
@ -160,7 +159,7 @@ You can now access the dashboard: `https://<ip_address>:9999`
1. Installing dependency packages
```bash
make install
tox -e venv
```
2. Set skyline.yaml config file
@ -190,13 +189,16 @@ You can now access the dashboard: `https://<ip_address>:9999`
3. Init skyline database
```bash
source .tox/venv/bin/activate
make db_sync
deactivate
```
4. Run skyline-apiserver
```bash
$ poetry run uvicorn --reload --reload-dir skyline_apiserver --port 28000 --log-level debug skyline_apiserver.main:app
```console
$ source .tox/venv/bin/activate
$ uvicorn --reload --reload-dir skyline_apiserver --port 28000 --log-level debug skyline_apiserver.main:app
INFO: Uvicorn running on http://127.0.0.1:28000 (Press CTRL+C to quit)
INFO: Started reloader process [154033] using statreload

View File

@ -27,12 +27,11 @@ RUN export LANG=C.UTF-8 \
&& rm -rf /usr/bin/python /usr/bin/pip \
&& ln -s /usr/bin/python3 /usr/bin/python \
&& ln -s /usr/bin/pip3 /usr/bin/pip \
&& pip install -U pip setuptools'<58.0.0' \
&& pip install poetry!=1.1.8 \
&& poetry config virtualenvs.create false \
&& mkdir -p /etc/skyline /var/log/skyline /var/lib/skyline \
&& cd /skyline-apiserver \
&& poetry install \
&& git init \
&& cd / \
&& pip install skyline-apiserver/ \
&& pip install -U ${SKYLINE_CONSOLE_PACKAGE_URL} \
&& apt-get clean \
&& rm -rf ~/.cache/pip

View File

@ -1,90 +0,0 @@
#!/bin/bash
# Save trace setting
INC_PY_TRACE=$(set +o | grep xtrace)
set +o xtrace
# Wrapper for ``pip install`` to set cache and proxy environment variables
# Uses globals ``OFFLINE``, ``PIP_VIRTUAL_ENV``,
# ``PIP_UPGRADE``, ``*_proxy``,
# Usage:
# pip_install pip_arguments
function contrib_pip_install {
local xtrace result
xtrace=$(set +o | grep xtrace)
set +o xtrace
local upgrade=""
local offline=${OFFLINE:-False}
if [[ "$offline" == "True" || -z "$@" ]]; then
$xtrace
return
fi
time_start "pip_install"
PIP_UPGRADE=$(trueorfalse False PIP_UPGRADE)
if [[ "$PIP_UPGRADE" = "True" ]] ; then
upgrade="--upgrade"
fi
if [[ -z "$os_PACKAGE" ]]; then
GetOSVersion
fi
# Try to extract the path of the package we are installing into
# package_dir. We need this to check for test-requirements.txt,
# at least.
#
# ${!#} expands to the last positional argument to this function.
# With "extras" syntax included, our arguments might be something
# like:
# -e /path/to/fooproject[extra]
# Thus this magic line grabs just the path without extras
#
# Note that this makes no sense if this is a pypi (rather than
# local path) install; ergo you must check this path exists before
# use. Also, if we had multiple or mixed installs, we would also
# likely break. But for historical reasons, it's basically only
# the other wrapper functions in here calling this to install
# local packages, and they do so with single call per install. So
# this works (for now...)
local package_dir=${!#%\[*\]}
if [[ -n ${PIP_VIRTUAL_ENV:=} && -d ${PIP_VIRTUAL_ENV} ]]; then
local cmd_pip=$PIP_VIRTUAL_ENV/bin/pip
local sudo_pip="env"
else
local cmd_pip="python$PYTHON3_VERSION -m pip"
# See
# https://github.com/pypa/setuptools/issues/2232
# http://lists.openstack.org/pipermail/openstack-discuss/2020-August/016905.html
# this makes setuptools >=50 use the platform distutils.
# We only want to do this on global pip installs, not if
# installing in a virtualenv
local sudo_pip="sudo -H LC_ALL=en_US.UTF-8 SETUPTOOLS_USE_DISTUTILS=stdlib "
echo "Using python $PYTHON3_VERSION to install $package_dir"
fi
cmd_pip="$cmd_pip install"
$xtrace
# adding SETUPTOOLS_SYS_PATH_TECHNIQUE is a workaround to keep
# the same behaviour of setuptools before version 25.0.0.
# related issue: https://github.com/pypa/pip/issues/3874
$sudo_pip \
http_proxy="${http_proxy:-}" \
https_proxy="${https_proxy:-}" \
no_proxy="${no_proxy:-}" \
PIP_FIND_LINKS=$PIP_FIND_LINKS \
SETUPTOOLS_SYS_PATH_TECHNIQUE=rewrite \
$cmd_pip $upgrade \
$@
result=$?
time_stop "pip_install"
return $result
}
# Restore xtrace
$INC_PY_TRACE

View File

@ -13,8 +13,6 @@
_XTRACE=$(set +o | grep xtrace)
set +o xtrace
source $SKYLINE_APISERVER_DIR/devstack/inc/*
function _mkdir_chown_stack {
if [[ ! -d "$1" ]]; then
sudo mkdir -p "$1"
@ -30,9 +28,7 @@ function _skyline_config_set {
}
function _install_skyline_apiserver {
pushd $SKYLINE_APISERVER_DIR
make install
popd
setup_develop $SKYLINE_APISERVER_DIR
}
function _install_skyline_console {
@ -47,9 +43,7 @@ function _install_skyline_console {
fi
pushd $DEST/skyline-console
make package
source $DEST/skyline-apiserver/.venv/bin/activate
pip install --force-reinstall dist/skyline_console-*.whl
deactivate
sudo pip3 install --force-reinstall dist/skyline_console-*.whl
popd
}
@ -74,9 +68,6 @@ function _install_dependent_tools {
install_package python3.8 python-is-python3 # make sure python exists
fi
# poetry
contrib_pip_install poetry!=1.1.8
# nvm
NVM_INSTALL_FILE_NAME=nvm-install.sh
if [[ ! -f "$HOME/$NVM_INSTALL_FILE_NAME" ]]; then
@ -168,12 +159,12 @@ function start_skyline {
# skyline-apiserver Start
#-------------------------
run_process "skyline" "$SKYLINE_APISERVER_DIR/.venv/bin/gunicorn -c /etc/skyline/gunicorn.py skyline_apiserver.main:app"
run_process "skyline" "/usr/local/bin/gunicorn -c /etc/skyline/gunicorn.py skyline_apiserver.main:app"
# skyline-console Configuration
#-------------------------
sudo $SKYLINE_APISERVER_DIR/.venv/bin/skyline-nginx-generator -o /etc/nginx/nginx.conf
sudo skyline-nginx-generator -o /etc/nginx/nginx.conf
# skyline-console Start
#-------------------------

View File

@ -1,35 +0,0 @@
- hosts: all
tasks:
- name: Find tarballs and wheels in dist folder
find:
file_type: file
paths: "src/{{ zuul.project.canonical_name }}/dist"
patterns: "*.tar.gz,*.whl"
register: result
- name: Display stat for tarballs and wheels
stat:
path: "{{ zj_tarball_wheel.path }}"
with_items: "{{ result.files }}"
loop_control:
loop_var: zj_tarball_wheel
- name: Ensure artifacts directory exists
file:
path: "{{ zuul.executor.work_root }}/artifacts"
state: directory
mode: 0755
delegate_to: localhost
- name: Collect artifacts
synchronize:
dest: "{{ zuul.executor.work_root }}/artifacts/"
mode: pull
src: "{{ zj_artifact.path }}"
verify_host: true
owner: no
group: no
with_items: "{{ result.files }}"
loop_control:
loop_var: zj_artifact

View File

@ -1,5 +0,0 @@
- hosts: all
roles:
# We use ensure-pip to make sure the wheel module is installed
- ensure-pip
- revoke-sudo

View File

@ -1,31 +0,0 @@
- hosts: all
tasks:
- name: Install tox
shell:
executable: /bin/bash
cmd: |
# tox
pip3 install tox
- name: Build tarball and wheel
shell:
executable: /bin/bash
cmd: |
$HOME/.local/bin/tox -e package
args:
chdir: "src/{{ zuul.project.canonical_name }}"
- name: Rename whl files to branch specific name
shell: "mv {{ item }}*.whl {{ item }}-{{ zuul.branch | replace('/', '-') }}.whl"
args:
chdir: "src/{{ zuul.project.canonical_name }}/dist"
with_items:
- "skyline_apiserver"
- name: Rename tar.gz files to branch specific name
shell: "mv {{ item }}*.tar.gz {{ item }}-{{ zuul.branch | replace('/', '-') }}.tar.gz"
args:
chdir: "src/{{ zuul.project.canonical_name }}/dist"
with_items:
- "skyline-apiserver"

4431
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +0,0 @@
[virtualenvs]
in-project = true

View File

@ -1,113 +0,0 @@
[tool.poetry]
name = "skyline-apiserver"
version = "0.1.0"
description = ""
license = "Apache-2.0"
authors = ["OpenStack <openstack-discuss@lists.openstack.org>"]
include = ["skyline_apiserver/db/alembic/alembic.ini"]
[tool.poetry.dependencies]
python = "^3.8"
fastapi = {extras = ["all"], version = "0.58.1"}
pydantic = "1.8.2"
PyYAML = "5.4.1"
immutables = "0.16"
uvicorn = {extras = ["standard"], version = "0.12.3"}
gunicorn = "20.1.0"
python-jose = "3.3.0"
alembic = "1.7.5"
httpx = "0.16.1"
sqlalchemy = "1.3.24"
databases = "0.4.3"
aiomysql = "0.0.21"
pymysql = "0.9.3"
aiosqlite = "0.17.0"
dnspython = "2.1.0"
loguru = "0.5.3"
click = "7.1.2"
jinja2 = "2.11.3"
markupsafe = "2.0.1"
python-keystoneclient = "3.21.0"
python-cinderclient = "5.0.2"
python-glanceclient = "2.17.1"
python-heatclient = "1.18.1"
python-neutronclient = "6.14.1"
python-novaclient = "15.1.1"
python-octaviaclient = "1.10.1"
osc-placement = "1.7.0"
keystoneauth1 = "3.17.4"
"oslo.policy" = "3.8.2"
skyline-console = "*"
[tool.poetry.dev-dependencies]
reno = {extras = ["sphinx"], version = "^3.5.0"}
openstackdocstheme = "^2.4.0"
Sphinx = "4.5.0"
isort = "5.9.3"
black = "21.9b0"
add-trailing-comma = "2.1.0"
flake8 = "3.9.2"
mypy = "0.910"
pytest = "6.2.5"
pytest-xdist = "2.4.0"
pytest-asyncio = "0.15.1"
pytest-cov = "2.12.1"
pytest-html = "3.1.1"
mimesis = "4.1.3"
asgi-lifespan = "1.0.1"
types-PyYAML = "5.4.10"
"oslo.log" = "4.8.0"
neutron-lib = "2.15.0"
skyline-console = "*"
[tool.poetry.scripts]
swagger-generator = 'skyline_apiserver.cmd.generate_swagger:main'
config-sample-generator = 'skyline_apiserver.cmd.generate_sample_config:main'
skyline-nginx-generator = 'skyline_apiserver.cmd.generate_nginx:main'
skyline-policy-manager = "skyline_apiserver.cmd.policy_manager:main"
[tool.pytest.ini_options]
minversion = "6.0"
addopts = "-v -s -p no:cacheprovider -n auto --cov=skyline_apiserver --cov-append --cov-report=term-missing --cov-report=html --html=test_results.html --self-contained-html"
testpaths = [
"skyline_apiserver/tests",
]
markers = [
"ddt(*args: TestData): Mark the test as a data-driven test."
]
[tool.black]
line-length = 98
target-version = ['py38']
include = '\.pyi?$'
exclude = '''
(
/(
\.eggs
| \.git
| \.hg
| \.mypy_cache
| \.tox
| \.venv
| _build
| buck-out
| build
| dist
)/
| exclude.py
)
'''
verbos = true
[tool.isort]
multi_line_output = 3
include_trailing_comma = true
force_grid_wrap = 0
use_parentheses = true
line_length = 98
reverse_relative = true
combine_as_imports = true
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

7
pytest.ini Normal file
View File

@ -0,0 +1,7 @@
[pytest]
addopts =
-v -s -p no:cacheprovider -n auto --cov=skyline_apiserver --cov-append --cov-report=term-missing --cov-report=html --html=test_results.html --self-contained-html
testpaths =
skyline_apiserver/tests
markers =
ddt(*args: TestData): Mark the test as a data-driven test.

32
requirements.txt Normal file
View File

@ -0,0 +1,32 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
pbr>=5.8.0 # Apache-2.0
fastapi<=0.58.1 # MIT
pydantic<=1.8.2 # MIT
uvicorn<=0.17.6 # BSD License (3 clause)
gunicorn<=20.1.0 # MIT
python-jose<=3.3.0 # MIT
databases<=0.5.5 # BSD License (3 clause)
aiomysql<=0.1.1 # MIT
aiosqlite<=0.17.0 # MIT
loguru<=0.5.3 # MIT
PyYAML>=5.4.1,<=6.0 # MIT
immutables>=0.16,<=0.17 # Apache-2.0
alembic>=1.7.5,<=1.7.7 # MIT
httpx>=0.16.1,<=0.22.0 # BSD License (3 clause)
SQLAlchemy>=1.3.24,<=1.4.36 # MIT
PyMySQL>=0.9.3,<=1.0.2 # MIT
dnspython>=2.1.0,<=2.2.1 # ISC
click>=7.1.2,<=8.1.3 # BSD License (3 clause)
jinja2>=2.11.3,<=3.1.2 # BSD License (3 clause)
h11<0.13,>=0.11 # MIT
MarkupSafe>=2.0.1,<=2.1.1 # BSD License (3 clause)
python-keystoneclient>=3.21.0,<=4.5.0 # Apache-2.0
python-cinderclient>=5.0.2,<=8.3.0 # Apache-2.0
python-glanceclient>=2.17.1,<=4.0.0 # Apache-2.0
python-neutronclient>=6.14.1,<=7.8.0 # Apache-2.0
python-novaclient>=15.1.1,<=18.0.0 # Apache-2.0
keystoneauth1>=3.17.4,<=4.6.0 # Apache-2.0
oslo.policy>=2.3.4,<=3.12.1 # Apache-2.0

47
setup.cfg Normal file
View File

@ -0,0 +1,47 @@
[metadata]
name = skyline-apiserver
summary = OpenStack Skyline APIServer
description_file =
author = OpenStack
author_email = openstack-discuss@lists.openstack.org
home_page = https://docs.openstack.org/skyline-apiserver/latest/
python_requires = >=3.8
classifier =
Environment :: OpenStack
Intended Audience :: Information Technology
Intended Audience :: System Administrators
License :: OSI Approved :: Apache Software License
Operating System :: POSIX :: Linux
Programming Language :: Python
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
project_urls:
Source=https://opendev.org/openstack/skyline-apiserver
Tracker=https://bugs.launchpad.net/skyline-apiserver
[files]
packages =
skyline_apiserver
[entry_points]
console_scripts =
skyline-swagger-generator = skyline_apiserver.cmd.generate_swagger:main
skyline-sample-config-generator = skyline_apiserver.cmd.generate_sample_config:main
skyline-nginx-generator = skyline_apiserver.cmd.generate_nginx:main
skyline-policy-manager = skyline_apiserver.cmd.policy_manager:main
[mypy]
show_column_numbers = true
show_error_context = true
ignore_missing_imports = true
follow_imports = skip
incremental = true
check_untyped_defs = true
warn_unused_ignores = true
show_error_codes = true
pretty = true
html_report = mypy-report
no_implicit_optional = true

19
setup.py Normal file
View File

@ -0,0 +1,19 @@
# Copyright 2022 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.
import setuptools
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
pbr=True)

View File

@ -25,7 +25,6 @@ from keystoneclient.client import Client as KeystoneClient
from keystoneclient.httpclient import HTTPClient
from neutronclient.v2_0.client import Client as NeutronClient
from novaclient.client import Client as NovaClient
from osc_placement.http import SessionClient as PlacementClient
from starlette.concurrency import run_in_threadpool
from skyline_apiserver import schemas
@ -169,14 +168,3 @@ async def neutron_client(
global_request_id=global_request_id,
)
return client
async def placement_client(
session: Session,
region: str,
version: str = constants.PLACEMENT_API_VERSION,
) -> HTTPClient:
endpoint = await get_endpoint(region, "placement", session=session)
ks_filter = {"service_type": "placement", "endpoint_override": endpoint}
client = PlacementClient(api_version=version, session=session, ks_filter=ks_filter)
return client

View File

@ -19,7 +19,6 @@ NOVA_API_VERSION = "2.79"
GLANCE_API_VERSION = "2"
CINDER_API_VERSION = "3.59"
NEUTRON_API_VERSION = "2.0"
PLACEMENT_API_VERSION = "1.36"
# request_id middleware will set this into openstack.global_request_id environ
INBOUND_HEADER = "X-Openstack-Request-Id"

21
test-requirements.txt Normal file
View File

@ -0,0 +1,21 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
reno<=3.5.0 # Apache-2.0
openstackdocstheme<=2.4.0 # Apache-2.0
Sphinx<=4.5.0 # BSD
isort<=5.9.3 # MIT
black<=22.3.0 # MIT
flake8<=3.9.2 # MIT
mypy>=0.910,<=0.950 # MIT
pytest>=6.2.5,<=7.1.2 # MIT
pytest-xdist>=2.4.0,<=2.5.0 # MIT
pytest-asyncio<=0.15.1 # Apache-2.0
pytest-cov<=2.12.1 # MIT
pytest-html<=3.1.1 # MPL 2.0
mimesis<=4.1.3 # MIT
asgi-lifespan<=1.0.1 # MIT
types-PyYAML<=5.4.10 # Apache-2.0
oslo.log<=5.0.0 # Apache-2.0
neutron-lib>=2.15.0,<=2.21.0 # Apache-2.0

19
tools/mypywrap.sh Normal file
View File

@ -0,0 +1,19 @@
#!/bin/sh
#
# A wrapper around mypy that allows us to specify what files to run 'mypy' type
# checks on. Intended to be invoked via tox:
#
# tox -e mypy
#
# Eventually this should go away once we have either converted everything or
# converted enough and ignored [1] the rest.
#
# [1] http://mypy.readthedocs.io/en/latest/config_file.html#per-module-flags
if [ $# -eq 0 ]; then
# if no arguments provided, use the standard converted lists
python -m mypy skyline_apiserver
else
# else test what the user asked us to
python -m mypy $@
fi

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# Install openstack service package
poetry run pip install --no-deps \
pip install --no-deps \
keystone \
openstack-placement \
nova \
@ -17,17 +17,17 @@ poetry run pip install --no-deps \
magnum
# Patch cinder
patch_path="$(poetry run python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/cinder/__init__.py"
patch_path="$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/cinder/__init__.py"
sed -i 's/\(.*eventlet.*\)/# \1/g' $patch_path
# Patch neutron
patch_path="$(poetry run python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/neutron/conf/policies/floatingip_pools.py"
patch_path="$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/neutron/conf/policies/floatingip_pools.py"
sed -i 's/admin/system/g' $patch_path
# Patch ironic
patch_path="$(poetry run python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/ironic/common/policy.py"
patch_path="$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/ironic/common/policy.py"
sed -i 's/\(.*lockutils.*\)/# \1/g' $patch_path
# Patch ironic_inspector
patch_path="$(poetry run python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/ironic_inspector/policy.py"
patch_path="$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/ironic_inspector/policy.py"
sed -i 's/\(.*lockutils.*\)/# \1/g' $patch_path

137
tox.ini
View File

@ -1,46 +1,127 @@
[tox]
minversion = 3.18.0
# python runtimes: https://governance.openstack.org/tc/reference/runtimes/ussuri.html
envlist = unittest-py38,lint,functional,package
skipsdist=true
requires = virtualenv>=20.4.2
skipsdist = True
# python runtimes: https://governance.openstack.org/tc/reference/project-testing-interface.html#tested-runtimes
envlist = pep8,py38,functional
# this allows tox to infer the base python from the environment name
# and override any basepython configured in this file
ignore_basepython_conflict=true
isolated_build=true
[testenv]
# Set default python version
basepython = python3
whitelist_externals =
make
poetry
rm
deps = poetry != 1.1.8
setenv = VIRTUAL_ENV={envdir}
PYTHONWARNINGS=default::DeprecationWarning
OS_STDOUT_CAPTURE=1
OS_STDERR_CAPTURE=1
usedevelop = True
[testenv:unittest-py38]
commands =
make install
make test
deps =
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
[testenv:lint]
commands =
make install
make lint
[testenv:functional]
whitelist_externals =
allowlist_externals =
find
bash
isort
echo
commands =
echo "TODO: Add functional test for skyline-apiserver"
passenv = *_proxy *_PROXY
[testenv:package]
[testenv:venv]
deps =
{[testenv]deps}
extras =
commands =
make package
{posargs}
[testenv:policyenv]
deps =
{[testenv]deps}
description =
Policy Env.
extras =
commands =
bash tools/post_install.sh
{posargs}
[testenv:mypy]
description =
Run type checks.
envdir = {toxworkdir}/shared
extras =
commands =
bash tools/mypywrap.sh {posargs}
[testenv:pep8]
description =
Run style checks.
envdir = {toxworkdir}/shared
deps =
{[testenv]deps}
extras =
commands =
; {[testenv:mypy]commands}
isort --check-only --diff skyline_apiserver
black --check --diff --color skyline_apiserver --line-length 98
flake8 {posargs} .
[testenv:py38]
description =
Run pytest.
envdir = {toxworkdir}/shared
deps =
{[testenv]deps}
extras =
commands =
pytest
[testenv:releasenotes]
description =
Generate release notes.
commands =
poetry install -vvv
rm -rf releasenotes/build
poetry run sphinx-build -W --keep-going -b html -j auto releasenotes/source releasenotes/build/html
sphinx-build -W --keep-going -b html -j auto releasenotes/source releasenotes/build/html
[testenv:genswagger]
description =
Generate swagger files.
commands =
skyline-swagger-generator -o docs/api/swagger.json
[testenv:genconfig]
description =
Generate config files.
commands =
skyline-sample-config-generator -o etc/skyline.yaml.sample
[testenv:gennginx]
description =
Generate nginx config files.
deps =
{[testenv]deps}
skyline-console
commands =
skyline-nginx-generator -o etc/nginx.conf
[testenv:functional]
commands =
echo "TODO: Add functional test for skyline-apiserver"
[testenv:pep8-format]
description =
Run code format.
envdir = {toxworkdir}/shared
deps =
{[testenv]deps}
extras =
commands =
isort skyline_apiserver
black skyline_apiserver --line-length 98
[flake8]
# E203 whitespace before ':'
extend-ignore = E203
max-line-length = 99
max-doc-length = 99
show-source = True
exclude = .venv,.git,.tox,dist,*lib/python*,*egg,build,releasenotes