update higgins with zun
All contents mentioning higgins are updated to zun using below 3 patterns: :%s/higgins/zun/g :%s/HIGGINS/ZUN/g :%s/Higgins/Zun/g Co-Authored-By: Hongbin Lu <hongbin.lu@huawei.com> Change-Id: I33a979aa01421524c1cff6fb5cc2b4023bf1fe84
This commit is contained in:
parent
507d781e7c
commit
5f2a016ea3
2
.gitignore
vendored
2
.gitignore
vendored
@ -58,4 +58,4 @@ ChangeLog
|
|||||||
releasenotes/build
|
releasenotes/build
|
||||||
|
|
||||||
# generated config file
|
# generated config file
|
||||||
etc/higgins/higgins.conf.sample
|
etc/zun/zun.conf.sample
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
|
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
|
||||||
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
|
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
|
||||||
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-45} \
|
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-45} \
|
||||||
${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./higgins/tests/unit} $LISTOPT $IDOPTION
|
${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./zun/tests/unit} $LISTOPT $IDOPTION
|
||||||
test_id_option=--load-list $IDFILE
|
test_id_option=--load-list $IDFILE
|
||||||
test_list_option=--list
|
test_list_option=--list
|
||||||
|
@ -14,4 +14,4 @@ Pull requests submitted through GitHub will be ignored.
|
|||||||
|
|
||||||
Bugs should be filed on Launchpad, not GitHub:
|
Bugs should be filed on Launchpad, not GitHub:
|
||||||
|
|
||||||
https://bugs.launchpad.net/higgins
|
https://bugs.launchpad.net/zun
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
Higgins Style Commandments
|
Zun Style Commandments
|
||||||
==========================
|
======================
|
||||||
|
|
||||||
Read the OpenStack Style Commandments http://docs.openstack.org/developer/hacking/
|
Read the OpenStack Style Commandments http://docs.openstack.org/developer/hacking/
|
||||||
|
|
||||||
Higgins Specific Commandments
|
Zun Specific Commandments
|
||||||
-----------------------------
|
-------------------------
|
||||||
|
|
||||||
- [M302] Change assertEqual(A is not None) by optimal assert like
|
- [M302] Change assertEqual(A is not None) by optimal assert like
|
||||||
assertIsNotNone(A).
|
assertIsNotNone(A).
|
||||||
|
14
README.rst
14
README.rst
@ -1,6 +1,6 @@
|
|||||||
=======
|
===
|
||||||
Higgins
|
Zun
|
||||||
=======
|
===
|
||||||
|
|
||||||
Container Management service for OpenStack
|
Container Management service for OpenStack
|
||||||
|
|
||||||
@ -9,11 +9,11 @@ Please fill here a long description which must be at least 3 lines wrapped on
|
|||||||
Note that this is a hard requirement.
|
Note that this is a hard requirement.
|
||||||
|
|
||||||
* Free software: Apache license
|
* Free software: Apache license
|
||||||
* Documentation: http://docs.openstack.org/developer/higgins
|
* Documentation: http://docs.openstack.org/developer/zun
|
||||||
* Source: http://git.openstack.org/cgit/openstack/higgins
|
* Source: http://git.openstack.org/cgit/openstack/higgins
|
||||||
* Bugs: http://bugs.launchpad.net/python-higgins
|
* Bugs: http://bugs.launchpad.net/zun
|
||||||
* Blueprints:** https://blueprints.launchpad.net/higgins
|
* Blueprints:** https://blueprints.launchpad.net/zun
|
||||||
* REST Client:** http://git.openstack.org/cgit/openstack/python-higginsclient
|
* REST Client:** http://git.openstack.org/cgit/openstack/python-zunclient
|
||||||
|
|
||||||
Features
|
Features
|
||||||
--------
|
--------
|
||||||
|
@ -2,18 +2,18 @@
|
|||||||
DevStack Integration
|
DevStack Integration
|
||||||
====================
|
====================
|
||||||
|
|
||||||
This directory contains the files necessary to integrate higgins with devstack.
|
This directory contains the files necessary to integrate zun with devstack.
|
||||||
|
|
||||||
Refer the quickstart guide at
|
Refer the quickstart guide at
|
||||||
https://github.com/openstack/higgins/blob/master/doc/source/dev/quickstart.rst
|
https://github.com/openstack/higgins/blob/master/doc/source/dev/quickstart.rst
|
||||||
for more information on using devstack and higgins.
|
for more information on using devstack and zun.
|
||||||
|
|
||||||
To install higgins into devstack, add the following settings to enable the
|
To install zun into devstack, add the following settings to enable the
|
||||||
higgins plugin::
|
zun plugin::
|
||||||
|
|
||||||
cat > /opt/stack/devstack/local.conf << END
|
cat > /opt/stack/devstack/local.conf << END
|
||||||
[[local|localrc]]
|
[[local|localrc]]
|
||||||
enable_plugin higgins https://git.openstack.org/openstack/higgins master
|
enable_plugin zun https://git.openstack.org/openstack/higgins master
|
||||||
END
|
END
|
||||||
|
|
||||||
Then run devstack normally::
|
Then run devstack normally::
|
||||||
|
@ -1,268 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# lib/higgins
|
|
||||||
# Functions to control the configuration and operation of the **higgins** service
|
|
||||||
|
|
||||||
# Dependencies:
|
|
||||||
#
|
|
||||||
# - ``functions`` file
|
|
||||||
# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
|
|
||||||
# - ``SERVICE_{TENANT_NAME|PASSWORD}`` must be defined
|
|
||||||
|
|
||||||
# ``stack.sh`` calls the entry points in this order:
|
|
||||||
#
|
|
||||||
# - install_higgins
|
|
||||||
# - configure_higgins
|
|
||||||
# - create_higgins_conf
|
|
||||||
# - create_higgins_accounts
|
|
||||||
# - init_higgins
|
|
||||||
# - start_higgins
|
|
||||||
# - stop_higgins
|
|
||||||
# - cleanup_higgins
|
|
||||||
|
|
||||||
# Save trace setting
|
|
||||||
XTRACE=$(set +o | grep xtrace)
|
|
||||||
set +o xtrace
|
|
||||||
|
|
||||||
|
|
||||||
# Defaults
|
|
||||||
# --------
|
|
||||||
|
|
||||||
# Set up default directories
|
|
||||||
HIGGINS_REPO=${HIGGINS_REPO:-${GIT_BASE}/openstack/higgins.git}
|
|
||||||
HIGGINS_BRANCH=${HIGGINS_BRANCH:-master}
|
|
||||||
HIGGINS_DIR=$DEST/higgins
|
|
||||||
|
|
||||||
HIGGINS_STATE_PATH=${HIGGINS_STATE_PATH:=$DATA_DIR/higgins}
|
|
||||||
HIGGINS_AUTH_CACHE_DIR=${HIGGINS_AUTH_CACHE_DIR:-/var/cache/higgins}
|
|
||||||
|
|
||||||
HIGGINS_CONF_DIR=/etc/higgins
|
|
||||||
HIGGINS_CONF=$HIGGINS_CONF_DIR/higgins.conf
|
|
||||||
HIGGINS_POLICY_JSON=$HIGGINS_CONF_DIR/policy.json
|
|
||||||
HIGGINS_API_PASTE=$HIGGINS_CONF_DIR/api-paste.ini
|
|
||||||
|
|
||||||
if is_ssl_enabled_service "higgins" || is_service_enabled tls-proxy; then
|
|
||||||
HIGGINS_SERVICE_PROTOCOL="https"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Public facing bits
|
|
||||||
HIGGINS_SERVICE_HOST=${HIGGINS_SERVICE_HOST:-$HOST_IP}
|
|
||||||
HIGGINS_SERVICE_PORT=${HIGGINS_SERVICE_PORT:-9517}
|
|
||||||
HIGGINS_SERVICE_PORT_INT=${HIGGINS_SERVICE_PORT_INT:-19517}
|
|
||||||
HIGGINS_SERVICE_PROTOCOL=${HIGGINS_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
|
|
||||||
|
|
||||||
HIGGINS_TRUSTEE_DOMAIN_ADMIN_PASSWORD=${HIGGINS_TRUSTEE_DOMAIN_ADMIN_PASSWORD:-secret}
|
|
||||||
|
|
||||||
# Support entry points installation of console scripts
|
|
||||||
if [[ -d $HIGGINS_DIR/bin ]]; then
|
|
||||||
HIGGINS_BIN_DIR=$HIGGINS_DIR/bin
|
|
||||||
else
|
|
||||||
HIGGINS_BIN_DIR=$(get_python_exec_prefix)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Functions
|
|
||||||
# ---------
|
|
||||||
|
|
||||||
# Test if any higgins services are enabled
|
|
||||||
# is_higgins_enabled
|
|
||||||
function is_higgins_enabled {
|
|
||||||
[[ ,${ENABLED_SERVICES} =~ ,"higgins-" ]] && return 0
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
# cleanup_higgins() - Remove residual data files, anything left over from previous
|
|
||||||
# runs that a clean run would need to clean up
|
|
||||||
function cleanup_higgins {
|
|
||||||
sudo rm -rf $HIGGINS_STATE_PATH $HIGGINS_AUTH_CACHE_DIR
|
|
||||||
}
|
|
||||||
|
|
||||||
# configure_higgins() - Set config files, create data dirs, etc
|
|
||||||
function configure_higgins {
|
|
||||||
# Put config files in ``/etc/higgins`` for everyone to find
|
|
||||||
if [[ ! -d $HIGGINS_CONF_DIR ]]; then
|
|
||||||
sudo mkdir -p $HIGGINS_CONF_DIR
|
|
||||||
sudo chown $STACK_USER $HIGGINS_CONF_DIR
|
|
||||||
fi
|
|
||||||
|
|
||||||
install_default_policy higgins
|
|
||||||
# Rebuild the config file from scratch
|
|
||||||
create_higgins_conf
|
|
||||||
|
|
||||||
create_api_paste_conf
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# create_higgins_accounts() - Set up common required HIGGINS accounts
|
|
||||||
#
|
|
||||||
# Project User Roles
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
# SERVICE_PROJECT_NAME higgins service
|
|
||||||
function create_higgins_accounts {
|
|
||||||
|
|
||||||
create_service_user "higgins" "admin"
|
|
||||||
|
|
||||||
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
|
|
||||||
|
|
||||||
local higgins_service=$(get_or_create_service "higgins" \
|
|
||||||
"container" "Container As Service")
|
|
||||||
get_or_create_endpoint $higgins_service \
|
|
||||||
"$REGION_NAME" \
|
|
||||||
"$HIGGINS_SERVICE_PROTOCOL://$HIGGINS_SERVICE_HOST:$HIGGINS_SERVICE_PORT/v1" \
|
|
||||||
"$HIGGINS_SERVICE_PROTOCOL://$HIGGINS_SERVICE_HOST:$HIGGINS_SERVICE_PORT/v1" \
|
|
||||||
"$HIGGINS_SERVICE_PROTOCOL://$HIGGINS_SERVICE_HOST:$HIGGINS_SERVICE_PORT/v1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# create_higgins_conf() - Create a new higgins.conf file
|
|
||||||
function create_higgins_conf {
|
|
||||||
|
|
||||||
# (Re)create ``higgins.conf``
|
|
||||||
rm -f $HIGGINS_CONF
|
|
||||||
iniset $HIGGINS_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
|
|
||||||
iniset $HIGGINS_CONF oslo_messaging_rabbit rabbit_userid $RABBIT_USERID
|
|
||||||
iniset $HIGGINS_CONF oslo_messaging_rabbit rabbit_password $RABBIT_PASSWORD
|
|
||||||
iniset $HIGGINS_CONF oslo_messaging_rabbit rabbit_host $RABBIT_HOST
|
|
||||||
|
|
||||||
iniset $HIGGINS_CONF database connection `database_connection_url higgins`
|
|
||||||
iniset $HIGGINS_CONF api host "$HIGGINS_SERVICE_HOST"
|
|
||||||
iniset $HIGGINS_CONF api port "$HIGGINS_SERVICE_PORT"
|
|
||||||
|
|
||||||
iniset $HIGGINS_CONF oslo_policy policy_file $HIGGINS_POLICY_JSON
|
|
||||||
|
|
||||||
iniset $HIGGINS_CONF keystone_auth auth_type password
|
|
||||||
iniset $HIGGINS_CONF keystone_auth username higgins
|
|
||||||
iniset $HIGGINS_CONF keystone_auth password $SERVICE_PASSWORD
|
|
||||||
iniset $HIGGINS_CONF keystone_auth project_name $SERVICE_PROJECT_NAME
|
|
||||||
iniset $HIGGINS_CONF keystone_auth project_domain_id default
|
|
||||||
iniset $HIGGINS_CONF keystone_auth user_domain_id default
|
|
||||||
|
|
||||||
# FIXME(pauloewerton): keystone_authtoken section is deprecated. Remove it
|
|
||||||
# after deprecation period.
|
|
||||||
iniset $HIGGINS_CONF keystone_authtoken admin_user higgins
|
|
||||||
iniset $HIGGINS_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
|
|
||||||
iniset $HIGGINS_CONF keystone_authtoken admin_tenant_name $SERVICE_PROJECT_NAME
|
|
||||||
|
|
||||||
configure_auth_token_middleware $HIGGINS_CONF higgins $HIGGINS_AUTH_CACHE_DIR
|
|
||||||
|
|
||||||
iniset $HIGGINS_CONF keystone_auth auth_url $KEYSTONE_SERVICE_URI/v3
|
|
||||||
iniset $HIGGINS_CONF keystone_authtoken auth_uri \
|
|
||||||
${KEYSTONE_SERVICE_PROTOCOL}://${HOST_IP}:${KEYSTONE_SERVICE_PORT}/v3
|
|
||||||
iniset $HIGGINS_CONF keystone_authtoken auth_version v3
|
|
||||||
|
|
||||||
if is_fedora || is_suse; then
|
|
||||||
# higgins defaults to /usr/local/bin, but fedora and suse pip like to
|
|
||||||
# install things in /usr/bin
|
|
||||||
iniset $HIGGINS_CONF DEFAULT bindir "/usr/bin"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$HIGGINS_STATE_PATH" ]; then
|
|
||||||
iniset $HIGGINS_CONF DEFAULT state_path "$HIGGINS_STATE_PATH"
|
|
||||||
iniset $HIGGINS_CONF oslo_concurrency lock_path "$HIGGINS_STATE_PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$SYSLOG" != "False" ]; then
|
|
||||||
iniset $HIGGINS_CONF DEFAULT use_syslog "True"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Format logging
|
|
||||||
if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then
|
|
||||||
setup_colorized_logging $HIGGINS_CONF DEFAULT
|
|
||||||
else
|
|
||||||
# Show user_name and project_name instead of user_id and project_id
|
|
||||||
iniset $HIGGINS_CONF DEFAULT logging_context_format_string "%(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s %(user_name)s %(project_name)s] %(instance)s%(message)s"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Register SSL certificates if provided
|
|
||||||
if is_ssl_enabled_service higgins; then
|
|
||||||
ensure_certificates higgins
|
|
||||||
|
|
||||||
iniset $HIGGINS_CONF DEFAULT ssl_cert_file "$HIGGINS_SSL_CERT"
|
|
||||||
iniset $HIGGINS_CONF DEFAULT ssl_key_file "$HIGGINS_SSL_KEY"
|
|
||||||
|
|
||||||
iniset $HIGGINS_CONF DEFAULT enabled_ssl_apis "$HIGGINS_ENABLED_APIS"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_api_paste_conf {
|
|
||||||
# copy api_paste.ini
|
|
||||||
cp $HIGGINS_DIR/etc/higgins/api-paste.ini $HIGGINS_API_PASTE
|
|
||||||
}
|
|
||||||
|
|
||||||
# create_higgins_cache_dir() - Part of the init_HIGGINS() process
|
|
||||||
function create_higgins_cache_dir {
|
|
||||||
# Create cache dir
|
|
||||||
sudo mkdir -p $HIGGINS_AUTH_CACHE_DIR
|
|
||||||
sudo chown $STACK_USER $HIGGINS_AUTH_CACHE_DIR
|
|
||||||
rm -f $HIGGINS_AUTH_CACHE_DIR/*
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# init_higgins() - Initialize databases, etc.
|
|
||||||
function init_higgins {
|
|
||||||
# Only do this step once on the API node for an entire cluster.
|
|
||||||
if is_service_enabled $DATABASE_BACKENDS && is_service_enabled higgins-api; then
|
|
||||||
# (Re)create higgins database
|
|
||||||
recreate_database higgins
|
|
||||||
|
|
||||||
# Migrate higgins database
|
|
||||||
$HIGGINS_BIN_DIR/higgins-db-manage upgrade
|
|
||||||
fi
|
|
||||||
create_higgins_cache_dir
|
|
||||||
}
|
|
||||||
|
|
||||||
# install_higginsclient() - Collect source and prepare
|
|
||||||
function install_higginsclient {
|
|
||||||
if use_library_from_git "python-higginsclient"; then
|
|
||||||
echo "we don't have CLI yet.."
|
|
||||||
#git_clone_by_name "python-higginsclient"
|
|
||||||
#setup_dev_lib "python-higginsclient"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# install_higgins() - Collect source and prepare
|
|
||||||
function install_higgins {
|
|
||||||
git_clone $HIGGINS_REPO $HIGGINS_DIR $HIGGINS_BRANCH
|
|
||||||
setup_develop $HIGGINS_DIR
|
|
||||||
}
|
|
||||||
|
|
||||||
# start_higgins_api() - Start the API process ahead of other things
|
|
||||||
function start_higgins_api {
|
|
||||||
# Get right service port for testing
|
|
||||||
local service_port=$HIGGINS_SERVICE_PORT
|
|
||||||
local service_protocol=$HIGGINS_SERVICE_PROTOCOL
|
|
||||||
if is_service_enabled tls-proxy; then
|
|
||||||
service_port=$HIGGINS_SERVICE_PORT_INT
|
|
||||||
service_protocol="http"
|
|
||||||
fi
|
|
||||||
|
|
||||||
run_process higgins-api "$HIGGINS_BIN_DIR/higgins-api"
|
|
||||||
echo "Waiting for higgins-api to start..."
|
|
||||||
if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$HIGGINS_SERVICE_HOST:$service_port; then
|
|
||||||
die $LINENO "higgins-api did not start"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start proxies if enabled
|
|
||||||
if is_service_enabled tls-proxy; then
|
|
||||||
start_tls_proxy '*' $HIGGINS_SERVICE_PORT $HIGGINS_SERVICE_HOST $HIGGINS_SERVICE_PORT_INT &
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# start_higgins() - Start running processes, including screen
|
|
||||||
function start_higgins {
|
|
||||||
|
|
||||||
# ``run_process`` checks ``is_service_enabled``, it is not needed here
|
|
||||||
start_higgins_api
|
|
||||||
run_process higgins-conductor "$HIGGINS_BIN_DIR/higgins-conductor"
|
|
||||||
}
|
|
||||||
|
|
||||||
# stop_higgins() - Stop running processes (non-screen)
|
|
||||||
function stop_higgins {
|
|
||||||
for serv in higgins-api higgins-conductor; do
|
|
||||||
stop_process $serv
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Restore xtrace
|
|
||||||
$XTRACE
|
|
268
devstack/lib/zun
Normal file
268
devstack/lib/zun
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# lib/zun
|
||||||
|
# Functions to control the configuration and operation of the **zun** service
|
||||||
|
|
||||||
|
# Dependencies:
|
||||||
|
#
|
||||||
|
# - ``functions`` file
|
||||||
|
# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
|
||||||
|
# - ``SERVICE_{TENANT_NAME|PASSWORD}`` must be defined
|
||||||
|
|
||||||
|
# ``stack.sh`` calls the entry points in this order:
|
||||||
|
#
|
||||||
|
# - install_zun
|
||||||
|
# - configure_zun
|
||||||
|
# - create_zun_conf
|
||||||
|
# - create_zun_accounts
|
||||||
|
# - init_zun
|
||||||
|
# - start_zun
|
||||||
|
# - stop_zun
|
||||||
|
# - cleanup_zun
|
||||||
|
|
||||||
|
# Save trace setting
|
||||||
|
XTRACE=$(set +o | grep xtrace)
|
||||||
|
set +o xtrace
|
||||||
|
|
||||||
|
|
||||||
|
# Defaults
|
||||||
|
# --------
|
||||||
|
|
||||||
|
# Set up default directories
|
||||||
|
ZUN_REPO=${ZUN_REPO:-${GIT_BASE}/openstack/higgins.git}
|
||||||
|
ZUN_BRANCH=${ZUN_BRANCH:-master}
|
||||||
|
ZUN_DIR=$DEST/higgins
|
||||||
|
|
||||||
|
ZUN_STATE_PATH=${ZUN_STATE_PATH:=$DATA_DIR/zun}
|
||||||
|
ZUN_AUTH_CACHE_DIR=${ZUN_AUTH_CACHE_DIR:-/var/cache/zun}
|
||||||
|
|
||||||
|
ZUN_CONF_DIR=/etc/zun
|
||||||
|
ZUN_CONF=$ZUN_CONF_DIR/zun.conf
|
||||||
|
ZUN_POLICY_JSON=$ZUN_CONF_DIR/policy.json
|
||||||
|
ZUN_API_PASTE=$ZUN_CONF_DIR/api-paste.ini
|
||||||
|
|
||||||
|
if is_ssl_enabled_service "zun" || is_service_enabled tls-proxy; then
|
||||||
|
ZUN_SERVICE_PROTOCOL="https"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Public facing bits
|
||||||
|
ZUN_SERVICE_HOST=${ZUN_SERVICE_HOST:-$HOST_IP}
|
||||||
|
ZUN_SERVICE_PORT=${ZUN_SERVICE_PORT:-9517}
|
||||||
|
ZUN_SERVICE_PORT_INT=${ZUN_SERVICE_PORT_INT:-19517}
|
||||||
|
ZUN_SERVICE_PROTOCOL=${ZUN_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
|
||||||
|
|
||||||
|
ZUN_TRUSTEE_DOMAIN_ADMIN_PASSWORD=${ZUN_TRUSTEE_DOMAIN_ADMIN_PASSWORD:-secret}
|
||||||
|
|
||||||
|
# Support entry points installation of console scripts
|
||||||
|
if [[ -d $ZUN_DIR/bin ]]; then
|
||||||
|
ZUN_BIN_DIR=$ZUN_DIR/bin
|
||||||
|
else
|
||||||
|
ZUN_BIN_DIR=$(get_python_exec_prefix)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
# ---------
|
||||||
|
|
||||||
|
# Test if any zun services are enabled
|
||||||
|
# is_zun_enabled
|
||||||
|
function is_zun_enabled {
|
||||||
|
[[ ,${ENABLED_SERVICES} =~ ,"zun-" ]] && return 0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
# cleanup_zun() - Remove residual data files, anything left over from previous
|
||||||
|
# runs that a clean run would need to clean up
|
||||||
|
function cleanup_zun {
|
||||||
|
sudo rm -rf $ZUN_STATE_PATH $ZUN_AUTH_CACHE_DIR
|
||||||
|
}
|
||||||
|
|
||||||
|
# configure_zun() - Set config files, create data dirs, etc
|
||||||
|
function configure_zun {
|
||||||
|
# Put config files in ``/etc/zun`` for everyone to find
|
||||||
|
if [[ ! -d $ZUN_CONF_DIR ]]; then
|
||||||
|
sudo mkdir -p $ZUN_CONF_DIR
|
||||||
|
sudo chown $STACK_USER $ZUN_CONF_DIR
|
||||||
|
fi
|
||||||
|
|
||||||
|
install_default_policy zun
|
||||||
|
# Rebuild the config file from scratch
|
||||||
|
create_zun_conf
|
||||||
|
|
||||||
|
create_api_paste_conf
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# create_zun_accounts() - Set up common required ZUN accounts
|
||||||
|
#
|
||||||
|
# Project User Roles
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# SERVICE_PROJECT_NAME zun service
|
||||||
|
function create_zun_accounts {
|
||||||
|
|
||||||
|
create_service_user "zun" "admin"
|
||||||
|
|
||||||
|
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
|
||||||
|
|
||||||
|
local zun_service=$(get_or_create_service "zun" \
|
||||||
|
"container" "Container As Service")
|
||||||
|
get_or_create_endpoint $zun_service \
|
||||||
|
"$REGION_NAME" \
|
||||||
|
"$ZUN_SERVICE_PROTOCOL://$ZUN_SERVICE_HOST:$ZUN_SERVICE_PORT/v1" \
|
||||||
|
"$ZUN_SERVICE_PROTOCOL://$ZUN_SERVICE_HOST:$ZUN_SERVICE_PORT/v1" \
|
||||||
|
"$ZUN_SERVICE_PROTOCOL://$ZUN_SERVICE_HOST:$ZUN_SERVICE_PORT/v1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# create_zun_conf() - Create a new zun.conf file
|
||||||
|
function create_zun_conf {
|
||||||
|
|
||||||
|
# (Re)create ``zun.conf``
|
||||||
|
rm -f $ZUN_CONF
|
||||||
|
iniset $ZUN_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
|
||||||
|
iniset $ZUN_CONF oslo_messaging_rabbit rabbit_userid $RABBIT_USERID
|
||||||
|
iniset $ZUN_CONF oslo_messaging_rabbit rabbit_password $RABBIT_PASSWORD
|
||||||
|
iniset $ZUN_CONF oslo_messaging_rabbit rabbit_host $RABBIT_HOST
|
||||||
|
|
||||||
|
iniset $ZUN_CONF database connection `database_connection_url zun`
|
||||||
|
iniset $ZUN_CONF api host "$ZUN_SERVICE_HOST"
|
||||||
|
iniset $ZUN_CONF api port "$ZUN_SERVICE_PORT"
|
||||||
|
|
||||||
|
iniset $ZUN_CONF oslo_policy policy_file $ZUN_POLICY_JSON
|
||||||
|
|
||||||
|
iniset $ZUN_CONF keystone_auth auth_type password
|
||||||
|
iniset $ZUN_CONF keystone_auth username zun
|
||||||
|
iniset $ZUN_CONF keystone_auth password $SERVICE_PASSWORD
|
||||||
|
iniset $ZUN_CONF keystone_auth project_name $SERVICE_PROJECT_NAME
|
||||||
|
iniset $ZUN_CONF keystone_auth project_domain_id default
|
||||||
|
iniset $ZUN_CONF keystone_auth user_domain_id default
|
||||||
|
|
||||||
|
# FIXME(pauloewerton): keystone_authtoken section is deprecated. Remove it
|
||||||
|
# after deprecation period.
|
||||||
|
iniset $ZUN_CONF keystone_authtoken admin_user zun
|
||||||
|
iniset $ZUN_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
|
||||||
|
iniset $ZUN_CONF keystone_authtoken admin_tenant_name $SERVICE_PROJECT_NAME
|
||||||
|
|
||||||
|
configure_auth_token_middleware $ZUN_CONF zun $ZUN_AUTH_CACHE_DIR
|
||||||
|
|
||||||
|
iniset $ZUN_CONF keystone_auth auth_url $KEYSTONE_SERVICE_URI/v3
|
||||||
|
iniset $ZUN_CONF keystone_authtoken auth_uri \
|
||||||
|
${KEYSTONE_SERVICE_PROTOCOL}://${HOST_IP}:${KEYSTONE_SERVICE_PORT}/v3
|
||||||
|
iniset $ZUN_CONF keystone_authtoken auth_version v3
|
||||||
|
|
||||||
|
if is_fedora || is_suse; then
|
||||||
|
# zun defaults to /usr/local/bin, but fedora and suse pip like to
|
||||||
|
# install things in /usr/bin
|
||||||
|
iniset $ZUN_CONF DEFAULT bindir "/usr/bin"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ZUN_STATE_PATH" ]; then
|
||||||
|
iniset $ZUN_CONF DEFAULT state_path "$ZUN_STATE_PATH"
|
||||||
|
iniset $ZUN_CONF oslo_concurrency lock_path "$ZUN_STATE_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYSLOG" != "False" ]; then
|
||||||
|
iniset $ZUN_CONF DEFAULT use_syslog "True"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Format logging
|
||||||
|
if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then
|
||||||
|
setup_colorized_logging $ZUN_CONF DEFAULT
|
||||||
|
else
|
||||||
|
# Show user_name and project_name instead of user_id and project_id
|
||||||
|
iniset $ZUN_CONF DEFAULT logging_context_format_string "%(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s %(user_name)s %(project_name)s] %(instance)s%(message)s"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Register SSL certificates if provided
|
||||||
|
if is_ssl_enabled_service zun; then
|
||||||
|
ensure_certificates zun
|
||||||
|
|
||||||
|
iniset $ZUN_CONF DEFAULT ssl_cert_file "$ZUN_SSL_CERT"
|
||||||
|
iniset $ZUN_CONF DEFAULT ssl_key_file "$ZUN_SSL_KEY"
|
||||||
|
|
||||||
|
iniset $ZUN_CONF DEFAULT enabled_ssl_apis "$ZUN_ENABLED_APIS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_api_paste_conf {
|
||||||
|
# copy api_paste.ini
|
||||||
|
cp $ZUN_DIR/etc/zun/api-paste.ini $ZUN_API_PASTE
|
||||||
|
}
|
||||||
|
|
||||||
|
# create_zun_cache_dir() - Part of the init_ZUN() process
|
||||||
|
function create_zun_cache_dir {
|
||||||
|
# Create cache dir
|
||||||
|
sudo mkdir -p $ZUN_AUTH_CACHE_DIR
|
||||||
|
sudo chown $STACK_USER $ZUN_AUTH_CACHE_DIR
|
||||||
|
rm -f $ZUN_AUTH_CACHE_DIR/*
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# init_zun() - Initialize databases, etc.
|
||||||
|
function init_zun {
|
||||||
|
# Only do this step once on the API node for an entire cluster.
|
||||||
|
if is_service_enabled $DATABASE_BACKENDS && is_service_enabled zun-api; then
|
||||||
|
# (Re)create zun database
|
||||||
|
recreate_database zun
|
||||||
|
|
||||||
|
# Migrate zun database
|
||||||
|
$ZUN_BIN_DIR/zun-db-manage upgrade
|
||||||
|
fi
|
||||||
|
create_zun_cache_dir
|
||||||
|
}
|
||||||
|
|
||||||
|
# install_zunclient() - Collect source and prepare
|
||||||
|
function install_zunclient {
|
||||||
|
if use_library_from_git "python-zunclient"; then
|
||||||
|
echo "we don't have CLI yet.."
|
||||||
|
#git_clone_by_name "python-zunclient"
|
||||||
|
#setup_dev_lib "python-zunclient"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# install_zun() - Collect source and prepare
|
||||||
|
function install_zun {
|
||||||
|
git_clone $ZUN_REPO $ZUN_DIR $ZUN_BRANCH
|
||||||
|
setup_develop $ZUN_DIR
|
||||||
|
}
|
||||||
|
|
||||||
|
# start_zun_api() - Start the API process ahead of other things
|
||||||
|
function start_zun_api {
|
||||||
|
# Get right service port for testing
|
||||||
|
local service_port=$ZUN_SERVICE_PORT
|
||||||
|
local service_protocol=$ZUN_SERVICE_PROTOCOL
|
||||||
|
if is_service_enabled tls-proxy; then
|
||||||
|
service_port=$ZUN_SERVICE_PORT_INT
|
||||||
|
service_protocol="http"
|
||||||
|
fi
|
||||||
|
|
||||||
|
run_process zun-api "$ZUN_BIN_DIR/zun-api"
|
||||||
|
echo "Waiting for zun-api to start..."
|
||||||
|
if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$ZUN_SERVICE_HOST:$service_port; then
|
||||||
|
die $LINENO "zun-api did not start"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start proxies if enabled
|
||||||
|
if is_service_enabled tls-proxy; then
|
||||||
|
start_tls_proxy '*' $ZUN_SERVICE_PORT $ZUN_SERVICE_HOST $ZUN_SERVICE_PORT_INT &
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# start_zun() - Start running processes, including screen
|
||||||
|
function start_zun {
|
||||||
|
|
||||||
|
# ``run_process`` checks ``is_service_enabled``, it is not needed here
|
||||||
|
start_zun_api
|
||||||
|
run_process zun-conductor "$ZUN_BIN_DIR/zun-conductor"
|
||||||
|
}
|
||||||
|
|
||||||
|
# stop_zun() - Stop running processes (non-screen)
|
||||||
|
function stop_zun {
|
||||||
|
for serv in zun-api zun-conductor; do
|
||||||
|
stop_process $serv
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Restore xtrace
|
||||||
|
$XTRACE
|
@ -1,47 +1,47 @@
|
|||||||
# higgins - Devstack extras script to install higgins
|
# zun - Devstack extras script to install zun
|
||||||
|
|
||||||
# Save trace setting
|
# Save trace setting
|
||||||
XTRACE=$(set +o | grep xtrace)
|
XTRACE=$(set +o | grep xtrace)
|
||||||
set -o xtrace
|
set -o xtrace
|
||||||
|
|
||||||
echo_summary "higgins's plugin.sh was called..."
|
echo_summary "zun's plugin.sh was called..."
|
||||||
source $DEST/higgins/devstack/lib/higgins
|
source $DEST/higgins/devstack/lib/zun
|
||||||
(set -o posix; set)
|
(set -o posix; set)
|
||||||
|
|
||||||
if is_service_enabled higgins-api higgins-conductor; then
|
if is_service_enabled zun-api zun-conductor; then
|
||||||
if [[ "$1" == "stack" && "$2" == "install" ]]; then
|
if [[ "$1" == "stack" && "$2" == "install" ]]; then
|
||||||
echo_summary "Installing higgins"
|
echo_summary "Installing zun"
|
||||||
install_higgins
|
install_zun
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
# LIBS_FROM_GIT="${LIBS_FROM_GIT},python-higginsclient"
|
# LIBS_FROM_GIT="${LIBS_FROM_GIT},python-zunclient"
|
||||||
# install_higginsclient
|
# install_zunclient
|
||||||
|
|
||||||
cleanup_higgins
|
cleanup_zun
|
||||||
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
|
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
|
||||||
echo_summary "Configuring higgins"
|
echo_summary "Configuring zun"
|
||||||
configure_higgins
|
configure_zun
|
||||||
|
|
||||||
if is_service_enabled key; then
|
if is_service_enabled key; then
|
||||||
create_higgins_accounts
|
create_zun_accounts
|
||||||
fi
|
fi
|
||||||
|
|
||||||
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
|
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
|
||||||
# Initialize higgins
|
# Initialize zun
|
||||||
init_higgins
|
init_zun
|
||||||
|
|
||||||
# Start the higgins API and higgins conductor
|
# Start the zun API and zun conductor
|
||||||
echo_summary "Starting higgins"
|
echo_summary "Starting zun"
|
||||||
start_higgins
|
start_zun
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$1" == "unstack" ]]; then
|
if [[ "$1" == "unstack" ]]; then
|
||||||
stop_higgins
|
stop_zun
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$1" == "clean" ]]; then
|
if [[ "$1" == "clean" ]]; then
|
||||||
cleanup_higgins
|
cleanup_zun
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -15,6 +15,6 @@
|
|||||||
# PHYSICAL_NETWORK=public
|
# PHYSICAL_NETWORK=public
|
||||||
# OVS_PHYSICAL_BRIDGE=br-ex
|
# OVS_PHYSICAL_BRIDGE=br-ex
|
||||||
|
|
||||||
# Enable Higgins services
|
# Enable Zun services
|
||||||
enable_service higgins-api
|
enable_service zun-api
|
||||||
enable_service higgins-conductor
|
enable_service zun-conductor
|
||||||
|
@ -36,7 +36,7 @@ source_suffix = '.rst'
|
|||||||
master_doc = 'index'
|
master_doc = 'index'
|
||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = u'higgins'
|
project = u'zun'
|
||||||
copyright = u'2013, OpenStack Foundation'
|
copyright = u'2013, OpenStack Foundation'
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
Developer Quick-Start
|
Developer Quick-Start
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
This is a quick walkthrough to get you started developing code for Higgins.
|
This is a quick walkthrough to get you started developing code for Zun.
|
||||||
This assumes you are already familiar with submitting code reviews to
|
This assumes you are already familiar with submitting code reviews to
|
||||||
an OpenStack project.
|
an OpenStack project.
|
||||||
|
|
||||||
@ -36,14 +36,14 @@ upgrade it individually, if you need to::
|
|||||||
|
|
||||||
sudo pip install -U virtualenv
|
sudo pip install -U virtualenv
|
||||||
|
|
||||||
Higgins source code should be pulled directly from git::
|
Zun source code should be pulled directly from git::
|
||||||
|
|
||||||
# from your home or source directory
|
# from your home or source directory
|
||||||
cd ~
|
cd ~
|
||||||
git clone https://git.openstack.org/openstack/higgins
|
git clone https://git.openstack.org/openstack/higgins
|
||||||
cd higgins
|
cd zun
|
||||||
|
|
||||||
All unit tests should be run using tox. To run Higgins's entire test suite::
|
All unit tests should be run using tox. To run Zun's entire test suite::
|
||||||
|
|
||||||
# run all tests (unit and pep8)
|
# run all tests (unit and pep8)
|
||||||
tox
|
tox
|
||||||
@ -86,7 +86,7 @@ required OpenStack services::
|
|||||||
SERVICE_TOKEN=password
|
SERVICE_TOKEN=password
|
||||||
SERVICE_PASSWORD=password
|
SERVICE_PASSWORD=password
|
||||||
ADMIN_PASSWORD=password
|
ADMIN_PASSWORD=password
|
||||||
# higgins requires the following to be set correctly
|
# zun requires the following to be set correctly
|
||||||
PUBLIC_INTERFACE=eth1
|
PUBLIC_INTERFACE=eth1
|
||||||
END
|
END
|
||||||
|
|
||||||
@ -109,79 +109,79 @@ script::
|
|||||||
|
|
||||||
source /opt/stack/devstack/openrc admin admin
|
source /opt/stack/devstack/openrc admin admin
|
||||||
|
|
||||||
Create a database in MySQL for higgins::
|
Create a database in MySQL for zun::
|
||||||
|
|
||||||
mysql -h 127.0.0.1 -u root -ppassword mysql <<EOF
|
mysql -h 127.0.0.1 -u root -ppassword mysql <<EOF
|
||||||
CREATE DATABASE IF NOT EXISTS higgins DEFAULT CHARACTER SET utf8;
|
CREATE DATABASE IF NOT EXISTS zun DEFAULT CHARACTER SET utf8;
|
||||||
GRANT ALL PRIVILEGES ON higgins.* TO
|
GRANT ALL PRIVILEGES ON zun.* TO
|
||||||
'root'@'%' IDENTIFIED BY 'password'
|
'root'@'%' IDENTIFIED BY 'password'
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
Clone and install higgins::
|
Clone and install zun::
|
||||||
|
|
||||||
cd ~
|
cd ~
|
||||||
git clone https://git.openstack.org/openstack/higgins
|
git clone https://git.openstack.org/openstack/higgins
|
||||||
cd higgins
|
cd zun
|
||||||
sudo pip install -e .
|
sudo pip install -e .
|
||||||
|
|
||||||
Configure higgins::
|
Configure zun::
|
||||||
|
|
||||||
# create the higgins conf directory
|
# create the zun conf directory
|
||||||
sudo mkdir -p /etc/higgins
|
sudo mkdir -p /etc/zun
|
||||||
sudo chown -R ${USER} /etc/higgins/
|
sudo chown -R ${USER} /etc/zun/
|
||||||
HIGGINS_CONF=/etc/higgins/higgins.conf
|
ZUN_CONF=/etc/zun/zun.conf
|
||||||
|
|
||||||
# generate sample config file and modify it as necessary
|
# generate sample config file and modify it as necessary
|
||||||
tox -egenconfig
|
tox -egenconfig
|
||||||
sudo cp etc/higgins/higgins.conf.sample /etc/higgins/higgins.conf
|
sudo cp etc/zun/zun.conf.sample /etc/zun/zun.conf
|
||||||
|
|
||||||
# copy policy.json
|
# copy policy.json
|
||||||
sudo cp etc/higgins/policy.json /etc/higgins/policy.json
|
sudo cp etc/zun/policy.json /etc/zun/policy.json
|
||||||
|
|
||||||
# enable debugging output
|
# enable debugging output
|
||||||
sudo sed -i "s/#debug\s*=.*/debug=true/" $HIGGINS_CONF
|
sudo sed -i "s/#debug\s*=.*/debug=true/" $ZUN_CONF
|
||||||
|
|
||||||
# set RabbitMQ userid
|
# set RabbitMQ userid
|
||||||
sudo sed -i "s/#rabbit_userid\s*=.*/rabbit_userid=stackrabbit/" \
|
sudo sed -i "s/#rabbit_userid\s*=.*/rabbit_userid=stackrabbit/" \
|
||||||
$HIGGINS_CONF
|
$ZUN_CONF
|
||||||
|
|
||||||
# set RabbitMQ password
|
# set RabbitMQ password
|
||||||
sudo sed -i "s/#rabbit_password\s*=.*/rabbit_password=password/" \
|
sudo sed -i "s/#rabbit_password\s*=.*/rabbit_password=password/" \
|
||||||
$HIGGINS_CONF
|
$ZUN_CONF
|
||||||
|
|
||||||
# set SQLAlchemy connection string to connect to MySQL
|
# set SQLAlchemy connection string to connect to MySQL
|
||||||
sudo sed -i "s/#connection\s*=.*/connection=mysql:\/\/root:password@localhost\/higgins/" \
|
sudo sed -i "s/#connection\s*=.*/connection=mysql:\/\/root:password@localhost\/zun/" \
|
||||||
$HIGGINS_CONF
|
$ZUN_CONF
|
||||||
|
|
||||||
# set keystone_auth
|
# set keystone_auth
|
||||||
source /opt/stack/devstack/openrc admin admin
|
source /opt/stack/devstack/openrc admin admin
|
||||||
iniset $HIGGINS_CONF keystone_auth auth_type password
|
iniset $ZUN_CONF keystone_auth auth_type password
|
||||||
iniset $HIGGINS_CONF keystone_auth username higgins
|
iniset $ZUN_CONF keystone_auth username zun
|
||||||
iniset $HIGGINS_CONF keystone_auth password password
|
iniset $ZUN_CONF keystone_auth password password
|
||||||
iniset $HIGGINS_CONF keystone_auth project_name service
|
iniset $ZUN_CONF keystone_auth project_name service
|
||||||
iniset $HIGGINS_CONF keystone_auth project_domain_id default
|
iniset $ZUN_CONF keystone_auth project_domain_id default
|
||||||
iniset $HIGGINS_CONF keystone_auth user_domain_id default
|
iniset $ZUN_CONF keystone_auth user_domain_id default
|
||||||
iniset $HIGGINS_CONF keystone_auth auth_url ${OS_AUTH_URL/v2.0/v3}
|
iniset $ZUN_CONF keystone_auth auth_url ${OS_AUTH_URL/v2.0/v3}
|
||||||
|
|
||||||
# NOTE: keystone_authtoken section is deprecated and will be removed.
|
# NOTE: keystone_authtoken section is deprecated and will be removed.
|
||||||
iniset $HIGGINS_CONF keystone_authtoken admin_user higgins
|
iniset $ZUN_CONF keystone_authtoken admin_user zun
|
||||||
iniset $HIGGINS_CONF keystone_authtoken admin_password password
|
iniset $ZUN_CONF keystone_authtoken admin_password password
|
||||||
iniset $HIGGINS_CONF keystone_authtoken admin_tenant_name service
|
iniset $ZUN_CONF keystone_authtoken admin_tenant_name service
|
||||||
iniset $HIGGINS_CONF keystone_authtoken auth_uri ${OS_AUTH_URL/v2.0/v3}
|
iniset $ZUN_CONF keystone_authtoken auth_uri ${OS_AUTH_URL/v2.0/v3}
|
||||||
iniset $HIGGINS_CONF keystone_authtoken auth_version v3
|
iniset $ZUN_CONF keystone_authtoken auth_version v3
|
||||||
|
|
||||||
Configure the database for use with higgins. Please note that DB migration
|
Configure the database for use with zun. Please note that DB migration
|
||||||
does not work for SQLite backend. The SQLite database does not
|
does not work for SQLite backend. The SQLite database does not
|
||||||
have any support for the ALTER statement needed by relational schema
|
have any support for the ALTER statement needed by relational schema
|
||||||
based migration tools. Hence DB Migration will not work for SQLite
|
based migration tools. Hence DB Migration will not work for SQLite
|
||||||
backend::
|
backend::
|
||||||
|
|
||||||
higgins-db-manage upgrade
|
zun-db-manage upgrade
|
||||||
|
|
||||||
Configure the keystone endpoint::
|
Configure the keystone endpoint::
|
||||||
|
|
||||||
openstack service create --name=higgins \
|
openstack service create --name=zun \
|
||||||
--description="Higgins Container Service" \
|
--description="Zun Container Service" \
|
||||||
container
|
container
|
||||||
openstack endpoint create --publicurl http://127.0.0.1:9512/v1 \
|
openstack endpoint create --publicurl http://127.0.0.1:9512/v1 \
|
||||||
--adminurl http://127.0.0.1:9512/v1 \
|
--adminurl http://127.0.0.1:9512/v1 \
|
||||||
@ -191,10 +191,10 @@ Configure the keystone endpoint::
|
|||||||
|
|
||||||
Start the API service in a new screen::
|
Start the API service in a new screen::
|
||||||
|
|
||||||
higgins-api
|
zun-api
|
||||||
|
|
||||||
Start the conductor service in a new screen::
|
Start the conductor service in a new screen::
|
||||||
|
|
||||||
higgins-conductor
|
zun-conductor
|
||||||
|
|
||||||
Higgins should now be up and running!
|
Zun should now be up and running!
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
.. higgins documentation master file, created by
|
.. zun documentation master file, created by
|
||||||
sphinx-quickstart on Tue Jul 9 22:26:36 2013.
|
sphinx-quickstart on Tue Jul 9 22:26:36 2013.
|
||||||
You can adapt this file completely to your liking, but it should at least
|
You can adapt this file completely to your liking, but it should at least
|
||||||
contain the root `toctree` directive.
|
contain the root `toctree` directive.
|
||||||
|
|
||||||
Welcome to Higgins's documentation!
|
Welcome to Zun's documentation!
|
||||||
========================================================
|
===============================
|
||||||
|
|
||||||
Contents:
|
Contents:
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@ Installation
|
|||||||
|
|
||||||
At the command line::
|
At the command line::
|
||||||
|
|
||||||
$ pip install higgins
|
$ pip install zun
|
||||||
|
|
||||||
Or, if you have virtualenvwrapper installed::
|
Or, if you have virtualenvwrapper installed::
|
||||||
|
|
||||||
$ mkvirtualenv higgins
|
$ mkvirtualenv zun
|
||||||
$ pip install higgins
|
$ pip install zun
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
========
|
=====
|
||||||
Usage
|
Usage
|
||||||
========
|
=====
|
||||||
|
|
||||||
To use higgins in a project::
|
To use zun in a project::
|
||||||
|
|
||||||
import higgins
|
import zun
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
# 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 mock
|
|
||||||
|
|
||||||
from higgins.common.rpc_service import CONF
|
|
||||||
from higgins import objects
|
|
||||||
from higgins.servicegroup import higgins_service_periodic as periodic
|
|
||||||
from higgins.tests import base
|
|
||||||
|
|
||||||
|
|
||||||
class HigginsServicePeriodicTestCase(base.BaseTestCase):
|
|
||||||
def setUp(self):
|
|
||||||
super(HigginsServicePeriodicTestCase, self).setUp()
|
|
||||||
mock_higgins_service_refresh = mock.Mock()
|
|
||||||
|
|
||||||
class FakeSrv(object):
|
|
||||||
report_state_up = mock_higgins_service_refresh
|
|
||||||
|
|
||||||
self.fake_srv = FakeSrv()
|
|
||||||
self.fake_srv_refresh = mock_higgins_service_refresh
|
|
||||||
|
|
||||||
@mock.patch.object(objects.HigginsService, 'get_by_host_and_binary')
|
|
||||||
@mock.patch.object(objects.HigginsService, 'create')
|
|
||||||
@mock.patch.object(objects.HigginsService, 'report_state_up')
|
|
||||||
def test_update_higgins_service_firsttime(self,
|
|
||||||
mock_srv_refresh,
|
|
||||||
mock_srv_create,
|
|
||||||
mock_srv_get
|
|
||||||
):
|
|
||||||
p_task = periodic.HigginsServicePeriodicTasks(CONF,
|
|
||||||
'fake-conductor')
|
|
||||||
mock_srv_get.return_value = None
|
|
||||||
|
|
||||||
p_task.update_higgins_service(None)
|
|
||||||
|
|
||||||
mock_srv_get.assert_called_once_with(mock.ANY, p_task.host,
|
|
||||||
p_task.binary)
|
|
||||||
mock_srv_create.assert_called_once_with()
|
|
||||||
mock_srv_refresh.assert_called_once_with()
|
|
||||||
|
|
||||||
@mock.patch.object(objects.HigginsService, 'get_by_host_and_binary')
|
|
||||||
@mock.patch.object(objects.HigginsService, 'create')
|
|
||||||
def test_update_higgins_service_on_restart(self,
|
|
||||||
mock_srv_create,
|
|
||||||
mock_srv_get):
|
|
||||||
p_task = periodic.HigginsServicePeriodicTasks(CONF,
|
|
||||||
'fake-conductor')
|
|
||||||
mock_srv_get.return_value = self.fake_srv
|
|
||||||
|
|
||||||
p_task.update_higgins_service(None)
|
|
||||||
|
|
||||||
mock_srv_get.assert_called_once_with(mock.ANY, p_task.host,
|
|
||||||
p_task.binary)
|
|
||||||
self.fake_srv_refresh.assert_called_once_with()
|
|
||||||
|
|
||||||
def test_update_higgins_service_regular(self):
|
|
||||||
p_task = periodic.HigginsServicePeriodicTasks(CONF,
|
|
||||||
'fake-conductor')
|
|
||||||
p_task.higgins_service_ref = self.fake_srv
|
|
||||||
|
|
||||||
p_task.update_higgins_service(None)
|
|
||||||
|
|
||||||
self.fake_srv_refresh.assert_called_once_with()
|
|
@ -12,7 +12,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
# Higgins Release Notes documentation build configuration file, created by
|
# Zun Release Notes documentation build configuration file, created by
|
||||||
# sphinx-quickstart on Sat May 14 17:02:44 2016.
|
# sphinx-quickstart on Sat May 14 17:02:44 2016.
|
||||||
#
|
#
|
||||||
# This file is execfile()d with the current directory set to its
|
# This file is execfile()d with the current directory set to its
|
||||||
@ -55,19 +55,19 @@ source_suffix = '.rst'
|
|||||||
master_doc = 'index'
|
master_doc = 'index'
|
||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = u'Higgins Release Notes'
|
project = u'Zun Release Notes'
|
||||||
copyright = u'2016, Higgins Developers'
|
copyright = u'2016, Zun Developers'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
from higgins.version import version_info as higgins_version
|
from zun.version import version_info as zun_version
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = higgins_version.version_string_with_vcs()
|
release = zun_version.version_string_with_vcs()
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = higgins_version.canonical_version_string()
|
version = zun_version.canonical_version_string()
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@ -190,7 +190,7 @@ html_static_path = ['_static']
|
|||||||
# html_file_suffix = None
|
# html_file_suffix = None
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = 'HigginsReleaseNotesdoc'
|
htmlhelp_basename = 'ZunReleaseNotesdoc'
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
# -- Options for LaTeX output ---------------------------------------------
|
||||||
@ -210,9 +210,9 @@ latex_elements = {
|
|||||||
# (source start file, target name, title,
|
# (source start file, target name, title,
|
||||||
# author, documentclass [howto, manual, or own class]).
|
# author, documentclass [howto, manual, or own class]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
('index', 'HigginsReleaseNotes.tex',
|
('index', 'ZunReleaseNotes.tex',
|
||||||
u'Higgins Release Notes Documentation',
|
u'Zun Release Notes Documentation',
|
||||||
u'Higgins Developers', 'manual'),
|
u'Zun Developers', 'manual'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
@ -241,8 +241,8 @@ latex_documents = [
|
|||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [
|
man_pages = [
|
||||||
('index', 'higginsreleasenotes', u'Higgins Release Notes Documentation',
|
('index', 'zunreleasenotes', u'Zun Release Notes Documentation',
|
||||||
[u'Higgins Developers'], 1)
|
[u'Zun Developers'], 1)
|
||||||
]
|
]
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
# If true, show URL addresses after external links.
|
||||||
@ -255,8 +255,8 @@ man_pages = [
|
|||||||
# (source start file, target name, title, author,
|
# (source start file, target name, title, author,
|
||||||
# dir menu entry, description, category)
|
# dir menu entry, description, category)
|
||||||
texinfo_documents = [
|
texinfo_documents = [
|
||||||
('index', 'HigginsReleaseNotes', u'Higgins Release Notes Documentation',
|
('index', 'ZunReleaseNotes', u'Zun Release Notes Documentation',
|
||||||
u'Higgins Developers', 'HigginsReleaseNotes',
|
u'Zun Developers', 'ZunReleaseNotes',
|
||||||
'One line description of project.',
|
'One line description of project.',
|
||||||
'Miscellaneous'),
|
'Miscellaneous'),
|
||||||
]
|
]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
======================
|
==================
|
||||||
Higgins Release Notes
|
Zun Release Notes
|
||||||
======================
|
==================
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
28
setup.cfg
28
setup.cfg
@ -1,5 +1,5 @@
|
|||||||
[metadata]
|
[metadata]
|
||||||
name = higgins
|
name = zun
|
||||||
summary = Container Management service for OpenStack
|
summary = Container Management service for OpenStack
|
||||||
description-file =
|
description-file =
|
||||||
README.rst
|
README.rst
|
||||||
@ -20,7 +20,7 @@ classifier =
|
|||||||
|
|
||||||
[files]
|
[files]
|
||||||
packages =
|
packages =
|
||||||
higgins
|
zun
|
||||||
|
|
||||||
[build_sphinx]
|
[build_sphinx]
|
||||||
source-dir = doc/source
|
source-dir = doc/source
|
||||||
@ -31,28 +31,28 @@ all_files = 1
|
|||||||
upload-dir = doc/build/html
|
upload-dir = doc/build/html
|
||||||
|
|
||||||
[compile_catalog]
|
[compile_catalog]
|
||||||
directory = higgins/locale
|
directory = zun/locale
|
||||||
domain = higgins
|
domain = zun
|
||||||
|
|
||||||
[update_catalog]
|
[update_catalog]
|
||||||
domain = higgins
|
domain = zun
|
||||||
output_dir = higgins/locale
|
output_dir = zun/locale
|
||||||
input_file = higgins/locale/higgins.pot
|
input_file = zun/locale/zun.pot
|
||||||
|
|
||||||
[extract_messages]
|
[extract_messages]
|
||||||
keywords = _ gettext ngettext l_ lazy_gettext
|
keywords = _ gettext ngettext l_ lazy_gettext
|
||||||
mapping_file = babel.cfg
|
mapping_file = babel.cfg
|
||||||
output_file = higgins/locale/higgins.pot
|
output_file = zun/locale/zun.pot
|
||||||
|
|
||||||
[entry_points]
|
[entry_points]
|
||||||
console_scripts =
|
console_scripts =
|
||||||
higgins-api = higgins.cmd.api:main
|
zun-api = zun.cmd.api:main
|
||||||
higgins-conductor = higgins.cmd.conductor:main
|
zun-conductor = zun.cmd.conductor:main
|
||||||
higgins-db-manage = higgins.cmd.db_manage:main
|
zun-db-manage = zun.cmd.db_manage:main
|
||||||
|
|
||||||
oslo.config.opts =
|
oslo.config.opts =
|
||||||
higgins = higgins.opts:list_opts
|
zun = zun.opts:list_opts
|
||||||
|
|
||||||
higgins.database.migration_backend =
|
zun.database.migration_backend =
|
||||||
sqlalchemy = higgins.db.sqlalchemy.migration
|
sqlalchemy = zun.db.sqlalchemy.migration
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
To generate the sample higgins.conf file, run gen-config tools
|
|
||||||
from the top level of the higgins directory:
|
|
||||||
|
|
||||||
tools/gen-config
|
|
||||||
|
|
||||||
Or run the following command from the top level of the
|
|
||||||
higgins directory:
|
|
||||||
|
|
||||||
tox -egenconfig
|
|
||||||
|
|
||||||
Generated sample configuration file will be put into etc/higgins/
|
|
||||||
directory.
|
|
12
tools/README-zun.conf.txt
Normal file
12
tools/README-zun.conf.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
To generate the sample zun.conf file, run gen-config tools
|
||||||
|
from the top level of the zun directory:
|
||||||
|
|
||||||
|
tools/gen-config
|
||||||
|
|
||||||
|
Or run the following command from the top level of the
|
||||||
|
zun directory:
|
||||||
|
|
||||||
|
tox -egenconfig
|
||||||
|
|
||||||
|
Generated sample configuration file will be put into etc/zun/
|
||||||
|
directory.
|
@ -1,3 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
oslo-config-generator --config-file=tools/higgins-config-generator.conf
|
oslo-config-generator --config-file=tools/zun-config-generator.conf
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
output_file = etc/higgins/higgins.conf.sample
|
output_file = etc/zun/zun.conf.sample
|
||||||
wrap_width = 79
|
wrap_width = 79
|
||||||
|
|
||||||
namespace = higgins
|
namespace = zun
|
||||||
namespace = keystonemiddleware.auth_token
|
namespace = keystonemiddleware.auth_token
|
||||||
namespace = oslo.concurrency
|
namespace = oslo.concurrency
|
||||||
namespace = oslo.db
|
namespace = oslo.db
|
4
tox.ini
4
tox.ini
@ -29,7 +29,7 @@ install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstac
|
|||||||
commands =
|
commands =
|
||||||
doc8 -e .rst doc/source/ CONTRIBUTING.rst HACKING.rst README.rst
|
doc8 -e .rst doc/source/ CONTRIBUTING.rst HACKING.rst README.rst
|
||||||
bash tools/flake8wrap.sh {posargs}
|
bash tools/flake8wrap.sh {posargs}
|
||||||
bandit -r higgins -x tests -n5 -ll
|
bandit -r zun -x tests -n5 -ll
|
||||||
|
|
||||||
[testenv:pep8-constraints]
|
[testenv:pep8-constraints]
|
||||||
install_command = {[testenv:common-constraints]install_command}
|
install_command = {[testenv:common-constraints]install_command}
|
||||||
@ -71,7 +71,7 @@ builtins = _
|
|||||||
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build
|
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build
|
||||||
|
|
||||||
[hacking]
|
[hacking]
|
||||||
local-check-factory = higgins.hacking.checks.factory
|
local-check-factory = zun.hacking.checks.factory
|
||||||
|
|
||||||
[testenv:fast8]
|
[testenv:fast8]
|
||||||
# NOTE(sheel.rana): `tox -e fast8` cab be used to run pep8 command only for
|
# NOTE(sheel.rana): `tox -e fast8` cab be used to run pep8 command only for
|
||||||
|
@ -16,4 +16,4 @@ import pbr.version
|
|||||||
|
|
||||||
|
|
||||||
__version__ = pbr.version.VersionInfo(
|
__version__ = pbr.version.VersionInfo(
|
||||||
'higgins').version_string()
|
'zun').version_string()
|
@ -14,19 +14,19 @@ from oslo_config import cfg
|
|||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
import pecan
|
import pecan
|
||||||
|
|
||||||
from higgins.api import config as api_config
|
from zun.api import config as api_config
|
||||||
from higgins.api import middleware
|
from zun.api import middleware
|
||||||
from higgins.common.i18n import _
|
from zun.common.i18n import _
|
||||||
|
|
||||||
|
|
||||||
# Register options for the service
|
# Register options for the service
|
||||||
API_SERVICE_OPTS = [
|
API_SERVICE_OPTS = [
|
||||||
cfg.PortOpt('port',
|
cfg.PortOpt('port',
|
||||||
default=9512,
|
default=9512,
|
||||||
help='The port for the higgins API server.'),
|
help='The port for the zun API server.'),
|
||||||
cfg.IPOpt('host',
|
cfg.IPOpt('host',
|
||||||
default='127.0.0.1',
|
default='127.0.0.1',
|
||||||
help='The listen IP for the higgins API server.'),
|
help='The listen IP for the zun API server.'),
|
||||||
cfg.BoolOpt('enable_ssl_api',
|
cfg.BoolOpt('enable_ssl_api',
|
||||||
default=False,
|
default=False,
|
||||||
help=_("Enable the integrated stand-alone API to service "
|
help=_("Enable the integrated stand-alone API to service "
|
||||||
@ -36,13 +36,13 @@ API_SERVICE_OPTS = [
|
|||||||
"will want to change public API endpoint to represent "
|
"will want to change public API endpoint to represent "
|
||||||
"SSL termination URL with 'public_endpoint' option.")),
|
"SSL termination URL with 'public_endpoint' option.")),
|
||||||
cfg.IntOpt('workers',
|
cfg.IntOpt('workers',
|
||||||
help=_("Number of workers for higgins-api service. "
|
help=_("Number of workers for zun-api service. "
|
||||||
"The default will be the number of CPUs available.")),
|
"The default will be the number of CPUs available.")),
|
||||||
]
|
]
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
opt_group = cfg.OptGroup(name='api',
|
opt_group = cfg.OptGroup(name='api',
|
||||||
title='Options for the higgins-api service')
|
title='Options for the zun-api service')
|
||||||
CONF.register_group(opt_group)
|
CONF.register_group(opt_group)
|
||||||
CONF.register_opts(API_SERVICE_OPTS, opt_group)
|
CONF.register_opts(API_SERVICE_OPTS, opt_group)
|
||||||
|
|
@ -12,12 +12,12 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from higgins.api import hooks
|
from zun.api import hooks
|
||||||
|
|
||||||
# Pecan Application Configurations
|
# Pecan Application Configurations
|
||||||
app = {
|
app = {
|
||||||
'root': 'higgins.api.controllers.root.RootController',
|
'root': 'zun.api.controllers.root.RootController',
|
||||||
'modules': ['higgins'],
|
'modules': ['zun'],
|
||||||
'hooks': [
|
'hooks': [
|
||||||
hooks.ContextHook(),
|
hooks.ContextHook(),
|
||||||
hooks.NoExceptionTracebackHook(),
|
hooks.NoExceptionTracebackHook(),
|
@ -16,7 +16,7 @@
|
|||||||
import pecan
|
import pecan
|
||||||
from wsme import types as wtypes
|
from wsme import types as wtypes
|
||||||
|
|
||||||
from higgins.api.controllers import base
|
from zun.api.controllers import base
|
||||||
|
|
||||||
|
|
||||||
def build_url(resource, resource_args, bookmark=False, base_url=None):
|
def build_url(resource, resource_args, bookmark=False, base_url=None):
|
@ -13,7 +13,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Version 1 of the Higgins API
|
Version 1 of the Zun API
|
||||||
|
|
||||||
NOTE: IN PROGRESS AND NOT FULLY IMPLEMENTED.
|
NOTE: IN PROGRESS AND NOT FULLY IMPLEMENTED.
|
||||||
"""
|
"""
|
||||||
@ -23,9 +23,9 @@ import pecan
|
|||||||
from pecan import rest
|
from pecan import rest
|
||||||
from wsme import types as wtypes
|
from wsme import types as wtypes
|
||||||
|
|
||||||
from higgins.api.controllers import base as controllers_base
|
from zun.api.controllers import base as controllers_base
|
||||||
from higgins.api.controllers import link
|
from zun.api.controllers import link
|
||||||
from higgins.api import expose
|
from zun.api import expose
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -61,11 +61,11 @@ class V1(controllers_base.APIBase):
|
|||||||
'v1', '', bookmark=True),
|
'v1', '', bookmark=True),
|
||||||
link.Link.make_link('describedby',
|
link.Link.make_link('describedby',
|
||||||
'http://docs.openstack.org',
|
'http://docs.openstack.org',
|
||||||
'developer/higgins/dev',
|
'developer/zun/dev',
|
||||||
'api-spec-v1.html',
|
'api-spec-v1.html',
|
||||||
bookmark=True, type='text/html')]
|
bookmark=True, type='text/html')]
|
||||||
v1.media_types = [MediaType('application/json',
|
v1.media_types = [MediaType('application/json',
|
||||||
'application/vnd.openstack.higgins.v1+json')]
|
'application/vnd.openstack.zun.v1+json')]
|
||||||
return v1
|
return v1
|
||||||
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
|||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from pecan import hooks
|
from pecan import hooks
|
||||||
|
|
||||||
from higgins.common import context
|
from zun.common import context
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
CONF.import_opt('auth_uri', 'keystonemiddleware.auth_token',
|
CONF.import_opt('auth_uri', 'keystonemiddleware.auth_token',
|
@ -10,8 +10,8 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from higgins.api.middleware import auth_token
|
from zun.api.middleware import auth_token
|
||||||
from higgins.api.middleware import parsable_error
|
from zun.api.middleware import parsable_error
|
||||||
|
|
||||||
|
|
||||||
AuthTokenMiddleware = auth_token.AuthTokenMiddleware
|
AuthTokenMiddleware = auth_token.AuthTokenMiddleware
|
@ -15,9 +15,9 @@ import re
|
|||||||
from keystonemiddleware import auth_token
|
from keystonemiddleware import auth_token
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
|
|
||||||
from higgins.common import exception
|
from zun.common import exception
|
||||||
from higgins.common.i18n import _
|
from zun.common.i18n import _
|
||||||
from higgins.common import utils
|
from zun.common import utils
|
||||||
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
@ -21,7 +21,7 @@ Based on pecan.middleware.errordocument
|
|||||||
import json
|
import json
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from higgins.common.i18n import _
|
from zun.common.i18n import _
|
||||||
|
|
||||||
|
|
||||||
class ParsableErrorMiddleware(object):
|
class ParsableErrorMiddleware(object):
|
@ -15,29 +15,29 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
"""The Higgins Service API."""
|
"""The Zun Service API."""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from higgins.common import service as higgins_service
|
from zun.common import service as zun_service
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# Parse config file and command line options, then start logging
|
# Parse config file and command line options, then start logging
|
||||||
higgins_service.prepare_service(sys.argv)
|
zun_service.prepare_service(sys.argv)
|
||||||
|
|
||||||
# Enable object backporting via the conductor
|
# Enable object backporting via the conductor
|
||||||
# TODO(yuanying): Uncomment after rpc services are implemented
|
# TODO(yuanying): Uncomment after rpc services are implemented
|
||||||
# base.higginsObject.indirection_api = base.higginsObjectIndirectionAPI()
|
# base.zunObject.indirection_api = base.zunObjectIndirectionAPI()
|
||||||
|
|
||||||
# Build and start the WSGI app
|
# Build and start the WSGI app
|
||||||
launcher = higgins_service.process_launcher()
|
launcher = zun_service.process_launcher()
|
||||||
server = higgins_service.WSGIService(
|
server = zun_service.WSGIService(
|
||||||
'higgins_api',
|
'zun_api',
|
||||||
CONF.api.enable_ssl_api
|
CONF.api.enable_ssl_api
|
||||||
)
|
)
|
||||||
launcher.launch_service(server, workers=server.workers)
|
launcher.launch_service(server, workers=server.workers)
|
@ -10,7 +10,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
"""Starter script for the Higgins conductor service."""
|
"""Starter script for the Zun conductor service."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@ -19,22 +19,22 @@ from oslo_config import cfg
|
|||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
from oslo_service import service
|
from oslo_service import service
|
||||||
|
|
||||||
from higgins.common.i18n import _LI
|
from zun.common.i18n import _LI
|
||||||
from higgins.common import rpc_service
|
from zun.common import rpc_service
|
||||||
from higgins.common import service as higgins_service
|
from zun.common import service as zun_service
|
||||||
from higgins.common import short_id
|
from zun.common import short_id
|
||||||
from higgins.conductor.handlers import default as default_handler
|
from zun.conductor.handlers import default as default_handler
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
higgins_service.prepare_service(sys.argv)
|
zun_service.prepare_service(sys.argv)
|
||||||
|
|
||||||
LOG.info(_LI('Starting server in PID %s'), os.getpid())
|
LOG.info(_LI('Starting server in PID %s'), os.getpid())
|
||||||
cfg.CONF.log_opt_values(LOG, logging.DEBUG)
|
cfg.CONF.log_opt_values(LOG, logging.DEBUG)
|
||||||
|
|
||||||
cfg.CONF.import_opt('topic', 'higgins.conductor.config', group='conductor')
|
cfg.CONF.import_opt('topic', 'zun.conductor.config', group='conductor')
|
||||||
|
|
||||||
conductor_id = short_id.generate_id()
|
conductor_id = short_id.generate_id()
|
||||||
endpoints = [
|
endpoints = [
|
||||||
@ -43,6 +43,6 @@ def main():
|
|||||||
|
|
||||||
server = rpc_service.Service.create(cfg.CONF.conductor.topic,
|
server = rpc_service.Service.create(cfg.CONF.conductor.topic,
|
||||||
conductor_id, endpoints,
|
conductor_id, endpoints,
|
||||||
binary='higgins-conductor')
|
binary='zun-conductor')
|
||||||
launcher = service.launch(cfg.CONF, server)
|
launcher = service.launch(cfg.CONF, server)
|
||||||
launcher.wait()
|
launcher.wait()
|
@ -11,11 +11,11 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
"""Starter script for higgins-db-manage."""
|
"""Starter script for zun-db-manage."""
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from higgins.db import migration
|
from zun.db import migration
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
@ -63,5 +63,5 @@ def main():
|
|||||||
handler=add_command_parsers)
|
handler=add_command_parsers)
|
||||||
CONF.register_cli_opt(command_opt)
|
CONF.register_cli_opt(command_opt)
|
||||||
|
|
||||||
CONF(project='higgins')
|
CONF(project='zun')
|
||||||
CONF.command.func()
|
CONF.command.func()
|
@ -17,15 +17,15 @@
|
|||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
# from higgins.common import rpc
|
# from zun.common import rpc
|
||||||
from higgins import version
|
from zun import version
|
||||||
|
|
||||||
|
|
||||||
def parse_args(argv, default_config_files=None):
|
def parse_args(argv, default_config_files=None):
|
||||||
# TODO(yuanying): Uncomment after rpc is implemented
|
# TODO(yuanying): Uncomment after rpc is implemented
|
||||||
# rpc.set_defaults(control_exchange='higgins')
|
# rpc.set_defaults(control_exchange='zun')
|
||||||
cfg.CONF(argv[1:],
|
cfg.CONF(argv[1:],
|
||||||
project='higgins',
|
project='zun',
|
||||||
version=version.version_info.release_string(),
|
version=version.version_info.release_string(),
|
||||||
default_config_files=default_config_files)
|
default_config_files=default_config_files)
|
||||||
# rpc.init(cfg.CONF)
|
# rpc.init(cfg.CONF)
|
@ -12,9 +12,9 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
"""Higgins base exception handling.
|
"""Zun base exception handling.
|
||||||
|
|
||||||
Includes decorator for re-raising Higgins-type exceptions.
|
Includes decorator for re-raising Zun-type exceptions.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -30,9 +30,9 @@ import pecan
|
|||||||
import six
|
import six
|
||||||
import wsme
|
import wsme
|
||||||
|
|
||||||
from higgins.common.i18n import _
|
from zun.common.i18n import _
|
||||||
from higgins.common.i18n import _LE
|
from zun.common.i18n import _LE
|
||||||
from higgins.common import safe_utils
|
from zun.common import safe_utils
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
@ -43,8 +43,8 @@ try:
|
|||||||
CONF.import_opt('fatal_exception_format_errors',
|
CONF.import_opt('fatal_exception_format_errors',
|
||||||
'oslo_versionedobjects.exception')
|
'oslo_versionedobjects.exception')
|
||||||
except cfg.NoSuchOptError as e:
|
except cfg.NoSuchOptError as e:
|
||||||
# Note:work around for higgins run against master branch
|
# Note:work around for zun run against master branch
|
||||||
# in devstack gate job, as higgins not branched yet
|
# in devstack gate job, as zun not branched yet
|
||||||
# verisonobjects kilo/master different version can
|
# verisonobjects kilo/master different version can
|
||||||
# cause issue here. As it changed import group. So
|
# cause issue here. As it changed import group. So
|
||||||
# add here before branch to prevent gate failure.
|
# add here before branch to prevent gate failure.
|
||||||
@ -96,11 +96,11 @@ OBFUSCATED_MSG = _('Your request could not be handled '
|
|||||||
def wrap_controller_exception(func, func_server_error, func_client_error):
|
def wrap_controller_exception(func, func_server_error, func_client_error):
|
||||||
"""This decorator wraps controllers methods to handle exceptions:
|
"""This decorator wraps controllers methods to handle exceptions:
|
||||||
|
|
||||||
- if an unhandled Exception or a HigginsException with an error code >=500
|
- if an unhandled Exception or a ZunException with an error code >=500
|
||||||
is catched, raise a http 5xx ClientSideError and correlates it with a log
|
is catched, raise a http 5xx ClientSideError and correlates it with a log
|
||||||
message
|
message
|
||||||
|
|
||||||
- if a HigginsException is catched and its error code is <500, raise a http
|
- if a ZunException is catched and its error code is <500, raise a http
|
||||||
4xx and logs the excp in debug mode
|
4xx and logs the excp in debug mode
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -109,7 +109,7 @@ def wrap_controller_exception(func, func_server_error, func_client_error):
|
|||||||
try:
|
try:
|
||||||
return func(*args, **kw)
|
return func(*args, **kw)
|
||||||
except Exception as excp:
|
except Exception as excp:
|
||||||
if isinstance(excp, HigginsException):
|
if isinstance(excp, ZunException):
|
||||||
http_error_code = excp.code
|
http_error_code = excp.code
|
||||||
else:
|
else:
|
||||||
http_error_code = 500
|
http_error_code = 500
|
||||||
@ -162,7 +162,7 @@ def wrap_pecan_controller_exception(func):
|
|||||||
|
|
||||||
|
|
||||||
def wrap_keystone_exception(func):
|
def wrap_keystone_exception(func):
|
||||||
"""Wrap keystone exceptions and throw Higgins specific exceptions."""
|
"""Wrap keystone exceptions and throw Zun specific exceptions."""
|
||||||
@functools.wraps(func)
|
@functools.wraps(func)
|
||||||
def wrapped(*args, **kw):
|
def wrapped(*args, **kw):
|
||||||
try:
|
try:
|
||||||
@ -178,8 +178,8 @@ def wrap_keystone_exception(func):
|
|||||||
return wrapped
|
return wrapped
|
||||||
|
|
||||||
|
|
||||||
class HigginsException(Exception):
|
class ZunException(Exception):
|
||||||
"""Base Higgins Exception
|
"""Base Zun Exception
|
||||||
|
|
||||||
To correctly use this class, inherit from it and define
|
To correctly use this class, inherit from it and define
|
||||||
a 'message' property. That message will get printf'd
|
a 'message' property. That message will get printf'd
|
||||||
@ -212,7 +212,7 @@ class HigginsException(Exception):
|
|||||||
if CONF.oslo_versionedobjects.fatal_exception_format_errors:
|
if CONF.oslo_versionedobjects.fatal_exception_format_errors:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
super(HigginsException, self).__init__(self.message)
|
super(ZunException, self).__init__(self.message)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@ -229,11 +229,11 @@ class HigginsException(Exception):
|
|||||||
return six.text_type(self)
|
return six.text_type(self)
|
||||||
|
|
||||||
|
|
||||||
class ObjectNotFound(HigginsException):
|
class ObjectNotFound(ZunException):
|
||||||
message = _("The %(name)s %(id)s could not be found.")
|
message = _("The %(name)s %(id)s could not be found.")
|
||||||
|
|
||||||
|
|
||||||
class ObjectNotUnique(HigginsException):
|
class ObjectNotUnique(ZunException):
|
||||||
message = _("The %(name)s already exists.")
|
message = _("The %(name)s already exists.")
|
||||||
|
|
||||||
|
|
||||||
@ -247,23 +247,23 @@ class ResourceExists(ObjectNotUnique):
|
|||||||
code = 409
|
code = 409
|
||||||
|
|
||||||
|
|
||||||
class AuthorizationFailure(HigginsException):
|
class AuthorizationFailure(ZunException):
|
||||||
message = _("%(client)s connection failed. %(message)s")
|
message = _("%(client)s connection failed. %(message)s")
|
||||||
|
|
||||||
|
|
||||||
class UnsupportedObjectError(HigginsException):
|
class UnsupportedObjectError(ZunException):
|
||||||
message = _('Unsupported object type %(objtype)s')
|
message = _('Unsupported object type %(objtype)s')
|
||||||
|
|
||||||
|
|
||||||
class IncompatibleObjectVersion(HigginsException):
|
class IncompatibleObjectVersion(ZunException):
|
||||||
message = _('Version %(objver)s of %(objname)s is not supported')
|
message = _('Version %(objver)s of %(objname)s is not supported')
|
||||||
|
|
||||||
|
|
||||||
class OrphanedObjectError(HigginsException):
|
class OrphanedObjectError(ZunException):
|
||||||
message = _('Cannot call %(method)s on orphaned %(objtype)s object')
|
message = _('Cannot call %(method)s on orphaned %(objtype)s object')
|
||||||
|
|
||||||
|
|
||||||
class Invalid(HigginsException):
|
class Invalid(ZunException):
|
||||||
message = _("Unacceptable parameters.")
|
message = _("Unacceptable parameters.")
|
||||||
code = 400
|
code = 400
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ class InvalidDiscoveryURL(Invalid):
|
|||||||
"discovery endpoint '%(discovery_endpoint)s'.")
|
"discovery endpoint '%(discovery_endpoint)s'.")
|
||||||
|
|
||||||
|
|
||||||
class GetDiscoveryUrlFailed(HigginsException):
|
class GetDiscoveryUrlFailed(ZunException):
|
||||||
message = _("Failed to get discovery url from '%(discovery_endpoint)s'.")
|
message = _("Failed to get discovery url from '%(discovery_endpoint)s'.")
|
||||||
|
|
||||||
|
|
||||||
@ -301,7 +301,7 @@ class HTTPNotFound(ResourceNotFound):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Conflict(HigginsException):
|
class Conflict(ZunException):
|
||||||
message = _('Conflict.')
|
message = _('Conflict.')
|
||||||
code = 409
|
code = 409
|
||||||
|
|
||||||
@ -324,10 +324,10 @@ class PatchError(Invalid):
|
|||||||
message = _("Couldn't apply patch '%(patch)s'. Reason: %(reason)s")
|
message = _("Couldn't apply patch '%(patch)s'. Reason: %(reason)s")
|
||||||
|
|
||||||
|
|
||||||
class NotAuthorized(HigginsException):
|
class NotAuthorized(ZunException):
|
||||||
message = _("Not authorized.")
|
message = _("Not authorized.")
|
||||||
code = 403
|
code = 403
|
||||||
|
|
||||||
|
|
||||||
class ConfigInvalid(HigginsException):
|
class ConfigInvalid(ZunException):
|
||||||
message = _("Invalid configuration file. %(error_msg)s")
|
message = _("Invalid configuration file. %(error_msg)s")
|
@ -19,7 +19,7 @@
|
|||||||
import oslo_i18n
|
import oslo_i18n
|
||||||
|
|
||||||
|
|
||||||
_translators = oslo_i18n.TranslatorFactory(domain='higgins')
|
_translators = oslo_i18n.TranslatorFactory(domain='zun')
|
||||||
|
|
||||||
# The primary translation function using the well-known name "_"
|
# The primary translation function using the well-known name "_"
|
||||||
_ = _translators.primary
|
_ = _translators.primary
|
@ -18,8 +18,8 @@ from keystoneclient.v3 import client as kc_v3
|
|||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
|
||||||
from higgins.common import exception
|
from zun.common import exception
|
||||||
from higgins.common.i18n import _LE
|
from zun.common.i18n import _LE
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
CFG_GROUP = 'keystone_auth'
|
CFG_GROUP = 'keystone_auth'
|
@ -31,8 +31,8 @@ from oslo_config import cfg
|
|||||||
import oslo_messaging as messaging
|
import oslo_messaging as messaging
|
||||||
from oslo_serialization import jsonutils
|
from oslo_serialization import jsonutils
|
||||||
|
|
||||||
from higgins.common import context as higgins_context
|
from zun.common import context as zun_context
|
||||||
from higgins.common import exception
|
from zun.common import exception
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
@ -44,15 +44,15 @@ ALLOWED_EXMODS = [
|
|||||||
]
|
]
|
||||||
EXTRA_EXMODS = []
|
EXTRA_EXMODS = []
|
||||||
|
|
||||||
# NOTE(lucasagomes): The higgins.openstack.common.rpc entries are for
|
# NOTE(lucasagomes): The zun.openstack.common.rpc entries are for
|
||||||
# backwards compat with IceHouse rpc_backend configuration values.
|
# backwards compat with IceHouse rpc_backend configuration values.
|
||||||
TRANSPORT_ALIASES = {
|
TRANSPORT_ALIASES = {
|
||||||
'higgins.openstack.common.rpc.impl_kombu': 'rabbit',
|
'zun.openstack.common.rpc.impl_kombu': 'rabbit',
|
||||||
'higgins.openstack.common.rpc.impl_qpid': 'qpid',
|
'zun.openstack.common.rpc.impl_qpid': 'qpid',
|
||||||
'higgins.openstack.common.rpc.impl_zmq': 'zmq',
|
'zun.openstack.common.rpc.impl_zmq': 'zmq',
|
||||||
'higgins.rpc.impl_kombu': 'rabbit',
|
'zun.rpc.impl_kombu': 'rabbit',
|
||||||
'higgins.rpc.impl_qpid': 'qpid',
|
'zun.rpc.impl_qpid': 'qpid',
|
||||||
'higgins.rpc.impl_zmq': 'zmq',
|
'zun.rpc.impl_zmq': 'zmq',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ class RequestContextSerializer(messaging.Serializer):
|
|||||||
return context.to_dict()
|
return context.to_dict()
|
||||||
|
|
||||||
def deserialize_context(self, context):
|
def deserialize_context(self, context):
|
||||||
return higgins_context.RequestContext.from_dict(context)
|
return zun_context.RequestContext.from_dict(context)
|
||||||
|
|
||||||
|
|
||||||
def get_transport_url(url_str=None):
|
def get_transport_url(url_str=None):
|
@ -12,16 +12,16 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
"""Common RPC service and API tools for Higgins."""
|
"""Common RPC service and API tools for Zun."""
|
||||||
|
|
||||||
import eventlet
|
import eventlet
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
import oslo_messaging as messaging
|
import oslo_messaging as messaging
|
||||||
from oslo_service import service
|
from oslo_service import service
|
||||||
|
|
||||||
from higgins.common import rpc
|
from zun.common import rpc
|
||||||
from higgins.objects import base as objects_base
|
from zun.objects import base as objects_base
|
||||||
from higgins.servicegroup import higgins_service_periodic as servicegroup
|
from zun.servicegroup import zun_service_periodic as servicegroup
|
||||||
|
|
||||||
# NOTE(paulczar):
|
# NOTE(paulczar):
|
||||||
# Ubuntu 14.04 forces librabbitmq when kombu is used
|
# Ubuntu 14.04 forces librabbitmq when kombu is used
|
||||||
@ -31,12 +31,12 @@ from higgins.servicegroup import higgins_service_periodic as servicegroup
|
|||||||
eventlet.monkey_patch()
|
eventlet.monkey_patch()
|
||||||
|
|
||||||
# NOTE(asalkeld):
|
# NOTE(asalkeld):
|
||||||
# The higgins.openstack.common.rpc entries are for compatibility
|
# The zun.openstack.common.rpc entries are for compatibility
|
||||||
# with devstack rpc_backend configuration values.
|
# with devstack rpc_backend configuration values.
|
||||||
TRANSPORT_ALIASES = {
|
TRANSPORT_ALIASES = {
|
||||||
'higgins.openstack.common.rpc.impl_kombu': 'rabbit',
|
'zun.openstack.common.rpc.impl_kombu': 'rabbit',
|
||||||
'higgins.openstack.common.rpc.impl_qpid': 'qpid',
|
'zun.openstack.common.rpc.impl_qpid': 'qpid',
|
||||||
'higgins.openstack.common.rpc.impl_zmq': 'zmq',
|
'zun.openstack.common.rpc.impl_zmq': 'zmq',
|
||||||
}
|
}
|
||||||
|
|
||||||
periodic_opts = [
|
periodic_opts = [
|
||||||
@ -55,7 +55,7 @@ class Service(service.Service):
|
|||||||
def __init__(self, topic, server, handlers, binary):
|
def __init__(self, topic, server, handlers, binary):
|
||||||
super(Service, self).__init__()
|
super(Service, self).__init__()
|
||||||
serializer = rpc.RequestContextSerializer(
|
serializer = rpc.RequestContextSerializer(
|
||||||
objects_base.HigginsObjectSerializer())
|
objects_base.ZunObjectSerializer())
|
||||||
transport = messaging.get_transport(cfg.CONF,
|
transport = messaging.get_transport(cfg.CONF,
|
||||||
aliases=TRANSPORT_ALIASES)
|
aliases=TRANSPORT_ALIASES)
|
||||||
# TODO(asalkeld) add support for version='x.y'
|
# TODO(asalkeld) add support for version='x.y'
|
||||||
@ -84,7 +84,7 @@ class API(object):
|
|||||||
def __init__(self, transport=None, context=None, topic=None, server=None,
|
def __init__(self, transport=None, context=None, topic=None, server=None,
|
||||||
timeout=None):
|
timeout=None):
|
||||||
serializer = rpc.RequestContextSerializer(
|
serializer = rpc.RequestContextSerializer(
|
||||||
objects_base.HigginsObjectSerializer())
|
objects_base.ZunObjectSerializer())
|
||||||
if transport is None:
|
if transport is None:
|
||||||
exmods = rpc.get_allowed_exmods()
|
exmods = rpc.get_allowed_exmods()
|
||||||
transport = messaging.get_transport(cfg.CONF,
|
transport = messaging.get_transport(cfg.CONF,
|
@ -22,10 +22,10 @@ from oslo_log import log
|
|||||||
from oslo_service import service
|
from oslo_service import service
|
||||||
from oslo_service import wsgi
|
from oslo_service import wsgi
|
||||||
|
|
||||||
from higgins.api import app
|
from zun.api import app
|
||||||
from higgins.common import config
|
from zun.common import config
|
||||||
from higgins.common import exception
|
from zun.common import exception
|
||||||
from higgins.common.i18n import _
|
from zun.common.i18n import _
|
||||||
|
|
||||||
|
|
||||||
service_opts = [
|
service_opts = [
|
||||||
@ -49,7 +49,7 @@ def prepare_service(argv=None):
|
|||||||
argv = []
|
argv = []
|
||||||
log.register_options(CONF)
|
log.register_options(CONF)
|
||||||
config.parse_args(argv)
|
config.parse_args(argv)
|
||||||
log.setup(CONF, 'higgins')
|
log.setup(CONF, 'zun')
|
||||||
# TODO(yuanying): Uncomment after objects are implemented
|
# TODO(yuanying): Uncomment after objects are implemented
|
||||||
# objects.register_all()
|
# objects.register_all()
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ def process_launcher():
|
|||||||
|
|
||||||
|
|
||||||
class WSGIService(service.ServiceBase):
|
class WSGIService(service.ServiceBase):
|
||||||
"""Provides ability to launch Higgins API from wsgi app."""
|
"""Provides ability to launch Zun API from wsgi app."""
|
||||||
|
|
||||||
def __init__(self, name, use_ssl=False):
|
def __init__(self, name, use_ssl=False):
|
||||||
"""Initialize, but do not start the WSGI server.
|
"""Initialize, but do not start the WSGI server.
|
@ -20,7 +20,7 @@ import uuid
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from higgins.common.i18n import _
|
from zun.common.i18n import _
|
||||||
|
|
||||||
|
|
||||||
def _to_byte_string(value, num_bits):
|
def _to_byte_string(value, num_bits):
|
@ -20,7 +20,7 @@ from oslo_log import log as logging
|
|||||||
import six
|
import six
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from higgins.common.i18n import _LW
|
from zun.common.i18n import _LW
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
@ -10,10 +10,10 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
"""API for interfacing with Higgins Backend."""
|
"""API for interfacing with Zun Backend."""
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from higgins.common import rpc_service
|
from zun.common import rpc_service
|
||||||
|
|
||||||
|
|
||||||
# The Backend API class serves as a AMQP client for communicating
|
# The Backend API class serves as a AMQP client for communicating
|
||||||
@ -23,7 +23,7 @@ from higgins.common import rpc_service
|
|||||||
class API(rpc_service.API):
|
class API(rpc_service.API):
|
||||||
def __init__(self, transport=None, context=None, topic=None):
|
def __init__(self, transport=None, context=None, topic=None):
|
||||||
if topic is None:
|
if topic is None:
|
||||||
cfg.CONF.import_opt('topic', 'higgins.conductor.config',
|
cfg.CONF.import_opt('topic', 'zun.conductor.config',
|
||||||
group='conductor')
|
group='conductor')
|
||||||
super(API, self).__init__(transport, context,
|
super(API, self).__init__(transport, context,
|
||||||
topic=cfg.CONF.conductor.topic)
|
topic=cfg.CONF.conductor.topic)
|
@ -10,19 +10,19 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
"""Config options for Higgins Backend service."""
|
"""Config options for Zun Backend service."""
|
||||||
|
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
SERVICE_OPTS = [
|
SERVICE_OPTS = [
|
||||||
cfg.StrOpt('topic',
|
cfg.StrOpt('topic',
|
||||||
default='higgins-conductor',
|
default='zun-conductor',
|
||||||
help='The queue to add conductor tasks to.'),
|
help='The queue to add conductor tasks to.'),
|
||||||
]
|
]
|
||||||
|
|
||||||
opt_group = cfg.OptGroup(
|
opt_group = cfg.OptGroup(
|
||||||
name='conductor',
|
name='conductor',
|
||||||
title='Options for the higgins-conductor service')
|
title='Options for the zun-conductor service')
|
||||||
cfg.CONF.register_group(opt_group)
|
cfg.CONF.register_group(opt_group)
|
||||||
cfg.CONF.register_opts(SERVICE_OPTS, opt_group)
|
cfg.CONF.register_opts(SERVICE_OPTS, opt_group)
|
@ -10,7 +10,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
"""Higgins Conductor default handler."""
|
"""Zun Conductor default handler."""
|
||||||
|
|
||||||
|
|
||||||
# These are the database operations - They are executed by the conductor
|
# These are the database operations - They are executed by the conductor
|
@ -22,7 +22,7 @@ from oslo_db import api as db_api
|
|||||||
import six
|
import six
|
||||||
|
|
||||||
|
|
||||||
_BACKEND_MAPPING = {'sqlalchemy': 'higgins.db.sqlalchemy.api'}
|
_BACKEND_MAPPING = {'sqlalchemy': 'zun.db.sqlalchemy.api'}
|
||||||
IMPL = db_api.DBAPI.from_config(cfg.CONF, backend_mapping=_BACKEND_MAPPING,
|
IMPL = db_api.DBAPI.from_config(cfg.CONF, backend_mapping=_BACKEND_MAPPING,
|
||||||
lazy=True)
|
lazy=True)
|
||||||
|
|
||||||
@ -41,49 +41,49 @@ class Connection(object):
|
|||||||
"""Constructor."""
|
"""Constructor."""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def destroy_higgins_service(self, higgins_service_id):
|
def destroy_zun_service(self, zun_service_id):
|
||||||
"""Destroys a higgins_service record.
|
"""Destroys a zun_service record.
|
||||||
|
|
||||||
:param higgins_service_id: The id of a higgins_service.
|
:param zun_service_id: The id of a zun_service.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def update_higgins_service(self, higgins_service_id, values):
|
def update_zun_service(self, zun_service_id, values):
|
||||||
"""Update properties of a higgins_service.
|
"""Update properties of a zun_service.
|
||||||
|
|
||||||
:param higgins_service_id: The id of a higgins_service record.
|
:param zun_service_id: The id of a zun_service record.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def get_higgins_service_by_host_and_binary(self, context, host, binary):
|
def get_zun_service_by_host_and_binary(self, context, host, binary):
|
||||||
"""Return a higgins_service record.
|
"""Return a zun_service record.
|
||||||
|
|
||||||
:param context: The security context
|
:param context: The security context
|
||||||
:param host: The host where the binary is located.
|
:param host: The host where the binary is located.
|
||||||
:param binary: The name of the binary.
|
:param binary: The name of the binary.
|
||||||
:returns: A higgins_service record.
|
:returns: A zun_service record.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def create_higgins_service(self, values):
|
def create_zun_service(self, values):
|
||||||
"""Create a new higgins_service record.
|
"""Create a new zun_service record.
|
||||||
|
|
||||||
:param values: A dict containing several items used to identify
|
:param values: A dict containing several items used to identify
|
||||||
and define the higgins_service record.
|
and define the zun_service record.
|
||||||
:returns: A higgins_service record.
|
:returns: A zun_service record.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def get_higgins_service_list(self, context, disabled=None, limit=None,
|
def get_zun_service_list(self, context, disabled=None, limit=None,
|
||||||
marker=None, sort_key=None, sort_dir=None):
|
marker=None, sort_key=None, sort_dir=None):
|
||||||
"""Get matching higgins_service records.
|
"""Get matching zun_service records.
|
||||||
|
|
||||||
Return a list of the specified columns for all higgins_services
|
Return a list of the specified columns for all zun_services
|
||||||
those match the specified filters.
|
those match the specified filters.
|
||||||
|
|
||||||
:param context: The security context
|
:param context: The security context
|
||||||
:param disabled: Filters disbaled services. Defaults to None.
|
:param disabled: Filters disbaled services. Defaults to None.
|
||||||
:param limit: Maximum number of higgins_services to return.
|
:param limit: Maximum number of zun_services to return.
|
||||||
:param marker: the last item of the previous page; we return the next
|
:param marker: the last item of the previous page; we return the next
|
||||||
result set.
|
result set.
|
||||||
:param sort_key: Attribute by which results should be sorted.
|
:param sort_key: Attribute by which results should be sorted.
|
@ -23,7 +23,7 @@ def get_backend():
|
|||||||
global _IMPL
|
global _IMPL
|
||||||
if not _IMPL:
|
if not _IMPL:
|
||||||
cfg.CONF.import_opt('backend', 'oslo_db.options', group='database')
|
cfg.CONF.import_opt('backend', 'oslo_db.options', group='database')
|
||||||
_IMPL = driver.DriverManager("higgins.database.migration_backend",
|
_IMPL = driver.DriverManager("zun.database.migration_backend",
|
||||||
cfg.CONF.database.backend).driver
|
cfg.CONF.database.backend).driver
|
||||||
return _IMPL
|
return _IMPL
|
||||||
|
|
@ -1,11 +1,11 @@
|
|||||||
Please see https://alembic.readthedocs.org/en/latest/index.html for general documentation
|
Please see https://alembic.readthedocs.org/en/latest/index.html for general documentation
|
||||||
|
|
||||||
To create alembic migrations use:
|
To create alembic migrations use:
|
||||||
$ higgins-db-manage revision --message "description of revision" --autogenerate
|
$ zun-db-manage revision --message "description of revision" --autogenerate
|
||||||
|
|
||||||
Stamp db with most recent migration version, without actually running migrations
|
Stamp db with most recent migration version, without actually running migrations
|
||||||
$ higgins-db-manage stamp head
|
$ zun-db-manage stamp head
|
||||||
|
|
||||||
Upgrade can be performed by:
|
Upgrade can be performed by:
|
||||||
$ higgins-db-manage upgrade
|
$ zun-db-manage upgrade
|
||||||
$ higgins-db-manage upgrade head
|
$ zun-db-manage upgrade head
|
@ -15,8 +15,8 @@ from __future__ import with_statement
|
|||||||
from alembic import context
|
from alembic import context
|
||||||
from logging.config import fileConfig
|
from logging.config import fileConfig
|
||||||
|
|
||||||
from higgins.db.sqlalchemy import api as sqla_api
|
from zun.db.sqlalchemy import api as sqla_api
|
||||||
from higgins.db.sqlalchemy import models
|
from zun.db.sqlalchemy import models
|
||||||
# this is the Alembic Config object, which provides
|
# this is the Alembic Config object, which provides
|
||||||
# access to the values within the .ini file in use.
|
# access to the values within the .ini file in use.
|
||||||
config = context.config
|
config = context.config
|
@ -11,7 +11,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
"""create_table_higgins_service
|
"""create_table_zun_service
|
||||||
|
|
||||||
Revision ID: a9a92eebd9a8
|
Revision ID: a9a92eebd9a8
|
||||||
Revises:
|
Revises:
|
||||||
@ -31,7 +31,7 @@ import sqlalchemy as sa
|
|||||||
|
|
||||||
def upgrade():
|
def upgrade():
|
||||||
op.create_table(
|
op.create_table(
|
||||||
'higgins_service',
|
'zun_service',
|
||||||
sa.Column('id', sa.Integer(), nullable=False),
|
sa.Column('id', sa.Integer(), nullable=False),
|
||||||
sa.Column('created_at', sa.DateTime(), nullable=True),
|
sa.Column('created_at', sa.DateTime(), nullable=True),
|
||||||
sa.Column('updated_at', sa.DateTime(), nullable=True),
|
sa.Column('updated_at', sa.DateTime(), nullable=True),
|
||||||
@ -44,5 +44,5 @@ def upgrade():
|
|||||||
sa.Column('forced_down', sa.Boolean(), nullable=True),
|
sa.Column('forced_down', sa.Boolean(), nullable=True),
|
||||||
sa.PrimaryKeyConstraint('id'),
|
sa.PrimaryKeyConstraint('id'),
|
||||||
sa.UniqueConstraint('host', 'binary',
|
sa.UniqueConstraint('host', 'binary',
|
||||||
name='uniq_higgins_service0host0binary')
|
name='uniq_zun_service0host0binary')
|
||||||
)
|
)
|
@ -21,11 +21,11 @@ from oslo_db.sqlalchemy import utils as db_utils
|
|||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
from higgins.common import exception
|
from zun.common import exception
|
||||||
from higgins.common.i18n import _
|
from zun.common.i18n import _
|
||||||
from higgins.common import utils
|
from zun.common import utils
|
||||||
from higgins.db import api
|
from zun.db import api
|
||||||
from higgins.db.sqlalchemy import models
|
from zun.db.sqlalchemy import models
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
|
||||||
@ -107,24 +107,24 @@ class Connection(api.Connection):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def destroy_higgins_service(self, higgins_service_id):
|
def destroy_zun_service(self, zun_service_id):
|
||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
query = model_query(models.HigginsService, session=session)
|
query = model_query(models.ZunService, session=session)
|
||||||
query = add_identity_filter(query, higgins_service_id)
|
query = add_identity_filter(query, zun_service_id)
|
||||||
count = query.delete()
|
count = query.delete()
|
||||||
if count != 1:
|
if count != 1:
|
||||||
raise exception.HigginsServiceNotFound(higgins_service_id)
|
raise exception.ZunServiceNotFound(zun_service_id)
|
||||||
|
|
||||||
def update_higgins_service(self, higgins_service_id, values):
|
def update_zun_service(self, zun_service_id, values):
|
||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
query = model_query(models.HigginsService, session=session)
|
query = model_query(models.ZunService, session=session)
|
||||||
query = add_identity_filter(query, higgins_service_id)
|
query = add_identity_filter(query, zun_service_id)
|
||||||
try:
|
try:
|
||||||
ref = query.with_lockmode('update').one()
|
ref = query.with_lockmode('update').one()
|
||||||
except NoResultFound:
|
except NoResultFound:
|
||||||
raise exception.HigginsServiceNotFound(higgins_service_id)
|
raise exception.ZunServiceNotFound(zun_service_id)
|
||||||
|
|
||||||
if 'report_count' in values:
|
if 'report_count' in values:
|
||||||
if values['report_count'] > ref.report_count:
|
if values['report_count'] > ref.report_count:
|
||||||
@ -133,30 +133,30 @@ class Connection(api.Connection):
|
|||||||
ref.update(values)
|
ref.update(values)
|
||||||
return ref
|
return ref
|
||||||
|
|
||||||
def get_higgins_service_by_host_and_binary(self, context, host, binary):
|
def get_zun_service_by_host_and_binary(self, context, host, binary):
|
||||||
query = model_query(models.HigginsService)
|
query = model_query(models.ZunService)
|
||||||
query = query.filter_by(host=host, binary=binary)
|
query = query.filter_by(host=host, binary=binary)
|
||||||
try:
|
try:
|
||||||
return query.one()
|
return query.one()
|
||||||
except NoResultFound:
|
except NoResultFound:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def create_higgins_service(self, values):
|
def create_zun_service(self, values):
|
||||||
higgins_service = models.HigginsService()
|
zun_service = models.ZunService()
|
||||||
higgins_service.update(values)
|
zun_service.update(values)
|
||||||
try:
|
try:
|
||||||
higgins_service.save()
|
zun_service.save()
|
||||||
except db_exc.DBDuplicateEntry:
|
except db_exc.DBDuplicateEntry:
|
||||||
raise exception.HigginsServiceAlreadyExists(
|
raise exception.ZunServiceAlreadyExists(
|
||||||
id=higgins_service['id'])
|
id=zun_service['id'])
|
||||||
return higgins_service
|
return zun_service
|
||||||
|
|
||||||
def get_higgins_service_list(self, context, disabled=None, limit=None,
|
def get_zun_service_list(self, context, disabled=None, limit=None,
|
||||||
marker=None, sort_key=None, sort_dir=None
|
marker=None, sort_key=None, sort_dir=None
|
||||||
):
|
):
|
||||||
query = model_query(models.HigginsService)
|
query = model_query(models.ZunService)
|
||||||
if disabled:
|
if disabled:
|
||||||
query = query.filter_by(disabled=disabled)
|
query = query.filter_by(disabled=disabled)
|
||||||
|
|
||||||
return _paginate_query(models.HigginsService, limit, marker,
|
return _paginate_query(models.ZunService, limit, marker,
|
||||||
sort_key, sort_dir, query)
|
sort_key, sort_dir, query)
|
@ -73,7 +73,7 @@ class JSONEncodedList(JsonEncodedType):
|
|||||||
type = list
|
type = list
|
||||||
|
|
||||||
|
|
||||||
class HigginsBase(models.TimestampMixin,
|
class ZunBase(models.TimestampMixin,
|
||||||
models.ModelBase):
|
models.ModelBase):
|
||||||
|
|
||||||
metadata = None
|
metadata = None
|
||||||
@ -85,23 +85,23 @@ class HigginsBase(models.TimestampMixin,
|
|||||||
return d
|
return d
|
||||||
|
|
||||||
def save(self, session=None):
|
def save(self, session=None):
|
||||||
import higgins.db.sqlalchemy.api as db_api
|
import zun.db.sqlalchemy.api as db_api
|
||||||
|
|
||||||
if session is None:
|
if session is None:
|
||||||
session = db_api.get_session()
|
session = db_api.get_session()
|
||||||
|
|
||||||
super(HigginsBase, self).save(session)
|
super(ZunBase, self).save(session)
|
||||||
|
|
||||||
|
|
||||||
Base = declarative_base(cls=HigginsBase)
|
Base = declarative_base(cls=ZunBase)
|
||||||
|
|
||||||
|
|
||||||
class HigginsService(Base):
|
class ZunService(Base):
|
||||||
"""Represents health status of various higgins services"""
|
"""Represents health status of various zun services"""
|
||||||
__tablename__ = 'higgins_service'
|
__tablename__ = 'zun_service'
|
||||||
__table_args__ = (
|
__table_args__ = (
|
||||||
schema.UniqueConstraint("host", "binary",
|
schema.UniqueConstraint("host", "binary",
|
||||||
name="uniq_higgins_service0host0binary"),
|
name="uniq_zun_service0host0binary"),
|
||||||
table_args()
|
table_args()
|
||||||
)
|
)
|
||||||
|
|
@ -18,7 +18,7 @@ import re
|
|||||||
"""
|
"""
|
||||||
Guidelines for writing new hacking checks
|
Guidelines for writing new hacking checks
|
||||||
|
|
||||||
- Use only for Higgins specific tests. OpenStack general tests
|
- Use only for Zun specific tests. OpenStack general tests
|
||||||
should be submitted to the common 'hacking' module.
|
should be submitted to the common 'hacking' module.
|
||||||
- Pick numbers in the range M3xx. Find the current test with
|
- Pick numbers in the range M3xx. Find the current test with
|
||||||
the highest allocated number and then pick the next value.
|
the highest allocated number and then pick the next value.
|
||||||
@ -26,7 +26,7 @@ Guidelines for writing new hacking checks
|
|||||||
- Keep the test method code in the source file ordered based
|
- Keep the test method code in the source file ordered based
|
||||||
on the M3xx value.
|
on the M3xx value.
|
||||||
- List the new rule in the top level HACKING.rst file
|
- List the new rule in the top level HACKING.rst file
|
||||||
- Add test cases for each new rule to higgins/tests/unit/test_hacking.py
|
- Add test cases for each new rule to zun/tests/unit/test_hacking.py
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
@ -11,9 +11,9 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
from higgins.objects import higgins_service
|
from zun.objects import zun_service
|
||||||
|
|
||||||
|
|
||||||
HigginsService = higgins_service.HigginsService
|
ZunService = zun_service.ZunService
|
||||||
|
|
||||||
__all__ = (HigginsService,)
|
__all__ = (ZunService,)
|
@ -12,7 +12,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
"""Higgins common internal object model"""
|
"""Zun common internal object model"""
|
||||||
|
|
||||||
from oslo_versionedobjects import base as ovoo_base
|
from oslo_versionedobjects import base as ovoo_base
|
||||||
from oslo_versionedobjects import fields as ovoo_fields
|
from oslo_versionedobjects import fields as ovoo_fields
|
||||||
@ -22,11 +22,11 @@ remotable_classmethod = ovoo_base.remotable_classmethod
|
|||||||
remotable = ovoo_base.remotable
|
remotable = ovoo_base.remotable
|
||||||
|
|
||||||
|
|
||||||
class HigginsObjectRegistry(ovoo_base.VersionedObjectRegistry):
|
class ZunObjectRegistry(ovoo_base.VersionedObjectRegistry):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class HigginsObject(ovoo_base.VersionedObject):
|
class ZunObject(ovoo_base.VersionedObject):
|
||||||
"""Base class and object factory.
|
"""Base class and object factory.
|
||||||
|
|
||||||
This forms the base of all objects that can be remoted or instantiated
|
This forms the base of all objects that can be remoted or instantiated
|
||||||
@ -35,7 +35,7 @@ class HigginsObject(ovoo_base.VersionedObject):
|
|||||||
necessary "get" classmethod routines as well as "save" object methods
|
necessary "get" classmethod routines as well as "save" object methods
|
||||||
as appropriate.
|
as appropriate.
|
||||||
"""
|
"""
|
||||||
OBJ_PROJECT_NAMESPACE = 'higgins'
|
OBJ_PROJECT_NAMESPACE = 'zun'
|
||||||
|
|
||||||
def as_dict(self):
|
def as_dict(self):
|
||||||
return {k: getattr(self, k)
|
return {k: getattr(self, k)
|
||||||
@ -43,11 +43,11 @@ class HigginsObject(ovoo_base.VersionedObject):
|
|||||||
if self.obj_attr_is_set(k)}
|
if self.obj_attr_is_set(k)}
|
||||||
|
|
||||||
|
|
||||||
class HigginsObjectDictCompat(ovoo_base.VersionedObjectDictCompat):
|
class ZunObjectDictCompat(ovoo_base.VersionedObjectDictCompat):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class HigginsPersistentObject(object):
|
class ZunPersistentObject(object):
|
||||||
"""Mixin class for Persistent objects.
|
"""Mixin class for Persistent objects.
|
||||||
|
|
||||||
This adds the fields that we use in common for all persistent objects.
|
This adds the fields that we use in common for all persistent objects.
|
||||||
@ -58,6 +58,6 @@ class HigginsPersistentObject(object):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class HigginsObjectSerializer(ovoo_base.VersionedObjectSerializer):
|
class ZunObjectSerializer(ovoo_base.VersionedObjectSerializer):
|
||||||
# Base class to use for object hydration
|
# Base class to use for object hydration
|
||||||
OBJ_BASE_CLASS = HigginsObject
|
OBJ_BASE_CLASS = ZunObject
|
@ -12,13 +12,13 @@
|
|||||||
|
|
||||||
from oslo_versionedobjects import fields
|
from oslo_versionedobjects import fields
|
||||||
|
|
||||||
from higgins.db import api as dbapi
|
from zun.db import api as dbapi
|
||||||
from higgins.objects import base
|
from zun.objects import base
|
||||||
|
|
||||||
|
|
||||||
@base.HigginsObjectRegistry.register
|
@base.ZunObjectRegistry.register
|
||||||
class HigginsService(base.HigginsPersistentObject, base.HigginsObject,
|
class ZunService(base.ZunPersistentObject, base.ZunObject,
|
||||||
base.HigginsObjectDictCompat):
|
base.ZunObjectDictCompat):
|
||||||
# Version 1.0: Initial version
|
# Version 1.0: Initial version
|
||||||
VERSION = '1.0'
|
VERSION = '1.0'
|
||||||
|
|
||||||
@ -36,88 +36,88 @@ class HigginsService(base.HigginsPersistentObject, base.HigginsObject,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(higgins_service, db_higgins_service):
|
def _from_db_object(zun_service, db_zun_service):
|
||||||
"""Converts a database entity to a formal object."""
|
"""Converts a database entity to a formal object."""
|
||||||
for field in higgins_service.fields:
|
for field in zun_service.fields:
|
||||||
higgins_service[field] = db_higgins_service[field]
|
zun_service[field] = db_zun_service[field]
|
||||||
|
|
||||||
higgins_service.obj_reset_changes()
|
zun_service.obj_reset_changes()
|
||||||
return higgins_service
|
return zun_service
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object_list(db_objects, cls, context):
|
def _from_db_object_list(db_objects, cls, context):
|
||||||
"""Converts a list of database entities to a list of formal objects."""
|
"""Converts a list of database entities to a list of formal objects."""
|
||||||
return [HigginsService._from_db_object(cls(context), obj)
|
return [ZunService._from_db_object(cls(context), obj)
|
||||||
for obj in db_objects]
|
for obj in db_objects]
|
||||||
|
|
||||||
@base.remotable_classmethod
|
@base.remotable_classmethod
|
||||||
def get_by_host_and_binary(cls, context, host, binary):
|
def get_by_host_and_binary(cls, context, host, binary):
|
||||||
"""Find a higgins_service based on its hostname and binary.
|
"""Find a zun_service based on its hostname and binary.
|
||||||
|
|
||||||
:param host: The host on which the binary is running.
|
:param host: The host on which the binary is running.
|
||||||
:param binary: The name of the binary.
|
:param binary: The name of the binary.
|
||||||
:param context: Security context.
|
:param context: Security context.
|
||||||
:returns: a :class:`HigginsService` object.
|
:returns: a :class:`ZunService` object.
|
||||||
"""
|
"""
|
||||||
db_higgins_service = cls.dbapi.get_higgins_service_by_host_and_binary(
|
db_zun_service = cls.dbapi.get_zun_service_by_host_and_binary(
|
||||||
context, host, binary)
|
context, host, binary)
|
||||||
if db_higgins_service is None:
|
if db_zun_service is None:
|
||||||
return None
|
return None
|
||||||
higgins_service = HigginsService._from_db_object(
|
zun_service = ZunService._from_db_object(
|
||||||
cls(context), db_higgins_service)
|
cls(context), db_zun_service)
|
||||||
return higgins_service
|
return zun_service
|
||||||
|
|
||||||
@base.remotable_classmethod
|
@base.remotable_classmethod
|
||||||
def list(cls, context, limit=None, marker=None,
|
def list(cls, context, limit=None, marker=None,
|
||||||
sort_key=None, sort_dir=None):
|
sort_key=None, sort_dir=None):
|
||||||
"""Return a list of HigginsService objects.
|
"""Return a list of ZunService objects.
|
||||||
|
|
||||||
:param context: Security context.
|
:param context: Security context.
|
||||||
:param limit: maximum number of resources to return in a single result.
|
:param limit: maximum number of resources to return in a single result.
|
||||||
:param marker: pagination marker for large data sets.
|
:param marker: pagination marker for large data sets.
|
||||||
:param sort_key: column to sort results by.
|
:param sort_key: column to sort results by.
|
||||||
:param sort_dir: direction to sort. "asc" or "desc".
|
:param sort_dir: direction to sort. "asc" or "desc".
|
||||||
:returns: a list of :class:`HigginsService` object.
|
:returns: a list of :class:`ZunService` object.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
db_higgins_services = cls.dbapi.get_higgins_service_list(
|
db_zun_services = cls.dbapi.get_zun_service_list(
|
||||||
context, limit=limit, marker=marker, sort_key=sort_key,
|
context, limit=limit, marker=marker, sort_key=sort_key,
|
||||||
sort_dir=sort_dir)
|
sort_dir=sort_dir)
|
||||||
return HigginsService._from_db_object_list(db_higgins_services, cls,
|
return ZunService._from_db_object_list(db_zun_services, cls,
|
||||||
context)
|
context)
|
||||||
|
|
||||||
@base.remotable
|
@base.remotable
|
||||||
def create(self, context=None):
|
def create(self, context=None):
|
||||||
"""Create a HigginsService record in the DB.
|
"""Create a ZunService record in the DB.
|
||||||
|
|
||||||
:param context: Security context. NOTE: This should only
|
:param context: Security context. NOTE: This should only
|
||||||
be used internally by the indirection_api.
|
be used internally by the indirection_api.
|
||||||
Unfortunately, RPC requires context as the first
|
Unfortunately, RPC requires context as the first
|
||||||
argument, even though we don't use it.
|
argument, even though we don't use it.
|
||||||
A context should be set when instantiating the
|
A context should be set when instantiating the
|
||||||
object, e.g.: HigginsService(context)
|
object, e.g.: ZunService(context)
|
||||||
"""
|
"""
|
||||||
values = self.obj_get_changes()
|
values = self.obj_get_changes()
|
||||||
db_higgins_service = self.dbapi.create_higgins_service(values)
|
db_zun_service = self.dbapi.create_zun_service(values)
|
||||||
self._from_db_object(self, db_higgins_service)
|
self._from_db_object(self, db_zun_service)
|
||||||
|
|
||||||
@base.remotable
|
@base.remotable
|
||||||
def destroy(self, context=None):
|
def destroy(self, context=None):
|
||||||
"""Delete the HigginsService from the DB.
|
"""Delete the ZunService from the DB.
|
||||||
|
|
||||||
:param context: Security context. NOTE: This should only
|
:param context: Security context. NOTE: This should only
|
||||||
be used internally by the indirection_api.
|
be used internally by the indirection_api.
|
||||||
Unfortunately, RPC requires context as the first
|
Unfortunately, RPC requires context as the first
|
||||||
argument, even though we don't use it.
|
argument, even though we don't use it.
|
||||||
A context should be set when instantiating the
|
A context should be set when instantiating the
|
||||||
object, e.g.: HigginsService(context)
|
object, e.g.: ZunService(context)
|
||||||
"""
|
"""
|
||||||
self.dbapi.destroy_higgins_service(self.id)
|
self.dbapi.destroy_zun_service(self.id)
|
||||||
self.obj_reset_changes()
|
self.obj_reset_changes()
|
||||||
|
|
||||||
@base.remotable
|
@base.remotable
|
||||||
def save(self, context=None):
|
def save(self, context=None):
|
||||||
"""Save updates to this HigginsService.
|
"""Save updates to this ZunService.
|
||||||
|
|
||||||
Updates will be made column by column based on the result
|
Updates will be made column by column based on the result
|
||||||
of self.what_changed().
|
of self.what_changed().
|
||||||
@ -127,22 +127,22 @@ class HigginsService(base.HigginsPersistentObject, base.HigginsObject,
|
|||||||
Unfortunately, RPC requires context as the first
|
Unfortunately, RPC requires context as the first
|
||||||
argument, even though we don't use it.
|
argument, even though we don't use it.
|
||||||
A context should be set when instantiating the
|
A context should be set when instantiating the
|
||||||
object, e.g.: HigginsService(context)
|
object, e.g.: ZunService(context)
|
||||||
"""
|
"""
|
||||||
updates = self.obj_get_changes()
|
updates = self.obj_get_changes()
|
||||||
self.dbapi.update_higgins_service(self.id, updates)
|
self.dbapi.update_zun_service(self.id, updates)
|
||||||
self.obj_reset_changes()
|
self.obj_reset_changes()
|
||||||
|
|
||||||
@base.remotable
|
@base.remotable
|
||||||
def report_state_up(self, context=None):
|
def report_state_up(self, context=None):
|
||||||
"""Touching the higgins_service record to show aliveness.
|
"""Touching the zun_service record to show aliveness.
|
||||||
|
|
||||||
:param context: Security context. NOTE: This should only
|
:param context: Security context. NOTE: This should only
|
||||||
be used internally by the indirection_api.
|
be used internally by the indirection_api.
|
||||||
Unfortunately, RPC requires context as the first
|
Unfortunately, RPC requires context as the first
|
||||||
argument, even though we don't use it.
|
argument, even though we don't use it.
|
||||||
A context should be set when instantiating the
|
A context should be set when instantiating the
|
||||||
object, e.g.: HigginsService(context)
|
object, e.g.: ZunService(context)
|
||||||
"""
|
"""
|
||||||
self.report_count += 1
|
self.report_count += 1
|
||||||
self.save()
|
self.save()
|
@ -12,21 +12,21 @@
|
|||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
|
|
||||||
import higgins.api.app
|
import zun.api.app
|
||||||
import higgins.common.keystone
|
import zun.common.keystone
|
||||||
import higgins.common.rpc_service
|
import zun.common.rpc_service
|
||||||
import higgins.common.service
|
import zun.common.service
|
||||||
import higgins.conductor.config
|
import zun.conductor.config
|
||||||
|
|
||||||
|
|
||||||
def list_opts():
|
def list_opts():
|
||||||
return [
|
return [
|
||||||
('DEFAULT',
|
('DEFAULT',
|
||||||
itertools.chain(
|
itertools.chain(
|
||||||
higgins.common.rpc_service.periodic_opts,
|
zun.common.rpc_service.periodic_opts,
|
||||||
higgins.common.service.service_opts,
|
zun.common.service.service_opts,
|
||||||
)),
|
)),
|
||||||
('api', higgins.api.app.API_SERVICE_OPTS),
|
('api', zun.api.app.API_SERVICE_OPTS),
|
||||||
('conductor', higgins.conductor.config.SERVICE_OPTS),
|
('conductor', zun.conductor.config.SERVICE_OPTS),
|
||||||
('keystone_auth', higgins.common.keystone.keystone_auth_opts),
|
('keystone_auth', zun.common.keystone.keystone_auth_opts),
|
||||||
]
|
]
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
from higgins.common import context
|
from zun.common import context
|
||||||
|
|
||||||
|
|
||||||
def set_context(func):
|
def set_context(func):
|
@ -10,51 +10,51 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
"""Higgins Service Layer"""
|
"""Zun Service Layer"""
|
||||||
|
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
from oslo_service import periodic_task
|
from oslo_service import periodic_task
|
||||||
|
|
||||||
from higgins import objects
|
from zun import objects
|
||||||
from higgins.service import periodic
|
from zun.service import periodic
|
||||||
|
|
||||||
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class HigginsServicePeriodicTasks(periodic_task.PeriodicTasks):
|
class ZunServicePeriodicTasks(periodic_task.PeriodicTasks):
|
||||||
'''Higgins periodic Task class
|
'''Zun periodic Task class
|
||||||
|
|
||||||
Any periodic task job need to be added into this class
|
Any periodic task job need to be added into this class
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def __init__(self, conf, binary):
|
def __init__(self, conf, binary):
|
||||||
self.higgins_service_ref = None
|
self.zun_service_ref = None
|
||||||
self.host = conf.host
|
self.host = conf.host
|
||||||
self.binary = binary
|
self.binary = binary
|
||||||
super(HigginsServicePeriodicTasks, self).__init__(conf)
|
super(ZunServicePeriodicTasks, self).__init__(conf)
|
||||||
|
|
||||||
@periodic_task.periodic_task(run_immediately=True)
|
@periodic_task.periodic_task(run_immediately=True)
|
||||||
@periodic.set_context
|
@periodic.set_context
|
||||||
def update_higgins_service(self, ctx):
|
def update_zun_service(self, ctx):
|
||||||
LOG.debug('Update higgins_service')
|
LOG.debug('Update zun_service')
|
||||||
if self.higgins_service_ref is None:
|
if self.zun_service_ref is None:
|
||||||
self.higgins_service_ref = \
|
self.zun_service_ref = \
|
||||||
objects.HigginsService.get_by_host_and_binary(
|
objects.ZunService.get_by_host_and_binary(
|
||||||
ctx, self.host, self.binary)
|
ctx, self.host, self.binary)
|
||||||
if self.higgins_service_ref is None:
|
if self.zun_service_ref is None:
|
||||||
higgins_service_dict = {
|
zun_service_dict = {
|
||||||
'host': self.host,
|
'host': self.host,
|
||||||
'binary': self.binary
|
'binary': self.binary
|
||||||
}
|
}
|
||||||
self.higgins_service_ref = objects.HigginsService(
|
self.zun_service_ref = objects.ZunService(
|
||||||
ctx, **higgins_service_dict)
|
ctx, **zun_service_dict)
|
||||||
self.higgins_service_ref.create()
|
self.zun_service_ref.create()
|
||||||
self.higgins_service_ref.report_state_up()
|
self.zun_service_ref.report_state_up()
|
||||||
|
|
||||||
|
|
||||||
def setup(conf, binary, tg):
|
def setup(conf, binary, tg):
|
||||||
pt = HigginsServicePeriodicTasks(conf, binary)
|
pt = ZunServicePeriodicTasks(conf, binary)
|
||||||
tg.add_dynamic_timer(
|
tg.add_dynamic_timer(
|
||||||
pt.run_periodic_tasks,
|
pt.run_periodic_tasks,
|
||||||
periodic_interval_max=conf.periodic_interval_max,
|
periodic_interval_max=conf.periodic_interval_max,
|
@ -17,7 +17,7 @@ from oslo_config import cfg
|
|||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
from oslotest import base
|
from oslotest import base
|
||||||
|
|
||||||
from higgins.tests import conf_fixture
|
from zun.tests import conf_fixture
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
@ -17,10 +17,10 @@
|
|||||||
import fixtures
|
import fixtures
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
# from higgins.common import config
|
# from zun.common import config
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
CONF.import_opt('host', 'higgins.common.service')
|
CONF.import_opt('host', 'zun.common.service')
|
||||||
|
|
||||||
|
|
||||||
class ConfFixture(fixtures.Fixture):
|
class ConfFixture(fixtures.Fixture):
|
73
zun/tests/unit/servicegroup/test_zun_service.py
Normal file
73
zun/tests/unit/servicegroup/test_zun_service.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# 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 mock
|
||||||
|
|
||||||
|
from zun.common.rpc_service import CONF
|
||||||
|
from zun import objects
|
||||||
|
from zun.servicegroup import zun_service_periodic as periodic
|
||||||
|
from zun.tests import base
|
||||||
|
|
||||||
|
|
||||||
|
class ZunServicePeriodicTestCase(base.BaseTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(ZunServicePeriodicTestCase, self).setUp()
|
||||||
|
mock_zun_service_refresh = mock.Mock()
|
||||||
|
|
||||||
|
class FakeSrv(object):
|
||||||
|
report_state_up = mock_zun_service_refresh
|
||||||
|
|
||||||
|
self.fake_srv = FakeSrv()
|
||||||
|
self.fake_srv_refresh = mock_zun_service_refresh
|
||||||
|
|
||||||
|
@mock.patch.object(objects.ZunService, 'get_by_host_and_binary')
|
||||||
|
@mock.patch.object(objects.ZunService, 'create')
|
||||||
|
@mock.patch.object(objects.ZunService, 'report_state_up')
|
||||||
|
def test_update_zun_service_firsttime(self,
|
||||||
|
mock_srv_refresh,
|
||||||
|
mock_srv_create,
|
||||||
|
mock_srv_get
|
||||||
|
):
|
||||||
|
p_task = periodic.ZunServicePeriodicTasks(CONF,
|
||||||
|
'fake-conductor')
|
||||||
|
mock_srv_get.return_value = None
|
||||||
|
|
||||||
|
p_task.update_zun_service(None)
|
||||||
|
|
||||||
|
mock_srv_get.assert_called_once_with(mock.ANY, p_task.host,
|
||||||
|
p_task.binary)
|
||||||
|
mock_srv_create.assert_called_once_with()
|
||||||
|
mock_srv_refresh.assert_called_once_with()
|
||||||
|
|
||||||
|
@mock.patch.object(objects.ZunService, 'get_by_host_and_binary')
|
||||||
|
@mock.patch.object(objects.ZunService, 'create')
|
||||||
|
def test_update_zun_service_on_restart(self,
|
||||||
|
mock_srv_create,
|
||||||
|
mock_srv_get):
|
||||||
|
p_task = periodic.ZunServicePeriodicTasks(CONF,
|
||||||
|
'fake-conductor')
|
||||||
|
mock_srv_get.return_value = self.fake_srv
|
||||||
|
|
||||||
|
p_task.update_zun_service(None)
|
||||||
|
|
||||||
|
mock_srv_get.assert_called_once_with(mock.ANY, p_task.host,
|
||||||
|
p_task.binary)
|
||||||
|
self.fake_srv_refresh.assert_called_once_with()
|
||||||
|
|
||||||
|
def test_update_zun_service_regular(self):
|
||||||
|
p_task = periodic.ZunServicePeriodicTasks(CONF,
|
||||||
|
'fake-conductor')
|
||||||
|
p_task.zun_service_ref = self.fake_srv
|
||||||
|
|
||||||
|
p_task.update_zun_service(None)
|
||||||
|
|
||||||
|
self.fake_srv_refresh.assert_called_once_with()
|
@ -17,14 +17,14 @@ import textwrap
|
|||||||
import mock
|
import mock
|
||||||
import pep8
|
import pep8
|
||||||
|
|
||||||
from higgins.hacking import checks
|
from zun.hacking import checks
|
||||||
from higgins.tests import base
|
from zun.tests import base
|
||||||
|
|
||||||
|
|
||||||
class HackingTestCase(base.BaseTestCase):
|
class HackingTestCase(base.BaseTestCase):
|
||||||
"""Hacking test class.
|
"""Hacking test class.
|
||||||
|
|
||||||
This class tests the hacking checks higgins .hacking.checks by passing
|
This class tests the hacking checks zun .hacking.checks by passing
|
||||||
strings to the check methods like the pep8/flake8 parser would. The parser
|
strings to the check methods like the pep8/flake8 parser would. The parser
|
||||||
loops over each line in the file and then passes the parameters to the
|
loops over each line in the file and then passes the parameters to the
|
||||||
check method. The parameter names in the check method dictate what type of
|
check method. The parameter names in the check method dictate what type of
|
@ -13,16 +13,16 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
test_higgins
|
test_zun
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
Tests for `higgins` module.
|
Tests for `zun` module.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from higgins.tests import base
|
from zun.tests import base
|
||||||
|
|
||||||
|
|
||||||
class TestHiggins(base.BaseTestCase):
|
class TestZun(base.BaseTestCase):
|
||||||
|
|
||||||
def test_something(self):
|
def test_something(self):
|
||||||
pass
|
pass
|
@ -13,5 +13,5 @@
|
|||||||
|
|
||||||
from pbr import version as pbr_version
|
from pbr import version as pbr_version
|
||||||
|
|
||||||
version_info = pbr_version.VersionInfo('higgins')
|
version_info = pbr_version.VersionInfo('zun')
|
||||||
version_string = version_info.version_string
|
version_string = version_info.version_string
|
Loading…
Reference in New Issue
Block a user