Compare commits

..

13 Commits

Author SHA1 Message Date
OpenDev Sysadmins
8d5e816eaa OpenDev Migration Patch
This commit was bulk generated and pushed by the OpenDev sysadmins
as a part of the Git hosting and code review systems migration
detailed in these mailing list posts:

http://lists.openstack.org/pipermail/openstack-discuss/2019-March/003603.html
http://lists.openstack.org/pipermail/openstack-discuss/2019-April/004920.html

Attempts have been made to correct repository namespaces and
hostnames based on simple pattern matching, but it's possible some
were updated incorrectly or missed entirely. Please reach out to us
via the contact information listed at https://opendev.org/ with any
questions you may have.
2019-04-19 19:40:45 +00:00
Ian Wienand
9c3736cb1b Replace openstack.org git:// URLs with https://
This is a mechanically generated change to replace openstack.org
git:// URLs with https:// equivalents.

This is in aid of a planned future move of the git hosting
infrastructure to a self-hosted instance of gitea (https://gitea.io),
which does not support the git wire protocol at this stage.

This update should result in no functional change.

For more information see the thread at

 http://lists.openstack.org/pipermail/openstack-discuss/2019-March/003825.html

Change-Id: I9e141aa8e7387a2a8d96fce1d3f54a159d33f4d9
2019-03-24 20:36:25 +00:00
Nguyen Hai
520cdb3c51 import zuul job settings from project-config
This is a mechanically generated patch to complete step 1 of moving
the zuul job settings out of project-config and into each project
repository.

Because there will be a separate patch on each branch, the branch
specifiers for branch-specific jobs have been removed.

Because this patch is generated by a script, there may be some
cosmetic changes to the layout of the YAML file(s) as the contents are
normalized.

See the python3-first goal document for details:
https://governance.openstack.org/tc/goals/stein/python3-first.html

Change-Id: I3e87bc419d17348c71733c79016a27fa6c00955c
Story: #2002586
Task: #24344
2018-08-19 00:58:37 +09:00
OpenStack Proposal Bot
4d8d1cd356 Updated from global requirements
Change-Id: I8c3d97e4003ecc5aeeb1b5304fcb36a58367fa9f
2017-05-15 23:41:13 +00:00
OpenStack Proposal Bot
6d4fb3c3eb Updated from global requirements
Change-Id: Idb62b9824ccd8cad7a4084bd085ccf014d5610fa
2017-03-09 18:26:17 +00:00
Jenkins
1caf89686c Merge "Add checking audit state" into stable/ocata 2017-02-16 13:53:58 +00:00
Hidekazu Nakamura
ed3224835a Add checking audit state
This patch adds checking audit state when updating an existing audit
in accordance with audit state machine.

Closes-Bug: #1662406

Change-Id: I20610c83169b77f141974a5cebe33818a4bf0728
(cherry picked from commit 0d83354c57)
2017-02-16 13:16:06 +00:00
ericxiett
8a7e316f73 Fix that remove 'strategy' attribute does not work.
The 'strategy_id' attribute is the one that not exposes
to API. But the 'PATCH' API always update this attribute.
So this change does not work when choose 'remove' op.
This patch sets value for 'strategy_id' attribute.

Change-Id: I1597fb5d4985bb8271ad3cea7ea5f0adb7de65f4
Closes-Bug: #1662395
(cherry picked from commit e55c73be0e)
2017-02-16 13:15:48 +00:00
Jenkins
112ac3bbdf Merge "Fix log level error to warning" into stable/ocata 2017-02-14 10:27:17 +00:00
licanwei
d1ab697612 Fix the mapping between the instance and the node
The argument to the add_edge function should be instance.uuid
and node.uuid, not instance and node

Change-Id: Ida694f9158d3eb26e7f31062a18844472ea3c6fa
Closes-Bug: #1662810
2017-02-08 15:37:01 +00:00
Hidekazu Nakamura
095ca0ffb2 Fix log level error to warning
When action plan is currently running, new action plan is set as
SUPERSEDED and error log reported. This patch changes log level
from error to warning.

Change-Id: I931218843d8f09340bd5363256164807d514446b
Closes-Bug: #1662450
(cherry picked from commit 58711aaaec)
2017-02-08 00:05:44 +00:00
OpenStack Release Bot
e1131a65d8 Update UPPER_CONSTRAINTS_FILE for stable/ocata
Change-Id: Ie56e3186f2c9e42aff817fc7c71c4da93abb1c5f
2017-02-02 18:23:36 +00:00
OpenStack Release Bot
5e507e56f4 Update .gitreview for stable/ocata
Change-Id: I5a431c04e85183baf05736de3920d6610d4add03
2017-02-02 18:23:36 +00:00
305 changed files with 2129 additions and 10662 deletions

9
.gitignore vendored
View File

@@ -4,7 +4,8 @@
*.so *.so
# Packages # Packages
*.egg* *.egg
*.egg-info
dist dist
build build
eggs eggs
@@ -42,11 +43,9 @@ output/*/index.html
# Sphinx # Sphinx
doc/build doc/build
doc/source/api/* doc/source/api
doc/source/samples doc/source/samples
doc/source/_static/*.sample doc/source/watcher.conf.sample
!doc/source/api/index.rst
!doc/source/api/v1.rst
# pbr generates these # pbr generates these
AUTHORS AUTHORS

View File

@@ -1,4 +1,5 @@
[gerrit] [gerrit]
host=review.openstack.org host=review.opendev.org
port=29418 port=29418
project=openstack/watcher.git project=openstack/watcher.git
defaultbranch=stable/ocata

9
.zuul.yaml Normal file
View File

@@ -0,0 +1,9 @@
- project:
templates:
- openstack-python-jobs
- openstack-python35-jobs
- publish-openstack-sphinx-docs
- check-requirements
- release-notes-jobs
gate:
queue: watcher

View File

@@ -1,13 +1,13 @@
If you would like to contribute to the development of OpenStack, If you would like to contribute to the development of OpenStack,
you must follow the steps in this page: you must follow the steps in this page:
https://docs.openstack.org/infra/manual/developers.html http://docs.openstack.org/infra/manual/developers.html
Once those steps have been completed, changes to OpenStack Once those steps have been completed, changes to OpenStack
should be submitted for review via the Gerrit tool, following should be submitted for review via the Gerrit tool, following
the workflow documented at: the workflow documented at:
https://docs.openstack.org/infra/manual/developers.html#development-workflow http://docs.openstack.org/infra/manual/developers.html#development-workflow
Pull requests submitted through GitHub will be ignored. Pull requests submitted through GitHub will be ignored.

View File

@@ -8,4 +8,4 @@
watcher Style Commandments watcher Style Commandments
========================== ==========================
Read the OpenStack Style Commandments https://docs.openstack.org/developer/hacking/ Read the OpenStack Style Commandments http://docs.openstack.org/developer/hacking/

View File

@@ -2,8 +2,8 @@
Team and repository tags Team and repository tags
======================== ========================
.. image:: https://governance.openstack.org/badges/watcher.svg .. image:: http://governance.openstack.org/badges/watcher.svg
:target: https://governance.openstack.org/reference/tags/index.html :target: http://governance.openstack.org/reference/tags/index.html
.. Change things from this point on .. Change things from this point on
@@ -25,7 +25,7 @@ operating costs, increased system performance via intelligent virtual machine
migration, increased energy efficiency-and more! migration, increased energy efficiency-and more!
* Free software: Apache license * Free software: Apache license
* Wiki: https://wiki.openstack.org/wiki/Watcher * Wiki: http://wiki.openstack.org/wiki/Watcher
* Source: https://github.com/openstack/watcher * Source: https://github.com/openstack/watcher
* Bugs: https://bugs.launchpad.net/watcher * Bugs: http://bugs.launchpad.net/watcher
* Documentation: https://docs.openstack.org/watcher/latest/ * Documentation: http://docs.openstack.org/developer/watcher/

View File

@@ -1,42 +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.
# This is an example Apache2 configuration file for using the
# Watcher API through mod_wsgi. This version assumes you are
# running devstack to configure the software.
Listen %WATCHER_SERVICE_PORT%
<VirtualHost *:%WATCHER_SERVICE_PORT%>
WSGIDaemonProcess watcher-api user=%USER% processes=%APIWORKERS% threads=1 display-name=%{GROUP}
WSGIScriptAlias / %WATCHER_WSGI_DIR%/app.wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIProcessGroup watcher-api
WSGIPassAuthorization On
ErrorLogFormat "%M"
ErrorLog /var/log/%APACHE_NAME%/watcher-api.log
CustomLog /var/log/%APACHE_NAME%/watcher-api-access.log combined
<Directory %WATCHER_WSGI_DIR%>
WSGIProcessGroup watcher-api
WSGIApplicationGroup %{GLOBAL}
<IfVersion >= 2.4>
Require all granted
</IfVersion>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
</VirtualHost>

View File

@@ -44,9 +44,6 @@ WATCHER_CONF_DIR=/etc/watcher
WATCHER_CONF=$WATCHER_CONF_DIR/watcher.conf WATCHER_CONF=$WATCHER_CONF_DIR/watcher.conf
WATCHER_POLICY_JSON=$WATCHER_CONF_DIR/policy.json WATCHER_POLICY_JSON=$WATCHER_CONF_DIR/policy.json
WATCHER_DEVSTACK_DIR=$WATCHER_DIR/devstack
WATCHER_DEVSTACK_FILES_DIR=$WATCHER_DEVSTACK_DIR/files
NOVA_CONF_DIR=/etc/nova NOVA_CONF_DIR=/etc/nova
NOVA_CONF=$NOVA_CONF_DIR/nova.conf NOVA_CONF=$NOVA_CONF_DIR/nova.conf
@@ -54,13 +51,6 @@ if is_ssl_enabled_service "watcher" || is_service_enabled tls-proxy; then
WATCHER_SERVICE_PROTOCOL="https" WATCHER_SERVICE_PROTOCOL="https"
fi fi
WATCHER_USE_MOD_WSGI=$(trueorfalse True WATCHER_USE_MOD_WSGI)
if is_suse; then
WATCHER_WSGI_DIR=${WATCHER_WSGI_DIR:-/srv/www/htdocs/watcher}
else
WATCHER_WSGI_DIR=${WATCHER_WSGI_DIR:-/var/www/watcher}
fi
# Public facing bits # Public facing bits
WATCHER_SERVICE_HOST=${WATCHER_SERVICE_HOST:-$HOST_IP} WATCHER_SERVICE_HOST=${WATCHER_SERVICE_HOST:-$HOST_IP}
WATCHER_SERVICE_PORT=${WATCHER_SERVICE_PORT:-9322} WATCHER_SERVICE_PORT=${WATCHER_SERVICE_PORT:-9322}
@@ -84,21 +74,10 @@ function is_watcher_enabled {
return 1 return 1
} }
#_cleanup_watcher_apache_wsgi - Remove wsgi files,
#disable and remove apache vhost file
function _cleanup_watcher_apache_wsgi {
sudo rm -rf $WATCHER_WSGI_DIR
sudo rm -f $(apache_site_config_for watcher-api)
restart_apache_server
}
# cleanup_watcher() - Remove residual data files, anything left over from previous # cleanup_watcher() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up # runs that a clean run would need to clean up
function cleanup_watcher { function cleanup_watcher {
sudo rm -rf $WATCHER_STATE_PATH $WATCHER_AUTH_CACHE_DIR sudo rm -rf $WATCHER_STATE_PATH $WATCHER_AUTH_CACHE_DIR
if [[ "$WATCHER_USE_MOD_WSGI" == "True" ]]; then
_cleanup_watcher_apache_wsgi
fi
} }
# configure_watcher() - Set config files, create data dirs, etc # configure_watcher() - Set config files, create data dirs, etc
@@ -129,28 +108,6 @@ function create_watcher_accounts {
"$WATCHER_SERVICE_PROTOCOL://$WATCHER_SERVICE_HOST:$WATCHER_SERVICE_PORT" "$WATCHER_SERVICE_PROTOCOL://$WATCHER_SERVICE_HOST:$WATCHER_SERVICE_PORT"
} }
# _config_watcher_apache_wsgi() - Set WSGI config files of watcher
function _config_watcher_apache_wsgi {
local watcher_apache_conf
if [[ "$WATCHER_USE_MOD_WSGI" == "True" ]]; then
sudo mkdir -p $WATCHER_WSGI_DIR
sudo cp $WATCHER_DIR/watcher/api/app.wsgi $WATCHER_WSGI_DIR/app.wsgi
watcher_apache_conf=$(apache_site_config_for watcher-api)
sudo cp $WATCHER_DEVSTACK_FILES_DIR/apache-watcher-api.template $watcher_apache_conf
sudo sed -e "
s|%WATCHER_SERVICE_PORT%|$WATCHER_SERVICE_PORT|g;
s|%WATCHER_WSGI_DIR%|$WATCHER_WSGI_DIR|g;
s|%USER%|$STACK_USER|g;
s|%APIWORKERS%|$API_WORKERS|g;
s|%APACHE_NAME%|$APACHE_NAME|g;
" -i $watcher_apache_conf
enable_apache_site watcher-api
tail_log watcher-access /var/log/$APACHE_NAME/watcher-api-access.log
tail_log watcher-api /var/log/$APACHE_NAME/watcher-api.log
fi
}
# create_watcher_conf() - Create a new watcher.conf file # create_watcher_conf() - Create a new watcher.conf file
function create_watcher_conf { function create_watcher_conf {
# (Re)create ``watcher.conf`` # (Re)create ``watcher.conf``
@@ -169,7 +126,7 @@ function create_watcher_conf {
iniset $WATCHER_CONF oslo_messaging_rabbit rabbit_password $RABBIT_PASSWORD iniset $WATCHER_CONF oslo_messaging_rabbit rabbit_password $RABBIT_PASSWORD
iniset $WATCHER_CONF oslo_messaging_rabbit rabbit_host $RABBIT_HOST iniset $WATCHER_CONF oslo_messaging_rabbit rabbit_host $RABBIT_HOST
iniset $WATCHER_CONF oslo_messaging_notifications driver "messagingv2" iniset $WATCHER_CONF oslo_messaging_notifications driver "messaging"
iniset $NOVA_CONF oslo_messaging_notifications topics "notifications,watcher_notifications" iniset $NOVA_CONF oslo_messaging_notifications topics "notifications,watcher_notifications"
iniset $NOVA_CONF notifications notify_on_state_change "vm_and_task_state" iniset $NOVA_CONF notifications notify_on_state_change "vm_and_task_state"
@@ -197,13 +154,9 @@ function create_watcher_conf {
setup_colorized_logging $WATCHER_CONF DEFAULT setup_colorized_logging $WATCHER_CONF DEFAULT
else else
# Show user_name and project_name instead of user_id and project_id # Show user_name and project_name instead of user_id and project_id
iniset $WATCHER_CONF DEFAULT logging_context_format_string "%(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s %(project_domain)s %(user_name)s %(project_name)s] %(instance)s%(message)s" iniset $WATCHER_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 fi
#config apache files
if [[ "$WATCHER_USE_MOD_WSGI" == "True" ]]; then
_config_watcher_apache_wsgi
fi
# Register SSL certificates if provided # Register SSL certificates if provided
if is_ssl_enabled_service watcher; then if is_ssl_enabled_service watcher; then
ensure_certificates WATCHER ensure_certificates WATCHER
@@ -235,7 +188,7 @@ function init_watcher {
recreate_database watcher recreate_database watcher
# Create watcher schema # Create watcher schema
$WATCHER_BIN_DIR/watcher-db-manage --config-file $WATCHER_CONF upgrade $WATCHER_BIN_DIR/watcher-db-manage --config-file $WATCHER_CONF upgrade head
fi fi
create_watcher_cache_dir create_watcher_cache_dir
} }
@@ -252,26 +205,19 @@ function install_watcherclient {
function install_watcher { function install_watcher {
git_clone $WATCHER_REPO $WATCHER_DIR $WATCHER_BRANCH git_clone $WATCHER_REPO $WATCHER_DIR $WATCHER_BRANCH
setup_develop $WATCHER_DIR setup_develop $WATCHER_DIR
if [[ "$WATCHER_USE_MOD_WSGI" == "True" ]]; then
install_apache_wsgi
fi
} }
# start_watcher_api() - Start the API process ahead of other things # start_watcher_api() - Start the API process ahead of other things
function start_watcher_api { function start_watcher_api {
# Get right service port for testing # Get right service port for testing
local service_port=$WATCHER_SERVICE_PORT local service_port=$WATCHER_SERVICE_PORT
local service_protocol=$WATCHER_SERVICE_PROTOCOL local service_protocol=$WATCHER_SERVICE_PROTOCOL
if is_service_enabled tls-proxy; then if is_service_enabled tls-proxy; then
service_port=$WATCHER_SERVICE_PORT_INT service_port=$WATCHER_SERVICE_PORT_INT
service_protocol="http" service_protocol="http"
fi fi
if [[ "$WATCHER_USE_MOD_WSGI" == "True" ]]; then
restart_apache_server run_process watcher-api "$WATCHER_BIN_DIR/watcher-api --config-file $WATCHER_CONF"
else
run_process watcher-api "$WATCHER_BIN_DIR/watcher-api --config-file $WATCHER_CONF"
fi
echo "Waiting for watcher-api to start..." echo "Waiting for watcher-api to start..."
if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$WATCHER_SERVICE_HOST:$service_port; then if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$WATCHER_SERVICE_HOST:$service_port; then
die $LINENO "watcher-api did not start" die $LINENO "watcher-api did not start"
@@ -294,12 +240,7 @@ function start_watcher {
# stop_watcher() - Stop running processes (non-screen) # stop_watcher() - Stop running processes (non-screen)
function stop_watcher { function stop_watcher {
if [[ "$WATCHER_USE_MOD_WSGI" == "True" ]]; then for serv in watcher-api watcher-decision-engine watcher-applier; do
disable_apache_site watcher-api
else
stop_process watcher-api
fi
for serv in watcher-decision-engine watcher-applier; do
stop_process $serv stop_process $serv
done done
} }

View File

@@ -25,7 +25,7 @@ GLANCE_HOSTPORT=${SERVICE_HOST}:9292
DATABASE_TYPE=mysql DATABASE_TYPE=mysql
# Enable services (including neutron) # Enable services (including neutron)
ENABLED_SERVICES=n-cpu,n-api-meta,c-vol,q-agt,placement-client ENABLED_SERVICES=n-cpu,n-api-meta,c-vol,q-agt
NOVA_VNC_ENABLED=True NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html" NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
@@ -35,7 +35,7 @@ VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP
NOVA_INSTANCES_PATH=/opt/stack/data/instances NOVA_INSTANCES_PATH=/opt/stack/data/instances
# Enable the Ceilometer plugin for the compute agent # Enable the Ceilometer plugin for the compute agent
enable_plugin ceilometer git://git.openstack.org/openstack/ceilometer enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer
disable_service ceilometer-acentral,ceilometer-collector,ceilometer-api disable_service ceilometer-acentral,ceilometer-collector,ceilometer-api
LOGFILE=$DEST/logs/stack.sh.log LOGFILE=$DEST/logs/stack.sh.log

View File

@@ -17,10 +17,6 @@ NETWORK_GATEWAY=10.254.1.1 # Change this for your network
MULTI_HOST=1 MULTI_HOST=1
#Set this to FALSE if do not want to run watcher-api behind mod-wsgi
#WATCHER_USE_MOD_WSGI=TRUE
# This is the controller node, so disable nova-compute # This is the controller node, so disable nova-compute
disable_service n-cpu disable_service n-cpu
@@ -32,21 +28,16 @@ ENABLED_SERVICES+=,q-svc,q-dhcp,q-meta,q-agt,q-l3,neutron
enable_service n-cauth enable_service n-cauth
# Enable the Watcher Dashboard plugin # Enable the Watcher Dashboard plugin
enable_plugin watcher-dashboard git://git.openstack.org/openstack/watcher-dashboard # enable_plugin watcher-dashboard https://git.openstack.org/openstack/watcher-dashboard
# Enable the Watcher plugin # Enable the Watcher plugin
enable_plugin watcher git://git.openstack.org/openstack/watcher enable_plugin watcher https://git.openstack.org/openstack/watcher
# Enable the Ceilometer plugin # Enable the Ceilometer plugin
enable_plugin ceilometer git://git.openstack.org/openstack/ceilometer enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer
# This is the controller node, so disable the ceilometer compute agent # This is the controller node, so disable the ceilometer compute agent
disable_service ceilometer-acompute disable_service ceilometer-acompute
# Enable the ceilometer api explicitly(bug:1667678)
enable_service ceilometer-api
# Enable the Gnocchi plugin
enable_plugin gnocchi https://git.openstack.org/openstack/gnocchi
LOGFILE=$DEST/logs/stack.sh.log LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2 LOGDAYS=2

View File

@@ -1,40 +0,0 @@
{
"priority": "INFO",
"payload": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ActionCreatePayload",
"watcher_object.data": {
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"input_parameters": {
"param2": 2,
"param1": 1
},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "PENDING",
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "TerseActionPlanPayload",
"watcher_object.data": {
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"global_efficacy": {},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null
}
},
"parents": [],
"action_type": "nop",
"deleted_at": null
}
},
"publisher_id": "infra-optim:node0",
"timestamp": "2017-01-01 00:00:00.000000",
"event_type": "action.create",
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
}

View File

@@ -1,40 +0,0 @@
{
"priority": "INFO",
"payload": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ActionDeletePayload",
"watcher_object.data": {
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"input_parameters": {
"param2": 2,
"param1": 1
},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "DELETED",
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "TerseActionPlanPayload",
"watcher_object.data": {
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"global_efficacy": {},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null
}
},
"parents": [],
"action_type": "nop",
"deleted_at": null
}
},
"publisher_id": "infra-optim:node0",
"timestamp": "2017-01-01 00:00:00.000000",
"event_type": "action.delete",
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
}

View File

@@ -1,41 +0,0 @@
{
"priority": "INFO",
"payload": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ActionExecutionPayload",
"watcher_object.data": {
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"input_parameters": {
"param2": 2,
"param1": 1
},
"fault": null,
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "SUCCEEDED",
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "TerseActionPlanPayload",
"watcher_object.data": {
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"global_efficacy": {},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null
}
},
"parents": [],
"action_type": "nop",
"deleted_at": null
}
},
"event_type": "action.execution.end",
"publisher_id": "infra-optim:node0",
"timestamp": "2017-01-01 00:00:00.000000",
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
}

View File

@@ -1,51 +0,0 @@
{
"priority": "ERROR",
"payload": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ActionExecutionPayload",
"watcher_object.data": {
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"input_parameters": {
"param2": 2,
"param1": 1
},
"fault": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ExceptionPayload",
"watcher_object.data": {
"module_name": "watcher.tests.notifications.test_action_notification",
"exception": "WatcherException",
"exception_message": "TEST",
"function_name": "test_send_action_execution_with_error"
}
},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "FAILED",
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "TerseActionPlanPayload",
"watcher_object.data": {
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"global_efficacy": {},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null
}
},
"parents": [],
"action_type": "nop",
"deleted_at": null
}
},
"event_type": "action.execution.error",
"publisher_id": "infra-optim:node0",
"timestamp": "2017-01-01 00:00:00.000000",
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
}

View File

@@ -1,41 +0,0 @@
{
"priority": "INFO",
"payload": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ActionExecutionPayload",
"watcher_object.data": {
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"input_parameters": {
"param2": 2,
"param1": 1
},
"fault": null,
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "TerseActionPlanPayload",
"watcher_object.data": {
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"global_efficacy": {},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null
}
},
"parents": [],
"action_type": "nop",
"deleted_at": null
}
},
"event_type": "action.execution.start",
"publisher_id": "infra-optim:node0",
"timestamp": "2017-01-01 00:00:00.000000",
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
}

View File

@@ -1,49 +0,0 @@
{
"priority": "INFO",
"payload": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ActionUpdatePayload",
"watcher_object.data": {
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"input_parameters": {
"param2": 2,
"param1": 1
},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state_update": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "ActionStateUpdatePayload",
"watcher_object.data": {
"old_state": "PENDING",
"state": "ONGOING"
}
},
"state": "ONGOING",
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
"watcher_object.name": "TerseActionPlanPayload",
"watcher_object.data": {
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"global_efficacy": {},
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null
}
},
"parents": [],
"action_type": "nop",
"deleted_at": null
}
},
"event_type": "action.update",
"publisher_id": "infra-optim:node0",
"timestamp": "2017-01-01 00:00:00.000000",
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
}

View File

@@ -1,26 +0,0 @@
{
"payload": {
"watcher_object.name": "ServiceUpdatePayload",
"watcher_object.namespace": "watcher",
"watcher_object.data": {
"status_update": {
"watcher_object.name": "ServiceStatusUpdatePayload",
"watcher_object.namespace": "watcher",
"watcher_object.data": {
"old_state": "ACTIVE",
"state": "FAILED"
},
"watcher_object.version": "1.0"
},
"last_seen_up": "2016-09-22T08:32:06Z",
"name": "watcher-service",
"sevice_host": "controller"
},
"watcher_object.version": "1.0"
},
"event_type": "service.update",
"priority": "INFO",
"message_id": "3984dc2b-8aef-462b-a220-8ae04237a56e",
"timestamp": "2016-10-18 09:52:05.219414",
"publisher_id": "infra-optim:node0"
}

View File

@@ -1,49 +0,0 @@
..
Except where otherwise noted, this document is licensed under Creative
Commons Attribution 3.0 License. You can view the license at:
https://creativecommons.org/licenses/by/3.0/
Installing API behind mod_wsgi
==============================
#. Install the Apache Service::
Fedora 21/RHEL7/CentOS7:
sudo yum install httpd
Fedora 22 (or higher):
sudo dnf install httpd
Debian/Ubuntu:
apt-get install apache2
#. Copy ``etc/apache2/watcher.conf`` under the apache sites::
Fedora/RHEL7/CentOS7:
sudo cp etc/apache2/watcher /etc/httpd/conf.d/watcher.conf
Debian/Ubuntu:
sudo cp etc/apache2/watcher /etc/apache2/sites-available/watcher.conf
#. Edit ``<apache-configuration-dir>/watcher.conf`` according to installation
and environment.
* Modify the ``WSGIDaemonProcess`` directive to set the ``user`` and
``group`` values to appropriate user on your server.
* Modify the ``WSGIScriptAlias`` directive to point to the
watcher/api/app.wsgi script.
* Modify the ``Directory`` directive to set the path to the Watcher API
code.
* Modify the ``ErrorLog and CustomLog`` to redirect the logs to the right
directory.
#. Enable the apache watcher site and reload::
Fedora/RHEL7/CentOS7:
sudo systemctl reload httpd
Debian/Ubuntu:
sudo a2ensite watcher
sudo service apache2 reload

View File

@@ -1,12 +0,0 @@
===================
Administrator Guide
===================
.. toctree::
:maxdepth: 2
apache-mod-wsgi
gmr
policy
ways-to-install
../strategies/index

View File

@@ -1,4 +0,0 @@
.. toctree::
:maxdepth: 1
v1

View File

@@ -407,9 +407,6 @@ be one of the following:
- **CANCELLED** : the :ref:`Audit <audit_definition>` was in **PENDING** or - **CANCELLED** : the :ref:`Audit <audit_definition>` was in **PENDING** or
**ONGOING** state and was cancelled by the **ONGOING** state and was cancelled by the
:ref:`Administrator <administrator_definition>` :ref:`Administrator <administrator_definition>`
- **SUSPENDED** : the :ref:`Audit <audit_definition>` was in **ONGOING**
state and was suspended by the
:ref:`Administrator <administrator_definition>`
The following diagram shows the different possible states of an The following diagram shows the different possible states of an
:ref:`Audit <audit_definition>` and what event makes the state change to a new :ref:`Audit <audit_definition>` and what event makes the state change to a new

View File

@@ -31,7 +31,8 @@ sys.path.insert(0, os.path.abspath('./'))
# Add any Sphinx extension module names here, as strings. They can be # Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [ extensions = [
'oslo_config.sphinxext', 'oslo_config.sphinxconfiggen',
'oslosphinx',
'sphinx.ext.autodoc', 'sphinx.ext.autodoc',
'sphinx.ext.viewcode', 'sphinx.ext.viewcode',
'sphinxcontrib.httpdomain', 'sphinxcontrib.httpdomain',
@@ -40,14 +41,10 @@ extensions = [
'wsmeext.sphinxext', 'wsmeext.sphinxext',
'ext.term', 'ext.term',
'ext.versioned_notifications', 'ext.versioned_notifications',
'oslo_config.sphinxconfiggen',
'openstackdocstheme',
] ]
wsme_protocols = ['restjson'] wsme_protocols = ['restjson']
config_generator_config_file = [( config_generator_config_file = '../../etc/watcher/watcher-config-generator.conf'
'../../etc/watcher/oslo-config-generator/watcher.conf',
'_static/watcher')]
sample_config_basename = 'watcher' sample_config_basename = 'watcher'
# autodoc generation is a bit aggressive and a nuisance when doing heavy # autodoc generation is a bit aggressive and a nuisance when doing heavy
@@ -95,8 +92,6 @@ add_function_parentheses = True
# unit titles (such as .. function::). # unit titles (such as .. function::).
add_module_names = True add_module_names = True
suppress_warnings = ['app.add_directive']
# The name of the Pygments (syntax highlighting) style to use. # The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx' pygments_style = 'sphinx'
@@ -122,20 +117,12 @@ man_pages = [
# Sphinx are currently 'default' and 'sphinxdoc'. # Sphinx are currently 'default' and 'sphinxdoc'.
# html_theme_path = ["."] # html_theme_path = ["."]
# html_theme = '_theme' # html_theme = '_theme'
html_theme = 'openstackdocs'
# html_static_path = ['static'] # html_static_path = ['static']
# html_theme_options = {} html_theme_options = {'incubating': True}
# Output file base name for HTML help builder. # Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project htmlhelp_basename = '%sdoc' % project
html_last_updated_fmt = '%Y-%m-%d %H:%M'
#openstackdocstheme options
repository_name = 'openstack/watcher'
bug_project = 'watcher'
bug_tag = ''
# Grouping the document tree into LaTeX files. List of tuples # Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass # (source start file, target name, title, author, documentclass
# [howto/manual]). # [howto/manual]).

View File

@@ -0,0 +1 @@
../../etc/watcher/watcher-config-generator.conf

View File

@@ -1,5 +0,0 @@
.. toctree::
:maxdepth: 1
configuring
watcher

View File

@@ -1,11 +0,0 @@
.. _watcher_sample_configuration_files:
------------
watcher.conf
------------
The ``watcher.conf`` file contains most of the options to configure the
Watcher services.
.. show-options::
:config-file: etc/watcher/oslo-config-generator/watcher.conf

View File

@@ -1,8 +0,0 @@
.. toctree::
:maxdepth: 1
environment
devstack
notifications
testing
rally_link

View File

@@ -1,11 +0,0 @@
.. toctree::
:maxdepth: 1
base-setup
action-plugin
cdmc-plugin
goal-plugin
planner-plugin
scoring-engine-plugin
strategy-plugin
plugins

View File

@@ -0,0 +1,14 @@
.. _watcher_sample_configuration_files:
==================================
Watcher sample configuration files
==================================
watcher.conf
~~~~~~~~~~~~
The ``watcher.conf`` file contains most of the options to configure the
Watcher services.
.. literalinclude:: ../watcher.conf.sample
:language: ini

View File

@@ -165,7 +165,7 @@ You can easily generate and update a sample configuration file
named :ref:`watcher.conf.sample <watcher_sample_configuration_files>` by using named :ref:`watcher.conf.sample <watcher_sample_configuration_files>` by using
these following commands:: these following commands::
$ git clone git://git.openstack.org/openstack/watcher $ git clone https://git.openstack.org/openstack/watcher
$ cd watcher/ $ cd watcher/
$ tox -e genconfig $ tox -e genconfig
$ vi etc/watcher/watcher.conf.sample $ vi etc/watcher/watcher.conf.sample
@@ -424,7 +424,7 @@ to Watcher receives Nova notifications in ``watcher_notifications`` as well.
into which Nova services will publish events :: into which Nova services will publish events ::
[oslo_messaging_notifications] [oslo_messaging_notifications]
driver = messagingv2 driver = messaging
topics = notifications,watcher_notifications topics = notifications,watcher_notifications
* Restart the Nova services. * Restart the Nova services.

View File

@@ -4,13 +4,12 @@
https://creativecommons.org/licenses/by/3.0/ https://creativecommons.org/licenses/by/3.0/
======================= ==================
Ways to install Watcher Installing Watcher
======================= ==================
This document describes some ways to install Watcher in order to use it. This document describes how to install Watcher in order to use it. If you are
If you are intending to develop on or with Watcher, intending to develop on or with Watcher, please read :doc:`../dev/environment`.
please read :doc:`../contributor/environment`.
Prerequisites Prerequisites
------------- -------------
@@ -19,14 +18,14 @@ The source install instructions specifically avoid using platform specific
packages, instead using the source for the code and the Python Package Index packages, instead using the source for the code and the Python Package Index
(PyPi_). (PyPi_).
.. _PyPi: https://pypi.python.org/pypi .. _PyPi: http://pypi.python.org/pypi
It's expected that your system already has python2.7_, latest version of pip_, It's expected that your system already has python2.7_, latest version of pip_,
and git_ available. and git_ available.
.. _python2.7: https://www.python.org .. _python2.7: http://www.python.org
.. _pip: https://pip.pypa.io/en/latest/installing/ .. _pip: http://www.pip-installer.org/en/latest/installing.html
.. _git: https://git-scm.com/ .. _git: http://git-scm.com/
Your system shall also have some additional system libraries: Your system shall also have some additional system libraries:
@@ -78,10 +77,9 @@ Install the Watcher modules dependencies:
# pip install -r requirements.txt # pip install -r requirements.txt
From here, refer to :doc:`../configuration/configuring` to declare Watcher From here, refer to :doc:`configuration` to declare Watcher as a new service
as a new service into Keystone and to configure its different modules. into Keystone and to configure its different modules. Once configured, you
Once configured, you should be able to run the Watcher services by issuing should be able to run the Watcher services by issuing these commands:
these commands:
.. code-block:: bash .. code-block:: bash
@@ -109,7 +107,7 @@ installed on your system.
Once installed, you still need to declare Watcher as a new service into Once installed, you still need to declare Watcher as a new service into
Keystone and to configure its different modules, which you can find described Keystone and to configure its different modules, which you can find described
in :doc:`../configuration/configuring`. in :doc:`configuration`.
Installing from packages: Debian (experimental) Installing from packages: Debian (experimental)

View File

@@ -11,7 +11,7 @@ Watcher User Guide
================== ==================
See the See the
`architecture page <https://docs.openstack.org/watcher/latest/architecture.html>`_ `architecture page <http://docs.openstack.org/developer/watcher/architecture.html>`_
for an architectural overview of the different components of Watcher and how for an architectural overview of the different components of Watcher and how
they fit together. they fit together.

View File

@@ -64,9 +64,8 @@ IRC Channel
``#openstack-watcher`` (changelog_) ``#openstack-watcher`` (changelog_)
Weekly Meetings Weekly Meetings
On Wednesdays at 14:00 UTC on even weeks in the ``#openstack-meeting-4`` on Wednesdays at 14:00 UTC on even weeks, 9:00 UTC on odd weeks, in the
IRC channel, 13:00 UTC on odd weeks in the ``#openstack-meeting-alt`` ``#openstack-meeting-4`` IRC channel (`meetings logs`_)
IRC channel (`meetings logs`_)
.. _changelog: http://eavesdrop.openstack.org/irclogs/%23openstack-watcher/ .. _changelog: http://eavesdrop.openstack.org/irclogs/%23openstack-watcher/
.. _meetings logs: http://eavesdrop.openstack.org/meetings/watcher/ .. _meetings logs: http://eavesdrop.openstack.org/meetings/watcher/

View File

@@ -19,7 +19,7 @@ model. To enable the Watcher plugin with DevStack, add the following to the
`[[local|localrc]]` section of your controller's `local.conf` to enable the `[[local|localrc]]` section of your controller's `local.conf` to enable the
Watcher plugin:: Watcher plugin::
enable_plugin watcher git://git.openstack.org/openstack/watcher enable_plugin watcher https://git.openstack.org/openstack/watcher
For more detailed instructions, see `Detailed DevStack Instructions`_. Check For more detailed instructions, see `Detailed DevStack Instructions`_. Check
out the `DevStack documentation`_ for more information regarding DevStack. out the `DevStack documentation`_ for more information regarding DevStack.
@@ -92,12 +92,6 @@ Detailed DevStack Instructions
Note: if you want to use a specific branch, specify WATCHER_BRANCH in the Note: if you want to use a specific branch, specify WATCHER_BRANCH in the
local.conf file. By default it will use the master branch. local.conf file. By default it will use the master branch.
Note: watcher-api will default run under apache/httpd, set the variable
WATCHER_USE_MOD_WSGI=FALSE if you do not wish to run under apache/httpd.
For development environment it is suggested to set WATHCER_USE_MOD_WSGI
to FALSE. For Production environment it is suggested to keep it at the
default TRUE value.
#. Start stacking from the controller node:: #. Start stacking from the controller node::
./devstack/stack.sh ./devstack/stack.sh

View File

@@ -16,8 +16,8 @@ for development purposes.
To install Watcher from packaging, refer instead to Watcher `User To install Watcher from packaging, refer instead to Watcher `User
Documentation`_. Documentation`_.
.. _`Git Repository`: https://git.openstack.org/cgit/openstack/watcher .. _`Git Repository`: http://git.openstack.org/cgit/openstack/watcher
.. _`User Documentation`: https://docs.openstack.org/watcher/latest/ .. _`User Documentation`: http://docs.openstack.org/developer/watcher/
Prerequisites Prerequisites
============= =============
@@ -35,10 +35,10 @@ following tools available on your system:
**Reminder**: If you're successfully using a different platform, or a **Reminder**: If you're successfully using a different platform, or a
different version of the above, please document your configuration here! different version of the above, please document your configuration here!
.. _Python: https://www.python.org/ .. _Python: http://www.python.org/
.. _git: https://git-scm.com/ .. _git: http://git-scm.com/
.. _setuptools: https://pypi.python.org/pypi/setuptools .. _setuptools: http://pypi.python.org/pypi/setuptools
.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/install.html .. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.org/en/latest/install.html
Getting the latest code Getting the latest code
======================= =======================
@@ -175,12 +175,11 @@ The HTML files are available into ``doc/build`` directory.
Configure the Watcher services Configure the Watcher services
============================== ==============================
Watcher services require a configuration file. Use tox to generate Watcher services require a configuration file. There is a sample configuration
a sample configuration file that can be used to get started: file that can be used to get started:
.. code-block:: bash .. code-block:: bash
$ tox -e genconfig
$ cp etc/watcher.conf.sample etc/watcher.conf $ cp etc/watcher.conf.sample etc/watcher.conf
Most of the default configuration should be enough to get you going, but you Most of the default configuration should be enough to get you going, but you
@@ -194,7 +193,7 @@ still need to configure the following sections:
message bus message bus
So if you need some more details on how to configure one or more of these So if you need some more details on how to configure one or more of these
sections, please do have a look at :doc:`../configuration/configuring` before sections, please do have a look at :doc:`../deploy/configuration` before
continuing. continuing.
@@ -240,7 +239,7 @@ To run the Watcher Applier service, use:
(watcher) $ watcher-applier (watcher) $ watcher-applier
Default configuration of these services are available into ``/etc/watcher`` Default configuration of these services are available into ``/etc/watcher``
directory. See :doc:`../configuration/configuring` for details on how Watcher is directory. See :doc:`../deploy/configuration` for details on how Watcher is
configured. By default, Watcher is configured with SQL backends. configured. By default, Watcher is configured with SQL backends.

View File

@@ -123,9 +123,8 @@ Here below is how you would proceed to register ``NewGoal`` using pbr_:
new_goal = thirdparty.new:NewGoal new_goal = thirdparty.new:NewGoal
To get a better understanding on how to implement a more advanced goal, have To get a better understanding on how to implement a more advanced goal,
a look at the have a look at the :py:class:`~.ServerConsolidation` class.
:py:class:`watcher.decision_engine.goal.goals.ServerConsolidation` class.
.. _pbr: http://docs.openstack.org/developer/pbr/ .. _pbr: http://docs.openstack.org/developer/pbr/

View File

@@ -37,8 +37,7 @@ Create a new scoring engine plugin
In order to create a new scoring engine you have to: In order to create a new scoring engine you have to:
- Extend the :py:class:`watcher.decision_engine.scoring.base.ScoringEngine` - Extend the :py:class:`~.ScoringEngine` class
class
- Implement its :py:meth:`~.ScoringEngine.get_name` method to return the - Implement its :py:meth:`~.ScoringEngine.get_name` method to return the
**unique** ID of the new scoring engine you want to create. This unique ID **unique** ID of the new scoring engine you want to create. This unique ID
should be the same as the name of :ref:`the entry point we will declare later should be the same as the name of :ref:`the entry point we will declare later
@@ -125,8 +124,7 @@ scoring engine deployed as a web service on external servers:
Abstract Plugin Class Abstract Plugin Class
===================== =====================
Here below is the abstract Here below is the abstract :py:class:`~.ScoringEngine` class:
:py:class:`watcher.decision_engine.scoring.base.ScoringEngine` class:
.. autoclass:: watcher.decision_engine.scoring.base.ScoringEngine .. autoclass:: watcher.decision_engine.scoring.base.ScoringEngine
:members: :members:

View File

@@ -14,7 +14,7 @@ Unit tests
========== ==========
All unit tests should be run using `tox`_. To run the same unit tests that are All unit tests should be run using `tox`_. To run the same unit tests that are
executing onto `Gerrit`_ which includes ``py35``, ``py27`` and ``pep8``, you executing onto `Gerrit`_ which includes ``py34``, ``py27`` and ``pep8``, you
can issue the following command:: can issue the following command::
$ workon watcher $ workon watcher
@@ -26,7 +26,7 @@ If you want to only run one of the aforementioned, you can then issue one of
the following:: the following::
$ workon watcher $ workon watcher
(watcher) $ tox -e py35 (watcher) $ tox -e py34
(watcher) $ tox -e py27 (watcher) $ tox -e py27
(watcher) $ tox -e pep8 (watcher) $ tox -e pep8

View File

@@ -65,14 +65,6 @@ Audit
.. _audit_template_definition: .. _audit_template_definition:
Audit Scope
===========
An Audit Scope is a set of audited resources. Audit Scope should be defined
in each Audit Template (which contains the Audit settings).
.. _audit_scope_definition:
Audit Template Audit Template
============== ==============

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -4,14 +4,11 @@
PENDING --> ONGOING: Audit request is received\nby the Watcher Decision Engine PENDING --> ONGOING: Audit request is received\nby the Watcher Decision Engine
ONGOING --> FAILED: Audit fails\n(no solution found, technical error, ...) ONGOING --> FAILED: Audit fails\n(no solution found, technical error, ...)
ONGOING --> SUCCEEDED: The Watcher Decision Engine\ncould find at least one Solution ONGOING --> SUCCEEDED: The Watcher Decision Engine\ncould find at least one Solution
ONGOING --> SUSPENDED: Administrator wants to\nsuspend the Audit
SUSPENDED --> ONGOING: Administrator wants to\nresume the Audit
FAILED --> DELETED : Administrator wants to\narchive/delete the Audit FAILED --> DELETED : Administrator wants to\narchive/delete the Audit
SUCCEEDED --> DELETED : Administrator wants to\narchive/delete the Audit SUCCEEDED --> DELETED : Administrator wants to\narchive/delete the Audit
PENDING --> CANCELLED : Administrator cancels\nthe Audit PENDING --> CANCELLED : Administrator cancels\nthe Audit
ONGOING --> CANCELLED : Administrator cancels\nthe Audit ONGOING --> CANCELLED : Administrator cancels\nthe Audit
CANCELLED --> DELETED : Administrator wants to\narchive/delete the Audit CANCELLED --> DELETED : Administrator wants to\narchive/delete the Audit
SUSPENDED --> DELETED: Administrator wants to\narchive/delete the Audit
DELETED --> [*] DELETED --> [*]
@enduml @enduml

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@@ -13,7 +13,7 @@
height="210mm" height="210mm"
id="svg4946" id="svg4946"
version="1.1" version="1.1"
inkscape:version="0.91 r13725" inkscape:version="0.48.4 r9939"
sodipodi:docname="architecture.svg"> sodipodi:docname="architecture.svg">
<defs <defs
id="defs4948"> id="defs4948">
@@ -325,20 +325,6 @@
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt" style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="matrix(-0.8,0,0,-0.8,4.8,0)" /> transform="matrix(-0.8,0,0,-0.8,4.8,0)" />
</marker> </marker>
<marker
inkscape:stockid="EmptyTriangleInL"
orient="auto"
refY="0"
refX="0"
id="EmptyTriangleInL-5"
style="overflow:visible">
<path
inkscape:connector-curvature="0"
id="path7091-3"
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="matrix(-0.8,0,0,-0.8,4.8,0)" />
</marker>
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
inkscape:document-units="mm" inkscape:document-units="mm"
@@ -347,21 +333,17 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1.4142136" inkscape:zoom="4"
inkscape:cx="261.24633" inkscape:cx="261.24633"
inkscape:cy="108.90512" inkscape:cy="108.90512"
inkscape:current-layer="g5356" inkscape:current-layer="g5356"
id="namedview4950" id="namedview4950"
showgrid="true" showgrid="false"
inkscape:window-width="1215" inkscape:window-width="1846"
inkscape:window-height="776" inkscape:window-height="1053"
inkscape:window-x="65" inkscape:window-x="1911"
inkscape:window-y="24" inkscape:window-y="37"
inkscape:window-maximized="1"> inkscape:window-maximized="1" />
<inkscape:grid
type="xygrid"
id="grid4203" />
</sodipodi:namedview>
<metadata <metadata
id="metadata4952"> id="metadata4952">
<rdf:RDF> <rdf:RDF>
@@ -428,7 +410,7 @@
sodipodi:cy="358.94418" sodipodi:cy="358.94418"
sodipodi:rx="70.677063" sodipodi:rx="70.677063"
sodipodi:ry="70.677063" sodipodi:ry="70.677063"
d="m 394.67978,358.94418 a 70.677063,70.677063 0 0 1 -70.67706,70.67707 70.677063,70.677063 0 0 1 -70.67707,-70.67707 70.677063,70.677063 0 0 1 70.67707,-70.67706 70.677063,70.677063 0 0 1 70.67706,70.67706 z" d="m 394.67978,358.94418 c 0,39.03387 -31.6432,70.67707 -70.67706,70.67707 -39.03387,0 -70.67707,-31.6432 -70.67707,-70.67707 0,-39.03386 31.6432,-70.67706 70.67707,-70.67706 39.03386,0 70.67706,31.6432 70.67706,70.67706 z"
transform="matrix(0.36664048,0,0,0.36664048,0.86684619,-80.697844)" /> transform="matrix(0.36664048,0,0,0.36664048,0.86684619,-80.697844)" />
<g <g
id="g5262"> id="g5262">
@@ -554,29 +536,29 @@
</g> </g>
<rect <rect
y="754.5235" y="754.5235"
x="231.29219" x="225.29219"
height="42.939091" height="42.939091"
width="118.56741" width="118.56741"
id="rect4267-4-7-7-3-3" id="rect4267-4-7-7-3-3"
style="display:inline;fill:#ffffff;stroke:#000000;stroke-width:1;stroke-opacity:1" /> style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-opacity:1;display:inline" />
<text <text
sodipodi:linespacing="125%" sodipodi:linespacing="125%"
id="text5037-4-6-9-1-4" id="text5037-4-6-9-1-4"
y="783.03412" y="783.03412"
x="290.34656" x="284.34656"
style="font-style:normal;font-weight:normal;font-size:20.86613655px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none" style="font-size:20.86613655px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
xml:space="preserve"><tspan xml:space="preserve"><tspan
id="tspan5184-3-5-2-1" id="tspan5184-3-5-2-1"
style="font-size:20px;text-align:center;text-anchor:middle" style="font-size:20px;text-align:center;text-anchor:middle"
y="783.03412" y="783.03412"
x="290.34656" x="284.34656"
sodipodi:role="line">ceilometer</tspan></text> sodipodi:role="line">ceilometer</tspan></text>
<g <g
transform="matrix(1.7775787,0,0,1.7775787,599.58186,304.14299)" transform="matrix(1.7775787,0,0,1.7775787,593.58186,304.14299)"
id="g4982" id="g4982"
style="display:inline"> style="display:inline">
<rect <rect
style="display:inline;fill:#ffffff;stroke:#000000;stroke-width:0.562563;stroke-opacity:1" style="fill:#ffffff;stroke:#000000;stroke-width:0.562563;stroke-opacity:1;display:inline"
id="rect4267-4-7-7-3-3-1" id="rect4267-4-7-7-3-3-1"
width="66.701637" width="66.701637"
height="24.155943" height="24.155943"
@@ -584,7 +566,7 @@
y="253.36743" /> y="253.36743" />
<text <text
xml:space="preserve" xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:11.73851585px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none" style="font-size:11.73851585px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
x="-100.86156" x="-100.86156"
y="268.36258" y="268.36258"
id="text5037-4-6-9-1-4-3" id="text5037-4-6-9-1-4-3"
@@ -638,6 +620,12 @@
style="font-size:11.2512598px;text-align:center;text-anchor:middle" style="font-size:11.2512598px;text-align:center;text-anchor:middle"
id="tspan5022">drivers</tspan></text> id="tspan5022">drivers</tspan></text>
</g> </g>
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path5110"
d="m 376.75141,726.9703 -57.95106,0"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
<g <g
transform="matrix(1.7775787,0,0,1.7775787,704.59677,780.35846)" transform="matrix(1.7775787,0,0,1.7775787,704.59677,780.35846)"
id="g5267" id="g5267"
@@ -1064,8 +1052,8 @@
sodipodi:nodetypes="cc" sodipodi:nodetypes="cc"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
id="path5112-89" id="path5112-89"
d="m 324.87061,655.34778 0,71.7093" d="m 328.87061,655.34778 0,71.7093"
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
<path <path
sodipodi:nodetypes="cc" sodipodi:nodetypes="cc"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
@@ -1190,7 +1178,7 @@
sodipodi:role="line">extensions</tspan></text> sodipodi:role="line">extensions</tspan></text>
<path <path
transform="translate(68.397849,130.15566)" transform="translate(68.397849,130.15566)"
d="m 519.41589,367.58817 a 4.4922457,7.2686057 0 0 1 -4.49224,7.2686 4.4922457,7.2686057 0 0 1 -4.49225,-7.2686 4.4922457,7.2686057 0 0 1 4.49225,-7.26861 4.4922457,7.2686057 0 0 1 4.49224,7.26861 z" d="m 519.41589,367.58817 c 0,4.01434 -2.01125,7.2686 -4.49224,7.2686 -2.481,0 -4.49225,-3.25426 -4.49225,-7.2686 0,-4.01434 2.01125,-7.26861 4.49225,-7.26861 2.48099,0 4.49224,3.25427 4.49224,7.26861 z"
sodipodi:ry="7.2686057" sodipodi:ry="7.2686057"
sodipodi:rx="4.4922457" sodipodi:rx="4.4922457"
sodipodi:cy="367.58817" sodipodi:cy="367.58817"
@@ -1200,7 +1188,7 @@
sodipodi:type="arc" /> sodipodi:type="arc" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,397.30905,368.17877)" transform="matrix(0.36538461,0,0,0.36538461,397.30905,368.17877)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1210,7 +1198,7 @@
sodipodi:type="arc" /> sodipodi:type="arc" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,-27.122619,99.964199)" transform="matrix(0.36538461,0,0,0.36538461,-27.122619,99.964199)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1226,7 +1214,7 @@
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997, 1.99999998, 0.99999999, 1.99999998;stroke-dashoffset:0;marker-start:none;display:inline" /> style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997, 1.99999998, 0.99999999, 1.99999998;stroke-dashoffset:0;marker-start:none;display:inline" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,396.74123,268.71562)" transform="matrix(0.36538461,0,0,0.36538461,396.74123,268.71562)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1236,7 +1224,7 @@
sodipodi:type="arc" /> sodipodi:type="arc" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,428.69747,559.36511)" transform="matrix(0.36538461,0,0,0.36538461,428.69747,559.36511)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1246,7 +1234,7 @@
sodipodi:type="arc" /> sodipodi:type="arc" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,531.88959,559.36511)" transform="matrix(0.36538461,0,0,0.36538461,531.88959,559.36511)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1262,7 +1250,7 @@
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.99999998, 1.99999998;stroke-dashoffset:0;marker-start:none;display:inline" /> style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.99999998, 1.99999998;stroke-dashoffset:0;marker-start:none;display:inline" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,748.91653,525.25993)" transform="matrix(0.36538461,0,0,0.36538461,748.91653,525.25993)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1272,7 +1260,7 @@
sodipodi:type="arc" /> sodipodi:type="arc" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,748.91653,495.84628)" transform="matrix(0.36538461,0,0,0.36538461,748.91653,495.84628)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1325,7 +1313,7 @@
</g> </g>
<path <path
transform="matrix(0.36538461,0,0,0.36538461,396.74122,268.71562)" transform="matrix(0.36538461,0,0,0.36538461,396.74122,268.71562)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1335,7 +1323,7 @@
sodipodi:type="arc" /> sodipodi:type="arc" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,-27.122619,74.87915)" transform="matrix(0.36538461,0,0,0.36538461,-27.122619,74.87915)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1351,7 +1339,7 @@
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997, 1.99999998, 0.99999999, 1.99999998;stroke-dashoffset:0;marker-start:url(#TriangleInL);display:inline" /> style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997, 1.99999998, 0.99999999, 1.99999998;stroke-dashoffset:0;marker-start:url(#TriangleInL);display:inline" />
<path <path
transform="matrix(0.36538461,0,0,0.36538461,422.9095,223.59883)" transform="matrix(0.36538461,0,0,0.36538461,422.9095,223.59883)"
d="m 521.38126,368.43045 a 7.2998991,7.2998991 0 0 1 -7.2999,7.2999 7.2998991,7.2998991 0 0 1 -7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,-7.2999 7.2998991,7.2998991 0 0 1 7.2999,7.2999 z" d="m 521.38126,368.43045 c 0,4.03162 -3.26828,7.2999 -7.2999,7.2999 -4.03162,0 -7.2999,-3.26828 -7.2999,-7.2999 0,-4.03162 3.26828,-7.2999 7.2999,-7.2999 4.03162,0 7.2999,3.26828 7.2999,7.2999 z"
sodipodi:ry="7.2998991" sodipodi:ry="7.2998991"
sodipodi:rx="7.2998991" sodipodi:rx="7.2998991"
sodipodi:cy="368.43045" sodipodi:cy="368.43045"
@@ -1363,45 +1351,15 @@
sodipodi:nodetypes="cc" sodipodi:nodetypes="cc"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
id="path3284-4-2-3-40" id="path3284-4-2-3-40"
d="m 325.23661,753.47677 0,-27.00021" d="m 319.30136,753.47677 0,-27.00021"
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#EmptyTriangleInL)" /> style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#EmptyTriangleInL);display:inline" />
<path <path
sodipodi:nodetypes="cc" sodipodi:nodetypes="cc"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
id="path3284-4-2-3-8" id="path3284-4-2-3-8"
d="m 414.2546,753.65849 0,-27.00021" d="m 376.2546,753.65849 0,-27.00021"
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#EmptyTriangleInL)" /> style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#EmptyTriangleInL);display:inline" />
<rect
y="754.5235"
x="102.92204"
height="42.939091"
width="118.56741"
id="rect4267-4-7-7-3-3-3"
style="display:inline;fill:#ffffff;stroke:#000000;stroke-width:1;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text5037-4-6-9-1-4-6"
y="783.03412"
x="160.34656"
style="font-style:normal;font-weight:normal;font-size:20.86613655px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
id="tspan5184-3-5-2-1-7"
style="font-size:20px;text-align:center;text-anchor:middle"
y="783.03412"
x="160.34656"
sodipodi:role="line">gnocchi</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3284-4-2-3-40-5"
d="m 191.30136,753.47677 0,-27.00021"
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#EmptyTriangleInL-5)" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path5110-9-6"
d="m 192.18905,726.66568 221.85496,0"
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -43,7 +43,7 @@ Introduction
glossary glossary
architecture architecture
contributor/contributing dev/contributing
Getting Started Getting Started
@@ -52,7 +52,13 @@ Getting Started
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
contributor/index dev/environment
dev/devstack
deploy/configuration
deploy/conf-files
dev/notifications
dev/testing
dev/rally_link
API References API References
-------------- --------------
@@ -60,7 +66,7 @@ API References
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
api/index webapi/v1
Plugins Plugins
------- -------
@@ -68,38 +74,30 @@ Plugins
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
contributor/plugin/index dev/plugin/base-setup
dev/plugin/goal-plugin
dev/plugin/scoring-engine-plugin
dev/plugin/strategy-plugin
dev/plugin/cdmc-plugin
dev/plugin/action-plugin
dev/plugin/planner-plugin
dev/plugins
Installation
============
.. toctree::
:maxdepth: 2
install/index
Watcher Configuration Options
=============================
.. toctree::
:maxdepth: 2
configuration/index
Admin Guide Admin Guide
=========== ===========
.. toctree:: Introduction
:maxdepth: 2 ------------
admin/index
User Guide
==========
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 1
user/index deploy/installation
deploy/user-guide
deploy/policy
deploy/gmr
strategies/strategies
Watcher Manual Pages Watcher Manual Pages
==================== ====================
@@ -108,7 +106,7 @@ Watcher Manual Pages
:glob: :glob:
:maxdepth: 1 :maxdepth: 1
man/index man/*
.. # NOTE(mriedem): This is the section where we hide things that we don't .. # NOTE(mriedem): This is the section where we hide things that we don't
# actually want in the table of contents but sphinx build would fail if # actually want in the table of contents but sphinx build would fail if

View File

@@ -1,71 +0,0 @@
2. Edit the ``/etc/watcher/watcher.conf`` file and complete the following
actions:
* In the ``[database]`` section, configure database access:
.. code-block:: ini
[database]
...
connection = mysql+pymysql://watcher:WATCHER_DBPASS@controller/watcher?charset=utf8
* In the `[DEFAULT]` section, configure the transport url for RabbitMQ message broker.
.. code-block:: ini
[DEFAULT]
...
control_exchange = watcher
transport_url = rabbit://openstack:RABBIT_PASS@controller
Replace the RABBIT_PASS with the password you chose for OpenStack user in RabbitMQ.
* In the `[keystone_authtoken]` section, configure Identity service access.
.. code-block:: ini
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = watcher
password = WATCHER_PASS
Replace WATCHER_PASS with the password you chose for the watcher user in the Identity service.
* Watcher interacts with other OpenStack projects via project clients, in order to instantiate these
clients, Watcher requests new session from Identity service. In the `[watcher_client_auth]` section,
configure the identity service access to interact with other OpenStack project clients.
.. code-block:: ini
[watcher_client_auth]
...
auth_type = password
auth_url = http://controller:35357
username = watcher
password = WATCHER_PASS
project_domain_name = default
user_domain_name = default
project_name = service
Replace WATCHER_PASS with the password you chose for the watcher user in the Identity service.
* In the `[oslo_messaging_notifications]` section, configure the messaging driver.
.. code-block:: ini
[oslo_messaging_notifications]
...
driver = messagingv2
3. Populate watcher database:
.. code-block:: ini
su -s /bin/sh -c "watcher-db-manage" watcher

View File

@@ -1,139 +0,0 @@
Prerequisites
-------------
Before you install and configure the Infrastructure Optimization service,
you must create a database, service credentials, and API endpoints.
1. Create the database, complete these steps:
* Use the database access client to connect to the database
server as the ``root`` user:
.. code-block:: console
$ mysql -u root -p
* Create the ``watcher`` database:
.. code-block:: console
CREATE DATABASE watcher CHARACTER SET utf8;
* Grant proper access to the ``watcher`` database:
.. code-block:: console
GRANT ALL PRIVILEGES ON watcher.* TO 'watcher'@'localhost' \
IDENTIFIED BY 'WATCHER_DBPASS';
GRANT ALL PRIVILEGES ON watcher.* TO 'watcher'@'%' \
IDENTIFIED BY 'WATCHER_DBPASS';
Replace ``WATCHER_DBPASS`` with a suitable password.
* Exit the database access client.
.. code-block:: console
exit;
2. Source the ``admin`` credentials to gain access to
admin-only CLI commands:
.. code-block:: console
$ . admin-openrc
3. To create the service credentials, complete these steps:
* Create the ``watcher`` user:
.. code-block:: console
$ openstack user create --domain default --password-prompt watcher
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | b18ee38e06034b748141beda8fc8bfad |
| name | watcher |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
* Add the ``admin`` role to the ``watcher`` user:
.. code-block:: console
$ openstack role add --project service --user watcher admin
.. note::
This command produces no output.
* Create the watcher service entities:
.. code-block:: console
$ openstack service create --name watcher --description "Infrastructure Optimization" infra-optim
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Infrastructure Optimization |
| enabled | True |
| id | d854f6fff0a64f77bda8003c8dedfada |
| name | watcher |
| type | infra-optim |
+-------------+----------------------------------+
4. Create the Infrastructure Optimization service API endpoints:
.. code-block:: console
$ openstack endpoint create --region RegionOne \
infra-optim public http://controller:9322
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Infrastructure Optimization |
| enabled | True |
| id | d854f6fff0a64f77bda8003c8dedfada |
| name | watcher |
| type | infra-optim |
+-------------+----------------------------------+
$ openstack endpoint create --region RegionOne \
infra-optim internal http://controller:9322
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 225aef8465ef4df48a341aaaf2b0a390 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | d854f6fff0a64f77bda8003c8dedfada |
| service_name | watcher |
| service_type | infra-optim |
| url | http://controller:9322 |
+--------------+----------------------------------+
$ openstack endpoint create --region RegionOne \
infra-optim admin http://controller:9322
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 375eb5057fb546edbdf3ee4866179672 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | d854f6fff0a64f77bda8003c8dedfada |
| service_name | watcher |
| service_type | infra-optim |
| url | http://controller:9322 |
+--------------+----------------------------------+

View File

@@ -1,27 +0,0 @@
============================================
Infrastructure Optimization service overview
============================================
The Infrastructure Optimization service provides flexible and scalable
optimization service for multi-tenant OpenStack based clouds.
The Infrastructure Optimization service consists of the following components:
``watcher`` command-line client
A CLI to communicate with ``watcher-api`` to optimize the cloud.
``watcher-api`` service
An OpenStack-native REST API that accepts and responds to end-user calls
by processing them and forwarding to appropriate underlying watcher
services via AMQP.
``watcher-decision-engine`` service
It runs audit and return an action plan to achieve optimization goal
specified by the end-user in audit.
``watcher-applier`` service
It executes action plan built by watcher-decision-engine. It interacts with
other OpenStack components like nova to execute the given action
plan.
``watcher-dashboard``
Watcher UI implemented as a plugin for the OpenStack Dashboard.

View File

@@ -1,39 +0,0 @@
===================================
Infrastructure Optimization service
===================================
.. toctree::
:maxdepth: 2
get_started.rst
install.rst
verify.rst
next-steps.rst
The Infrastructure Optimization service (watcher) provides
flexible and scalable resource optimization service for
multi-tenant OpenStack-based clouds.
Watcher provides a complete optimization loop including
everything from a metrics receiver, complex event processor
and profiler, optimization processor and an action plan
applier. This provides a robust framework to realize a wide
range of cloud optimization goals, including the reduction
of data center operating costs, increased system performance
via intelligent virtual machine migration, increased energy
efficiency—and more!
Watcher also supports a pluggable architecture by which custom
optimization algorithms, data metrics and data profilers can be
developed and inserted into the Watcher framework.
Check the documentation for watcher optimization strategies at
https://docs.openstack.org/watcher/latest/strategies/index.html
Check watcher glossary at
https://docs.openstack.org/watcher/latest/glossary.html
This chapter assumes a working setup of OpenStack following the
`OpenStack Installation Tutorial
<https://docs.openstack.org/project-install-guide/ocata/>`_.

View File

@@ -1,35 +0,0 @@
.. _install-obs:
Install and configure for openSUSE and SUSE Linux Enterprise
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This section describes how to install and configure the Infrastructure
Optimization service for openSUSE Leap 42.1 and
SUSE Linux Enterprise Server 12 SP1.
.. include:: common_prerequisites.rst
Install and configure components
--------------------------------
#. Install the packages:
.. code-block:: console
# zypper --quiet --non-interactive install
.. include:: common_configure.rst
Finalize installation
---------------------
Start the Infrastructure Optimization services and configure them to start when
the system boots:
.. code-block:: console
# systemctl enable openstack-watcher-api.service
# systemctl start openstack-watcher-api.service

View File

@@ -1,38 +0,0 @@
.. _install-rdo:
Install and configure for Red Hat Enterprise Linux and CentOS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This section describes how to install and configure the Infrastructure
Optimization service for Red Hat Enterprise Linux 7 and CentOS 7.
.. include:: common_prerequisites.rst
Install and configure components
--------------------------------
1. Install the packages:
.. code-block:: console
# sudo yum install openstack-watcher-api openstack-watcher-applier \
openstack-watcher-decision-engine
.. include:: common_configure.rst
Finalize installation
---------------------
Start the Infrastructure Optimization services and configure them to start when
the system boots:
.. code-block:: console
# systemctl enable openstack-watcher-api.service \
openstack-watcher-decision-engine.service \
openstack-watcher-applier.service
# systemctl start openstack-watcher-api.service \
openstack-watcher-decision-engine.service \
openstack-watcher-applier.service

View File

@@ -1,34 +0,0 @@
.. _install-ubuntu:
Install and configure for Ubuntu
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This section describes how to install and configure the Infrastructure
Optimization service for Ubuntu 14.04 (LTS).
.. include:: common_prerequisites.rst
Install and configure components
--------------------------------
1. Install the packages:
.. code-block:: console
# apt install watcher-api watcher-decision-engine \
watcher-applier
# apt install python-watcherclient
.. include:: common_configure.rst
Finalize installation
---------------------
Restart the Infrastructure Optimization services:
.. code-block:: console
# service watcher-api restart
# service watcher-decision-engine restart
# service watcher-applier restart

View File

@@ -1,20 +0,0 @@
.. _install:
Install and configure
~~~~~~~~~~~~~~~~~~~~~
This section describes how to install and configure the Infrastructure
Optimization service, code-named watcher, on the controller node.
This section assumes that you already have a working OpenStack
environment with at least the following components installed:
Identity Service, Compute Service, Telemetry data collection service.
Note that installation and configuration vary by distribution.
.. toctree::
:maxdepth: 2
install-obs.rst
install-rdo.rst
install-ubuntu.rst

View File

@@ -1,9 +0,0 @@
.. _next-steps:
Next steps
~~~~~~~~~~
Your OpenStack environment now includes the watcher service.
To add additional services, see
https://docs.openstack.org/project-install-guide/ocata/.

View File

@@ -1,119 +0,0 @@
.. _verify:
Verify operation
~~~~~~~~~~~~~~~~
Verify operation of the Infrastructure Optimization service.
.. note::
Perform these commands on the controller node.
1. Source the ``admin`` project credentials to gain access to
admin-only CLI commands:
.. code-block:: console
$ . admin-openrc
2. List service components to verify successful launch and registration
of each process:
.. code-block:: console
$ openstack optimize service list
+----+-------------------------+------------+--------+
| ID | Name | Host | Status |
+----+-------------------------+------------+--------+
| 1 | watcher-decision-engine | controller | ACTIVE |
| 2 | watcher-applier | controller | ACTIVE |
+----+-------------------------+------------+--------+
3. List goals and strategies:
.. code-block:: console
$ openstack optimize goal list
+--------------------------------------+----------------------+----------------------+
| UUID | Name | Display name |
+--------------------------------------+----------------------+----------------------+
| a8cd6d1a-008b-4ff0-8dbc-b30493fcc5b9 | dummy | Dummy goal |
| 03953f2f-02d0-42b5-9a12-7ba500a54395 | workload_balancing | Workload Balancing |
| de0f8714-984b-4d6b-add1-9cad8120fbce | server_consolidation | Server Consolidation |
| f056bc80-c6d1-40dc-b002-938ccade9385 | thermal_optimization | Thermal Optimization |
| e7062856-892e-4f0f-b84d-b828464b3fd0 | airflow_optimization | Airflow Optimization |
| 1f038da9-b36c-449f-9f04-c225bf3eb478 | unclassified | Unclassified |
+--------------------------------------+----------------------+----------------------+
$ openstack optimize strategy list
+--------------------------------------+---------------------------+---------------------------------------------+----------------------+
| UUID | Name | Display name | Goal |
+--------------------------------------+---------------------------+---------------------------------------------+----------------------+
| 98ae84c8-7c9b-4cbd-8d9c-4bd7c6b106eb | dummy | Dummy strategy | dummy |
| 02a170b6-c72e-479d-95c0-8a4fdd4cc1ef | dummy_with_scorer | Dummy Strategy using sample Scoring Engines | dummy |
| 8bf591b8-57e5-4a9e-8c7d-c37bda735a45 | outlet_temperature | Outlet temperature based strategy | thermal_optimization |
| 8a0810fb-9d9a-47b9-ab25-e442878abc54 | vm_workload_consolidation | VM Workload Consolidation Strategy | server_consolidation |
| 1718859c-3eb5-45cb-9220-9cb79fe42fa5 | basic | Basic offline consolidation | server_consolidation |
| b5e7f5f1-4824-42c7-bb52-cf50724f67bf | workload_stabilization | Workload stabilization | workload_balancing |
| f853d71e-9286-4df3-9d3e-8eaf0f598e07 | workload_balance | Workload Balance Migration Strategy | workload_balancing |
| 58bdfa89-95b5-4630-adf6-fd3af5ff1f75 | uniform_airflow | Uniform airflow migration strategy | airflow_optimization |
| 66fde55d-a612-4be9-8cb0-ea63472b420b | dummy_with_resize | Dummy strategy with resize | dummy |
+--------------------------------------+---------------------------+---------------------------------------------+----------------------+
4. Run an action plan by creating an audit with dummy goal:
.. code-block:: console
$ openstack optimize audit create --goal dummy
+--------------+--------------------------------------+
| Field | Value |
+--------------+--------------------------------------+
| UUID | e94d4826-ad4e-44df-ad93-dff489fde457 |
| Created At | 2017-05-23T11:46:58.763394+00:00 |
| Updated At | None |
| Deleted At | None |
| State | PENDING |
| Audit Type | ONESHOT |
| Parameters | {} |
| Interval | None |
| Goal | dummy |
| Strategy | auto |
| Audit Scope | [] |
| Auto Trigger | False |
+--------------+--------------------------------------+
$ openstack optimize audit list
+--------------------------------------+------------+-----------+-------+----------+--------------+
| UUID | Audit Type | State | Goal | Strategy | Auto Trigger |
+--------------------------------------+------------+-----------+-------+----------+--------------+
| e94d4826-ad4e-44df-ad93-dff489fde457 | ONESHOT | SUCCEEDED | dummy | auto | False |
+--------------------------------------+------------+-----------+-------+----------+--------------+
$ openstack optimize actionplan list
+--------------------------------------+--------------------------------------+-------------+------------+-----------------+
| UUID | Audit | State | Updated At | Global efficacy |
+--------------------------------------+--------------------------------------+-------------+------------+-----------------+
| ba9ce6b3-969c-4b8e-bb61-ae24e8630f81 | e94d4826-ad4e-44df-ad93-dff489fde457 | RECOMMENDED | None | None |
+--------------------------------------+--------------------------------------+-------------+------------+-----------------+
$ openstack optimize actionplan start ba9ce6b3-969c-4b8e-bb61-ae24e8630f81
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| UUID | ba9ce6b3-969c-4b8e-bb61-ae24e8630f81 |
| Created At | 2017-05-23T11:46:58+00:00 |
| Updated At | 2017-05-23T11:53:12+00:00 |
| Deleted At | None |
| Audit | e94d4826-ad4e-44df-ad93-dff489fde457 |
| Strategy | dummy |
| State | ONGOING |
| Efficacy indicators | [] |
| Global efficacy | {} |
+---------------------+--------------------------------------+
$ openstack optimize actionplan list
+--------------------------------------+--------------------------------------+-----------+---------------------------+-----------------+
| UUID | Audit | State | Updated At | Global efficacy |
+--------------------------------------+--------------------------------------+-----------+---------------------------+-----------------+
| ba9ce6b3-969c-4b8e-bb61-ae24e8630f81 | e94d4826-ad4e-44df-ad93-dff489fde457 | SUCCEEDED | 2017-05-23T11:53:16+00:00 | None |
+--------------------------------------+--------------------------------------+-----------+---------------------------+-----------------+

View File

@@ -1,8 +0,0 @@
.. toctree::
:glob:
:maxdepth: 1
watcher-api
watcher-applier
watcher-db-manage
watcher-decision-engine

View File

@@ -57,7 +57,7 @@ Planner
Default Watcher's planner: Default Watcher's planner:
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner .. watcher-term:: watcher.decision_engine.planner.default.DefaultPlanner
Configuration Configuration
------------- -------------

View File

@@ -61,7 +61,7 @@ Planner
Default Watcher's planner: Default Watcher's planner:
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner .. watcher-term:: watcher.decision_engine.planner.default.DefaultPlanner
Configuration Configuration
------------- -------------
@@ -72,9 +72,6 @@ Strategy parameter is:
parameter type default Value description parameter type default Value description
============== ====== ============= ==================================== ============== ====== ============= ====================================
``threshold`` Number 35.0 Temperature threshold for migration ``threshold`` Number 35.0 Temperature threshold for migration
``period`` Number 30 The time interval in seconds for
getting statistic aggregation from
metric data source
============== ====== ============= ==================================== ============== ====== ============= ====================================
Efficacy Indicator Efficacy Indicator

View File

@@ -59,7 +59,7 @@ Planner
Default Watcher's planner: Default Watcher's planner:
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner .. watcher-term:: watcher.decision_engine.planner.default.DefaultPlanner
Configuration Configuration
------------- -------------

View File

@@ -67,21 +67,7 @@ Planner
Default Watcher's planner: Default Watcher's planner:
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner .. watcher-term:: watcher.decision_engine.planner.default.DefaultPlanner
Configuration
-------------
Strategy parameter is:
====================== ====== ============= ===================================
parameter type default Value description
====================== ====== ============= ===================================
``period`` Number 3600 The time interval in seconds
for getting statistic aggregation
from metric data source
====================== ====== ============= ===================================
Efficacy Indicator Efficacy Indicator

View File

@@ -58,7 +58,7 @@ Planner
Default Watcher's planner: Default Watcher's planner:
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner .. watcher-term:: watcher.decision_engine.planner.default.DefaultPlanner
Configuration Configuration
------------- -------------

View File

@@ -56,7 +56,7 @@ Planner
Default Watcher's planner: Default Watcher's planner:
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner .. watcher-term:: watcher.decision_engine.planner.default.DefaultPlanner
Configuration Configuration
------------- -------------

View File

@@ -1,4 +0,0 @@
.. toctree::
:maxdepth: 2
user-guide

View File

@@ -20,17 +20,6 @@ Goals
.. autotype:: watcher.api.controllers.v1.goal.Goal .. autotype:: watcher.api.controllers.v1.goal.Goal
:members: :members:
Strategies
==========
.. rest-controller:: watcher.api.controllers.v1.strategy:StrategiesController
:webprefix: /v1/strategies
.. autotype:: watcher.api.controllers.v1.strategy.StrategyCollection
:members:
.. autotype:: watcher.api.controllers.v1.strategy.Strategy
:members:
Audit Templates Audit Templates
=============== ===============

View File

@@ -1,33 +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.
# This is an example Apache2 configuration file for using
# Watcher API through mod_wsgi
Listen 9322
<VirtualHost *:9322>
WSGIDaemonProcess watcher-api user=stack group=stack processes=2 threads=2 display-name=%{GROUP}
WSGIScriptAlias / /opt/stack/watcher/watcher/api/app.wsgi
WSGIProcessGroup watcher-api
ErrorLog /var/log/httpd/watcher_error.log
LogLevel info
CustomLog /var/log/httpd/watcher_access.log combined
<Directory /opt/stack/watcher/watcher/api>
WSGIProcessGroup watcher-api
WSGIApplicationGroup %{GLOBAL}
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

View File

@@ -1,4 +0,0 @@
---
features:
- |
Adds feature to cancel an action-plan.

View File

@@ -1,3 +0,0 @@
---
features:
- Add action for compute node power on/off

View File

@@ -1,4 +0,0 @@
---
features:
- |
Added cinder cluster data model

View File

@@ -1,4 +1,4 @@
--- ---
features: features:
- Check the creation time of the action plan, - Add superseded state for an action plan if the cluster data model has
and set its state to SUPERSEDED if it has expired. changed after it has been created.

View File

@@ -1,4 +0,0 @@
---
features:
- |
Added SUSPENDED audit state

View File

@@ -1,16 +1,3 @@
# 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.
# watcher documentation build configuration file, created by # watcher documentation build configuration file, created by
# sphinx-quickstart on Fri Jun 3 11:37:52 2016. # sphinx-quickstart on Fri Jun 3 11:37:52 2016.
# #
@@ -38,7 +25,7 @@ from watcher import version as watcher_version
# Add any Sphinx extension module names here, as strings. They can be # Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['reno.sphinxext', extensions = ['reno.sphinxext',
'openstackdocstheme'] 'oslosphinx']
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates'] templates_path = ['_templates']
@@ -104,7 +91,7 @@ pygments_style = 'sphinx'
# The theme to use for HTML and HTML Help pages. See the documentation for # The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes. # a list of builtin themes.
html_theme = 'openstackdocs' html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme # Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the # further. For a list of options available for each theme, see the

View File

@@ -1,17 +1,3 @@
..
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.
=================================================
Welcome to watcher's Release Notes documentation! Welcome to watcher's Release Notes documentation!
================================================= =================================================
@@ -21,6 +7,5 @@ Contents:
:maxdepth: 1 :maxdepth: 1
unreleased unreleased
ocata
newton newton

View File

@@ -1,33 +0,0 @@
# Gérald LONLAS <g.lonlas@gmail.com>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: watcher 1.0.1.dev51\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-03-21 11:57+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2016-10-22 06:44+0000\n"
"Last-Translator: Gérald LONLAS <g.lonlas@gmail.com>\n"
"Language-Team: French\n"
"Language: fr\n"
"X-Generator: Zanata 3.9.6\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
msgid "0.29.0"
msgstr "0.29.0"
msgid "Contents:"
msgstr "Contenu :"
msgid "Current Series Release Notes"
msgstr "Note de la release actuelle"
msgid "New Features"
msgstr "Nouvelles fonctionnalités"
msgid "Newton Series Release Notes"
msgstr "Note de release pour Newton"
msgid "Welcome to watcher's Release Notes documentation!"
msgstr "Bienvenue dans la documentation de la note de Release de Watcher"

View File

@@ -1,6 +0,0 @@
===================================
Ocata Series Release Notes
===================================
.. release-notes::
:branch: origin/stable/ocata

View File

@@ -5,45 +5,41 @@
apscheduler # MIT License apscheduler # MIT License
enum34;python_version=='2.7' or python_version=='2.6' or python_version=='3.3' # BSD enum34;python_version=='2.7' or python_version=='2.6' or python_version=='3.3' # BSD
jsonpatch>=1.1 # BSD jsonpatch>=1.1 # BSD
keystoneauth1>=3.0.1 # Apache-2.0 keystoneauth1>=2.18.0 # Apache-2.0
jsonschema!=2.5.0,<3.0.0,>=2.0.0 # MIT
keystonemiddleware>=4.12.0 # Apache-2.0 keystonemiddleware>=4.12.0 # Apache-2.0
lxml!=3.7.0,>=2.3 # BSD lxml!=3.7.0,>=2.3 # BSD
croniter>=0.3.4 # MIT License
oslo.concurrency>=3.8.0 # Apache-2.0 oslo.concurrency>=3.8.0 # Apache-2.0
oslo.cache>=1.5.0 # Apache-2.0 oslo.cache>=1.5.0 # Apache-2.0
oslo.config!=4.3.0,!=4.4.0,>=4.0.0 # Apache-2.0 oslo.config!=3.18.0,>=3.14.0 # Apache-2.0
oslo.context>=2.14.0 # Apache-2.0 oslo.context>=2.9.0 # Apache-2.0
oslo.db>=4.24.0 # Apache-2.0 oslo.db>=4.15.0 # Apache-2.0
oslo.i18n!=3.15.2,>=2.1.0 # Apache-2.0 oslo.i18n>=2.1.0 # Apache-2.0
oslo.log>=3.22.0 # Apache-2.0 oslo.log>=3.11.0 # Apache-2.0
oslo.messaging!=5.25.0,>=5.24.2 # Apache-2.0 oslo.messaging>=5.14.0 # Apache-2.0
oslo.policy>=1.23.0 # Apache-2.0 oslo.policy>=1.17.0 # Apache-2.0
oslo.reports>=0.6.0 # Apache-2.0 oslo.reports>=0.6.0 # Apache-2.0
oslo.serialization!=2.19.1,>=1.10.0 # Apache-2.0 oslo.serialization>=1.10.0 # Apache-2.0
oslo.service>=1.10.0 # Apache-2.0 oslo.service>=1.10.0 # Apache-2.0
oslo.utils>=3.20.0 # Apache-2.0 oslo.utils>=3.18.0 # Apache-2.0
oslo.versionedobjects>=1.17.0 # Apache-2.0 oslo.versionedobjects>=1.17.0 # Apache-2.0
PasteDeploy>=1.5.0 # MIT PasteDeploy>=1.5.0 # MIT
pbr!=2.1.0,>=2.0.0 # Apache-2.0 pbr>=1.8 # Apache-2.0
pecan!=1.0.2,!=1.0.3,!=1.0.4,!=1.2,>=1.0.0 # BSD pecan!=1.0.2,!=1.0.3,!=1.0.4,!=1.2,>=1.0.0 # BSD
PrettyTable<0.8,>=0.7.1 # BSD PrettyTable<0.8,>=0.7.1 # BSD
voluptuous>=0.8.9 # BSD License voluptuous>=0.8.9 # BSD License
gnocchiclient>=2.7.0 # Apache-2.0
python-ceilometerclient>=2.5.0 # Apache-2.0 python-ceilometerclient>=2.5.0 # Apache-2.0
python-cinderclient>=3.0.0 # Apache-2.0 python-cinderclient!=1.7.0,!=1.7.1,>=1.6.0 # Apache-2.0
python-glanceclient>=2.7.0 # Apache-2.0 python-glanceclient>=2.5.0 # Apache-2.0
python-keystoneclient>=3.8.0 # Apache-2.0 python-keystoneclient>=3.8.0 # Apache-2.0
python-monascaclient>=1.1.0 # Apache-2.0 python-monascaclient>=1.1.0 # Apache-2.0
python-neutronclient>=6.3.0 # Apache-2.0 python-neutronclient>=5.1.0 # Apache-2.0
python-novaclient>=9.0.0 # Apache-2.0 python-novaclient!=7.0.0,>=6.0.0 # Apache-2.0
python-openstackclient!=3.10.0,>=3.3.0 # Apache-2.0 python-openstackclient>=3.3.0 # Apache-2.0
python-ironicclient>=1.14.0 # Apache-2.0
six>=1.9.0 # MIT six>=1.9.0 # MIT
SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT SQLAlchemy<1.1.0,>=1.0.10 # MIT
stevedore>=1.20.0 # Apache-2.0 stevedore>=1.17.1 # Apache-2.0
taskflow>=2.7.0 # Apache-2.0 taskflow>=2.7.0 # Apache-2.0
WebOb>=1.7.1 # MIT WebOb>=1.6.0 # MIT
WSME>=0.8 # MIT WSME>=0.8 # MIT
networkx>=1.10 # BSD networkx>=1.10 # BSD

View File

@@ -5,7 +5,7 @@ description-file =
README.rst README.rst
author = OpenStack author = OpenStack
author-email = openstack-dev@lists.openstack.org author-email = openstack-dev@lists.openstack.org
home-page = https://docs.openstack.org/watcher/latest/ home-page = http://docs.openstack.org/developer/watcher/
classifier = classifier =
Environment :: OpenStack Environment :: OpenStack
Intended Audience :: Information Technology Intended Audience :: Information Technology
@@ -16,6 +16,7 @@ classifier =
Programming Language :: Python :: 2 Programming Language :: Python :: 2
Programming Language :: Python :: 2.7 Programming Language :: Python :: 2.7
Programming Language :: Python :: 3 Programming Language :: Python :: 3
Programming Language :: Python :: 3.4
Programming Language :: Python :: 3.5 Programming Language :: Python :: 3.5
[files] [files]
@@ -53,7 +54,6 @@ watcher_goals =
thermal_optimization = watcher.decision_engine.goal.goals:ThermalOptimization thermal_optimization = watcher.decision_engine.goal.goals:ThermalOptimization
workload_balancing = watcher.decision_engine.goal.goals:WorkloadBalancing workload_balancing = watcher.decision_engine.goal.goals:WorkloadBalancing
airflow_optimization = watcher.decision_engine.goal.goals:AirflowOptimization airflow_optimization = watcher.decision_engine.goal.goals:AirflowOptimization
noisy_neighbor = watcher.decision_engine.goal.goals:NoisyNeighborOptimization
watcher_scoring_engines = watcher_scoring_engines =
dummy_scorer = watcher.decision_engine.scoring.dummy_scorer:DummyScorer dummy_scorer = watcher.decision_engine.scoring.dummy_scorer:DummyScorer
@@ -71,7 +71,6 @@ watcher_strategies =
workload_stabilization = watcher.decision_engine.strategy.strategies.workload_stabilization:WorkloadStabilization workload_stabilization = watcher.decision_engine.strategy.strategies.workload_stabilization:WorkloadStabilization
workload_balance = watcher.decision_engine.strategy.strategies.workload_balance:WorkloadBalance workload_balance = watcher.decision_engine.strategy.strategies.workload_balance:WorkloadBalance
uniform_airflow = watcher.decision_engine.strategy.strategies.uniform_airflow:UniformAirflow uniform_airflow = watcher.decision_engine.strategy.strategies.uniform_airflow:UniformAirflow
noisy_neighbor = watcher.decision_engine.strategy.strategies.noisy_neighbor:NoisyNeighbor
watcher_actions = watcher_actions =
migrate = watcher.applier.actions.migration:Migrate migrate = watcher.applier.actions.migration:Migrate
@@ -79,7 +78,6 @@ watcher_actions =
sleep = watcher.applier.actions.sleep:Sleep sleep = watcher.applier.actions.sleep:Sleep
change_nova_service_state = watcher.applier.actions.change_nova_service_state:ChangeNovaServiceState change_nova_service_state = watcher.applier.actions.change_nova_service_state:ChangeNovaServiceState
resize = watcher.applier.actions.resize:Resize resize = watcher.applier.actions.resize:Resize
change_node_power_state = watcher.applier.actions.change_node_power_state:ChangeNodePowerState
watcher_workflow_engines = watcher_workflow_engines =
taskflow = watcher.applier.workflow_engine.default:DefaultWorkFlowEngine taskflow = watcher.applier.workflow_engine.default:DefaultWorkFlowEngine
@@ -90,8 +88,6 @@ watcher_planners =
watcher_cluster_data_model_collectors = watcher_cluster_data_model_collectors =
compute = watcher.decision_engine.model.collector.nova:NovaClusterDataModelCollector compute = watcher.decision_engine.model.collector.nova:NovaClusterDataModelCollector
storage = watcher.decision_engine.model.collector.cinder:CinderClusterDataModelCollector
[pbr] [pbr]
warnerrors = true warnerrors = true
@@ -109,7 +105,6 @@ source-dir = doc/source
build-dir = doc/build build-dir = doc/build
fresh_env = 1 fresh_env = 1
all_files = 1 all_files = 1
warning-is-error = 1
[upload_sphinx] [upload_sphinx]
upload-dir = doc/build/html upload-dir = doc/build/html

View File

@@ -25,5 +25,5 @@ except ImportError:
pass pass
setuptools.setup( setuptools.setup(
setup_requires=['pbr>=2.0.0'], setup_requires=['pbr>=1.8'],
pbr=True) pbr=True)

View File

@@ -2,10 +2,10 @@
# of appearance. Changing the order has an impact on the overall integration # of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later. # process, which may cause wedges in the gate later.
coverage!=4.4,>=4.0 # Apache-2.0 coverage>=4.0 # Apache-2.0
doc8 # Apache-2.0 doc8 # Apache-2.0
freezegun>=0.3.6 # Apache-2.0 freezegun>=0.3.6 # Apache-2.0
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0 hacking<0.11,>=0.10.2
mock>=2.0 # BSD mock>=2.0 # BSD
oslotest>=1.10.0 # Apache-2.0 oslotest>=1.10.0 # Apache-2.0
os-testr>=0.8.0 # Apache-2.0 os-testr>=0.8.0 # Apache-2.0
@@ -15,13 +15,12 @@ testscenarios>=0.4 # Apache-2.0/BSD
testtools>=1.4.0 # MIT testtools>=1.4.0 # MIT
# Doc requirements # Doc requirements
openstackdocstheme>=1.11.0 # Apache-2.0 oslosphinx>=4.7.0 # Apache-2.0
sphinx>=1.6.2 # BSD sphinx!=1.3b1,<1.4,>=1.2.1 # BSD
sphinxcontrib-pecanwsme>=0.8 # Apache-2.0 sphinxcontrib-pecanwsme>=0.8 # Apache-2.0
# releasenotes # releasenotes
reno!=2.3.1,>=1.8.0 # Apache-2.0 reno>=1.8.0 # Apache-2.0
# bandit # bandit
bandit>=1.1.0 # Apache-2.0 bandit>=1.1.0 # Apache-2.0

12
tox.ini
View File

@@ -1,21 +1,18 @@
[tox] [tox]
minversion = 1.8 minversion = 1.8
envlist = py35,py27,pep8 envlist = py35,py34,py27,pep8
skipsdist = True skipsdist = True
[testenv] [testenv]
usedevelop = True usedevelop = True
whitelist_externals = find whitelist_externals = find
rm install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/ocata} {opts} {packages}
install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
setenv = setenv =
VIRTUAL_ENV={envdir} VIRTUAL_ENV={envdir}
deps = -r{toxinidir}/test-requirements.txt deps = -r{toxinidir}/test-requirements.txt
commands = commands =
rm -f .testrepository/times.dbm
find . -type f -name "*.py[c|o]" -delete find . -type f -name "*.py[c|o]" -delete
ostestr --concurrency=6 {posargs} ostestr --concurrency=6 {posargs}
passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
[testenv:pep8] [testenv:pep8]
commands = commands =
@@ -44,13 +41,12 @@ commands = oslo_debug_helper -t watcher/tests {posargs}
[testenv:genconfig] [testenv:genconfig]
sitepackages = False sitepackages = False
commands = commands =
oslo-config-generator --config-file etc/watcher/oslo-config-generator/watcher.conf oslo-config-generator --config-file etc/watcher/watcher-config-generator.conf
[flake8] [flake8]
show-source=True show-source=True
ignore= H105,E123,E226,N320,H202 ignore=
builtins= _ builtins= _
enable-extensions = H106,H203
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,*sqlalchemy/alembic/versions/*,demo/,releasenotes exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,*sqlalchemy/alembic/versions/*,demo/,releasenotes
[testenv:wheel] [testenv:wheel]

View File

@@ -32,6 +32,16 @@ _C = _translators.contextual_form
# The plural translation function using the name "_P" # The plural translation function using the name "_P"
_P = _translators.plural_form _P = _translators.plural_form
# Translators for log levels.
#
# The abbreviated names are meant to reflect the usual use of a short
# name like '_'. The "L" is for "log" and the other letter comes from
# the level.
_LI = _translators.log_info
_LW = _translators.log_warning
_LE = _translators.log_error
_LC = _translators.log_critical
def lazy_translation_enabled(): def lazy_translation_enabled():
return _lazy.USE_LAZY return _lazy.USE_LAZY

View File

@@ -1,40 +0,0 @@
# -*- mode: python -*-
# -*- encoding: utf-8 -*-
#
# 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.
"""
Use this file for deploying the API service under Apache2 mod_wsgi.
"""
import sys
from oslo_config import cfg
import oslo_i18n as i18n
from oslo_log import log
from watcher.api import app
from watcher.common import service
CONF = cfg.CONF
i18n.install('watcher')
service.prepare_service(sys.argv)
LOG = log.getLogger(__name__)
LOG.debug("Configuration:")
CONF.log_opt_values(LOG, log.DEBUG)
application = app.VersionSelectorApplication()

View File

@@ -488,7 +488,6 @@ class ActionPlansController(rest.RestController):
raise exception.PatchError(patch=patch, reason=e) raise exception.PatchError(patch=patch, reason=e)
launch_action_plan = False launch_action_plan = False
cancel_action_plan = False
# transitions that are allowed via PATCH # transitions that are allowed via PATCH
allowed_patch_transitions = [ allowed_patch_transitions = [
@@ -497,7 +496,7 @@ class ActionPlansController(rest.RestController):
(ap_objects.State.RECOMMENDED, (ap_objects.State.RECOMMENDED,
ap_objects.State.CANCELLED), ap_objects.State.CANCELLED),
(ap_objects.State.ONGOING, (ap_objects.State.ONGOING,
ap_objects.State.CANCELLING), ap_objects.State.CANCELLED),
(ap_objects.State.PENDING, (ap_objects.State.PENDING,
ap_objects.State.CANCELLED), ap_objects.State.CANCELLED),
] ]
@@ -516,8 +515,6 @@ class ActionPlansController(rest.RestController):
if action_plan.state == ap_objects.State.PENDING: if action_plan.state == ap_objects.State.PENDING:
launch_action_plan = True launch_action_plan = True
if action_plan.state == ap_objects.State.CANCELLED:
cancel_action_plan = True
# Update only the fields that have changed # Update only the fields that have changed
for field in objects.ActionPlan.fields: for field in objects.ActionPlan.fields:
@@ -537,16 +534,6 @@ class ActionPlansController(rest.RestController):
action_plan_to_update.save() action_plan_to_update.save()
# NOTE: if action plan is cancelled from pending or recommended
# state update action state here only
if cancel_action_plan:
filters = {'action_plan_uuid': action_plan.uuid}
actions = objects.Action.list(pecan.request.context,
filters=filters, eager=True)
for a in actions:
a.state = objects.action.State.CANCELLED
a.save()
if launch_action_plan: if launch_action_plan:
applier_client = rpcapi.ApplierAPI() applier_client = rpcapi.ApplierAPI()
applier_client.launch_action_plan(pecan.request.context, applier_client.launch_action_plan(pecan.request.context,

View File

@@ -50,6 +50,21 @@ from watcher.decision_engine import rpcapi
from watcher import objects from watcher import objects
ALLOWED_AUDIT_TRANSITIONS = {
objects.audit.State.PENDING:
[objects.audit.State.ONGOING, objects.audit.State.CANCELLED],
objects.audit.State.ONGOING:
[objects.audit.State.FAILED, objects.audit.State.SUCCEEDED,
objects.audit.State.CANCELLED],
objects.audit.State.FAILED:
[objects.audit.State.DELETED],
objects.audit.State.SUCCEEDED:
[objects.audit.State.DELETED],
objects.audit.State.CANCELLED:
[objects.audit.State.DELETED]
}
class AuditPostType(wtypes.Base): class AuditPostType(wtypes.Base):
audit_template_uuid = wtypes.wsattr(types.uuid, mandatory=False) audit_template_uuid = wtypes.wsattr(types.uuid, mandatory=False)
@@ -65,7 +80,7 @@ class AuditPostType(wtypes.Base):
parameters = wtypes.wsattr({wtypes.text: types.jsontype}, mandatory=False, parameters = wtypes.wsattr({wtypes.text: types.jsontype}, mandatory=False,
default={}) default={})
interval = wsme.wsattr(types.interval_or_cron, mandatory=False) interval = wsme.wsattr(int, mandatory=False)
scope = wtypes.wsattr(types.jsontype, readonly=True) scope = wtypes.wsattr(types.jsontype, readonly=True)
@@ -129,15 +144,8 @@ class AuditPatchType(types.JsonPatchType):
@staticmethod @staticmethod
def validate(patch): def validate(patch):
serialized_patch = {'path': patch.path, 'op': patch.op}
def is_new_state_none(p): if patch.path in AuditPatchType.mandatory_attrs():
return p.path == '/state' and p.op == 'replace' and p.value is None
serialized_patch = {'path': patch.path,
'op': patch.op,
'value': patch.value}
if (patch.path in AuditPatchType.mandatory_attrs() or
is_new_state_none(patch)):
msg = _("%(field)s can't be updated.") msg = _("%(field)s can't be updated.")
raise exception.PatchError( raise exception.PatchError(
patch=serialized_patch, patch=serialized_patch,
@@ -261,7 +269,7 @@ class Audit(base.APIBase):
links = wsme.wsattr([link.Link], readonly=True) links = wsme.wsattr([link.Link], readonly=True)
"""A list containing a self link and associated audit links""" """A list containing a self link and associated audit links"""
interval = wsme.wsattr(wtypes.text, mandatory=False) interval = wsme.wsattr(int, mandatory=False)
"""Launch audit periodically (in seconds)""" """Launch audit periodically (in seconds)"""
scope = wsme.wsattr(types.jsontype, mandatory=False) scope = wsme.wsattr(types.jsontype, mandatory=False)
@@ -270,9 +278,6 @@ class Audit(base.APIBase):
auto_trigger = wsme.wsattr(bool, mandatory=False, default=False) auto_trigger = wsme.wsattr(bool, mandatory=False, default=False)
"""Autoexecute action plan once audit is succeeded""" """Autoexecute action plan once audit is succeeded"""
next_run_time = wsme.wsattr(datetime.datetime, mandatory=False)
"""The next time audit launch"""
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.fields = [] self.fields = []
fields = list(objects.Audit.fields) fields = list(objects.Audit.fields)
@@ -304,8 +309,7 @@ class Audit(base.APIBase):
audit.unset_fields_except(['uuid', 'audit_type', 'state', audit.unset_fields_except(['uuid', 'audit_type', 'state',
'goal_uuid', 'interval', 'scope', 'goal_uuid', 'interval', 'scope',
'strategy_uuid', 'goal_name', 'strategy_uuid', 'goal_name',
'strategy_name', 'auto_trigger', 'strategy_name'])
'next_run_time'])
audit.links = [link.Link.make_link('self', url, audit.links = [link.Link.make_link('self', url,
'audits', audit.uuid), 'audits', audit.uuid),
@@ -329,10 +333,9 @@ class Audit(base.APIBase):
created_at=datetime.datetime.utcnow(), created_at=datetime.datetime.utcnow(),
deleted_at=None, deleted_at=None,
updated_at=datetime.datetime.utcnow(), updated_at=datetime.datetime.utcnow(),
interval='7200', interval=7200,
scope=[], scope=[],
auto_trigger=False, auto_trigger=False)
next_run_time=datetime.datetime.utcnow())
sample.goal_id = '7ae81bb3-dec3-4289-8d6c-da80bd8001ae' sample.goal_id = '7ae81bb3-dec3-4289-8d6c-da80bd8001ae'
sample.strategy_id = '7ae81bb3-dec3-4289-8d6c-da80bd8001ff' sample.strategy_id = '7ae81bb3-dec3-4289-8d6c-da80bd8001ff'
@@ -569,22 +572,21 @@ class AuditsController(rest.RestController):
try: try:
audit_dict = audit_to_update.as_dict() audit_dict = audit_to_update.as_dict()
initial_state = audit_dict['state']
new_state = api_utils.get_patch_value(patch, 'state')
if not api_utils.check_audit_state_transition(
patch, initial_state):
error_message = _("State transition not allowed: "
"(%(initial_state)s -> %(new_state)s)")
raise exception.PatchError(
patch=patch,
reason=error_message % dict(
initial_state=initial_state, new_state=new_state))
audit = Audit(**api_utils.apply_jsonpatch(audit_dict, patch)) audit = Audit(**api_utils.apply_jsonpatch(audit_dict, patch))
except api_utils.JSONPATCH_EXCEPTIONS as e: except api_utils.JSONPATCH_EXCEPTIONS as e:
raise exception.PatchError(patch=patch, reason=e) raise exception.PatchError(patch=patch, reason=e)
initial_state = audit_dict['state']
new_state = api_utils.get_patch_value(patch, 'state')
allowed_states = ALLOWED_AUDIT_TRANSITIONS.get(initial_state, [])
if new_state is not None and new_state not in allowed_states:
error_message = _("State transition not allowed: "
"(%(initial_state)s -> %(new_state)s)")
raise exception.PatchError(
patch=patch,
reason=error_message % dict(
initial_state=initial_state, new_state=new_state))
# Update only the fields that have changed # Update only the fields that have changed
for field in objects.Audit.fields: for field in objects.Audit.fields:
try: try:

View File

@@ -109,21 +109,6 @@ class AuditTemplatePostType(wtypes.Base):
common_utils.Draft4Validator( common_utils.Draft4Validator(
default.DefaultScope.DEFAULT_SCHEMA).validate(audit_template.scope) default.DefaultScope.DEFAULT_SCHEMA).validate(audit_template.scope)
include_host_aggregates = False
exclude_host_aggregates = False
for rule in audit_template.scope:
if 'host_aggregates' in rule:
include_host_aggregates = True
elif 'exclude' in rule:
for resource in rule['exclude']:
if 'host_aggregates' in resource:
exclude_host_aggregates = True
if include_host_aggregates and exclude_host_aggregates:
raise exception.Invalid(
message=_(
"host_aggregates can't be "
"included and excluded together"))
if audit_template.strategy: if audit_template.strategy:
available_strategies = objects.Strategy.list( available_strategies = objects.Strategy.list(
AuditTemplatePostType._ctx) AuditTemplatePostType._ctx)
@@ -550,7 +535,7 @@ class AuditTemplatesController(rest.RestController):
def get_one(self, audit_template): def get_one(self, audit_template):
"""Retrieve information about the given audit template. """Retrieve information about the given audit template.
:param audit_template: UUID or name of an audit template. :param audit audit_template: UUID or name of an audit template.
""" """
if self.from_audit_templates: if self.from_audit_templates:
raise exception.OperationNotPermitted raise exception.OperationNotPermitted
@@ -597,7 +582,7 @@ class AuditTemplatesController(rest.RestController):
def patch(self, audit_template, patch): def patch(self, audit_template, patch):
"""Update an existing audit template. """Update an existing audit template.
:param template_uuid: UUID of a audit template. :param audit template_uuid: UUID of a audit template.
:param patch: a json PATCH document to apply to this audit template. :param patch: a json PATCH document to apply to this audit template.
""" """
if self.from_audit_templates: if self.from_audit_templates:
@@ -645,7 +630,7 @@ class AuditTemplatesController(rest.RestController):
def delete(self, audit_template): def delete(self, audit_template):
"""Delete a audit template. """Delete a audit template.
:param template_uuid: UUID or name of an audit template. :param audit template_uuid: UUID or name of an audit template.
""" """
context = pecan.request.context context = pecan.request.context
audit_template_to_delete = api_utils.get_resource('AuditTemplate', audit_template_to_delete = api_utils.get_resource('AuditTemplate',

View File

@@ -30,11 +30,11 @@ import wsme
from wsme import types as wtypes from wsme import types as wtypes
import wsmeext.pecan as wsme_pecan import wsmeext.pecan as wsme_pecan
from watcher._i18n import _LW
from watcher.api.controllers import base from watcher.api.controllers import base
from watcher.api.controllers import link from watcher.api.controllers import link
from watcher.api.controllers.v1 import collection from watcher.api.controllers.v1 import collection
from watcher.api.controllers.v1 import utils as api_utils from watcher.api.controllers.v1 import utils as api_utils
from watcher.common import context
from watcher.common import exception from watcher.common import exception
from watcher.common import policy from watcher.common import policy
from watcher import objects from watcher import objects
@@ -52,13 +52,12 @@ class Service(base.APIBase):
""" """
_status = None _status = None
_context = context.RequestContext(is_admin=True)
def _get_status(self): def _get_status(self):
return self._status return self._status
def _set_status(self, id): def _set_status(self, name):
service = objects.Service.get(pecan.request.context, id) service = objects.Service.get_by_name(pecan.request.context, name)
last_heartbeat = (service.last_seen_up or service.updated_at last_heartbeat = (service.last_seen_up or service.updated_at
or service.created_at) or service.created_at)
if isinstance(last_heartbeat, six.string_types): if isinstance(last_heartbeat, six.string_types):
@@ -73,9 +72,9 @@ class Service(base.APIBase):
elapsed = timeutils.delta_seconds(last_heartbeat, timeutils.utcnow()) elapsed = timeutils.delta_seconds(last_heartbeat, timeutils.utcnow())
is_up = abs(elapsed) <= CONF.service_down_time is_up = abs(elapsed) <= CONF.service_down_time
if not is_up: if not is_up:
LOG.warning('Seems service %(name)s on host %(host)s is down. ' LOG.warning(_LW('Seems service %(name)s on host %(host)s is down. '
'Last heartbeat was %(lhb)s.' 'Last heartbeat was %(lhb)s.'
'Elapsed time is %(el)s', 'Elapsed time is %(el)s'),
{'name': service.name, {'name': service.name,
'host': service.host, 'host': service.host,
'lhb': str(last_heartbeat), 'el': str(elapsed)}) 'lhb': str(last_heartbeat), 'el': str(elapsed)})
@@ -109,7 +108,7 @@ class Service(base.APIBase):
for field in fields: for field in fields:
self.fields.append(field) self.fields.append(field)
setattr(self, field, kwargs.get( setattr(self, field, kwargs.get(
field if field != 'status' else 'id', wtypes.Unset)) field if field != 'status' else 'name', wtypes.Unset))
@staticmethod @staticmethod
def _convert_with_links(service, url, expand=True): def _convert_with_links(service, url, expand=True):

View File

@@ -43,28 +43,6 @@ class UuidOrNameType(wtypes.UserType):
return UuidOrNameType.validate(value) return UuidOrNameType.validate(value)
class IntervalOrCron(wtypes.UserType):
"""A simple int value or cron syntax type"""
basetype = wtypes.text
name = 'interval_or_cron'
@staticmethod
def validate(value):
if not (utils.is_int_like(value) or utils.is_cron_like(value)):
raise exception.InvalidIntervalOrCron(name=value)
return value
@staticmethod
def frombasetype(value):
if value is None:
return None
return IntervalOrCron.validate(value)
interval_or_cron = IntervalOrCron()
class NameType(wtypes.UserType): class NameType(wtypes.UserType):
"""A simple logical name type.""" """A simple logical name type."""
@@ -203,7 +181,7 @@ class JsonPatchType(wtypes.Base):
@staticmethod @staticmethod
def mandatory_attrs(): def mandatory_attrs():
"""Returns a list of mandatory attributes. """Retruns a list of mandatory attributes.
Mandatory attributes can't be removed from the document. This Mandatory attributes can't be removed from the document. This
method should be overwritten by derived class. method should be overwritten by derived class.

View File

@@ -55,7 +55,7 @@ def validate_sort_dir(sort_dir):
def validate_search_filters(filters, allowed_fields): def validate_search_filters(filters, allowed_fields):
# Very lightweight validation for now # Very leightweight validation for now
# todo: improve this (e.g. https://www.parse.com/docs/rest/guide/#queries) # todo: improve this (e.g. https://www.parse.com/docs/rest/guide/#queries)
for filter_name in filters.keys(): for filter_name in filters.keys():
if filter_name not in allowed_fields: if filter_name not in allowed_fields:
@@ -79,15 +79,6 @@ def get_patch_value(patch, key):
return p['value'] return p['value']
def check_audit_state_transition(patch, initial):
is_transition_valid = True
state_value = get_patch_value(patch, "state")
if state_value is not None:
is_transition_valid = objects.audit.AuditStateTransitionManager(
).check_transition(initial, state_value)
return is_transition_valid
def as_filters_dict(**filters): def as_filters_dict(**filters):
filters_dict = {} filters_dict = {}
for filter_name, filter_value in filters.items(): for filter_name, filter_value in filters.items():

View File

@@ -27,7 +27,7 @@ from oslo_serialization import jsonutils
import six import six
import webob import webob
from watcher._i18n import _ from watcher._i18n import _, _LE
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
@@ -79,7 +79,7 @@ class ParsableErrorMiddleware(object):
et.ElementTree.Element( et.ElementTree.Element(
'error_message', text='\n'.join(app_iter)))] 'error_message', text='\n'.join(app_iter)))]
except et.ElementTree.ParseError as err: except et.ElementTree.ParseError as err:
LOG.error('Error parsing HTTP response: %s', err) LOG.error(_LE('Error parsing HTTP response: %s'), err)
body = ['<error_message>%s' body = ['<error_message>%s'
'</error_message>' % state['status_code']] '</error_message>' % state['status_code']]
state['headers'].append(('Content-Type', 'application/xml')) state['headers'].append(('Content-Type', 'application/xml'))

Some files were not shown because too many files have changed in this diff Show More