Compare commits
314 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3591d9fa0a | ||
|
|
44fc7d5799 | ||
|
|
a330576eae | ||
|
|
70d05214c7 | ||
|
|
ca9644f4d8 | ||
|
|
44061cf333 | ||
|
|
18bf1f4e8d | ||
|
|
f2df0da0b2 | ||
|
|
3c83077724 | ||
|
|
d8872a743b | ||
|
|
7556d19638 | ||
|
|
58276ec79e | ||
|
|
36ad9e12da | ||
|
|
cdb1975530 | ||
|
|
6efffd6d89 | ||
|
|
95ec79626b | ||
|
|
00aa77651b | ||
|
|
7d62175b23 | ||
|
|
5107cfa30f | ||
|
|
ff57eb73f9 | ||
|
|
4c035a7cbd | ||
|
|
b5d9eb6acb | ||
|
|
904b72cf5e | ||
|
|
d23e7f0f8c | ||
|
|
55cbb15fbc | ||
|
|
3a5b42302c | ||
|
|
4fdb22cba2 | ||
|
|
431f17d999 | ||
|
|
b586612d25 | ||
|
|
ad1593bb36 | ||
|
|
bbd0ae5b16 | ||
|
|
5a30f814bf | ||
|
|
7f6a300ea0 | ||
|
|
93a8ba804f | ||
|
|
415bab4bc9 | ||
|
|
fc388d8292 | ||
|
|
5b70c28047 | ||
|
|
b290ad7368 | ||
|
|
8c8e58e7d9 | ||
|
|
391bb92bd2 | ||
|
|
171654c0ea | ||
|
|
0157fa7dad | ||
|
|
3912075c19 | ||
|
|
d42a89f70f | ||
|
|
6bb25d2c36 | ||
|
|
4179c3527c | ||
|
|
3b1356346a | ||
|
|
67be974861 | ||
|
|
8c916930c8 | ||
|
|
b537979e45 | ||
|
|
aa74817686 | ||
|
|
831e58df10 | ||
|
|
3dd03b2d45 | ||
|
|
2548f0bbba | ||
|
|
39d7ce9ee8 | ||
|
|
1f8c073cb3 | ||
|
|
0353a0ac77 | ||
|
|
921584ac4b | ||
|
|
65a09ce32d | ||
|
|
92dad3be2d | ||
|
|
d86fee294f | ||
|
|
95a01c4e12 | ||
|
|
b9456e242e | ||
|
|
4e49ad64c0 | ||
|
|
184b1b1ce6 | ||
|
|
f49d0555e7 | ||
|
|
9d8a0feab4 | ||
|
|
52a5c99fc5 | ||
|
|
cfaab0cbdc | ||
|
|
6bb0432ee7 | ||
|
|
99837d6339 | ||
|
|
3075723da9 | ||
|
|
b0bdeea7cf | ||
|
|
5eaad33709 | ||
|
|
24b6432490 | ||
|
|
ca61594511 | ||
|
|
bd57077bfe | ||
|
|
56bcba2dc0 | ||
|
|
73928412b3 | ||
|
|
29f41b7dff | ||
|
|
02f86ffe02 | ||
|
|
20c6bf1b5a | ||
|
|
083f070d17 | ||
|
|
4022b59d79 | ||
|
|
3d1cb11ea6 | ||
|
|
d0b1dacec1 | ||
|
|
45a06445f3 | ||
|
|
2f173bba56 | ||
|
|
cb497d2642 | ||
|
|
e1fd686272 | ||
|
|
8f7127a874 | ||
|
|
3a529a0f7b | ||
|
|
5c81f1bd7f | ||
|
|
e0c019002a | ||
|
|
cc24ef6e08 | ||
|
|
7e27abc5db | ||
|
|
4844baa816 | ||
|
|
e771ae9e95 | ||
|
|
a2488045ea | ||
|
|
cce5ebd3f0 | ||
|
|
a7ab77078e | ||
|
|
9af32bce5b | ||
|
|
4cf35e7e62 | ||
|
|
6f27e50cf0 | ||
|
|
bd8c5c684c | ||
|
|
1834db853b | ||
|
|
59ef0d24d1 | ||
|
|
c53817c33d | ||
|
|
b33b7a0474 | ||
|
|
033bc072c0 | ||
|
|
f32ed6bc79 | ||
|
|
707590143b | ||
|
|
b2663de513 | ||
|
|
dd210292ae | ||
|
|
abb9155eb4 | ||
|
|
f607ae8ec0 | ||
|
|
b3ded34244 | ||
|
|
bdfb074aa4 | ||
|
|
b3be5f16fc | ||
|
|
dad60fb878 | ||
|
|
fb66a9f2c3 | ||
|
|
dc9ef6f49c | ||
|
|
8e8a43ed48 | ||
|
|
5ac65b7bfc | ||
|
|
7b9b726577 | ||
|
|
c81cd675a5 | ||
|
|
ab926bf6c5 | ||
|
|
08c688ed11 | ||
|
|
e399d96661 | ||
|
|
ba54b30d4a | ||
|
|
44d9183d36 | ||
|
|
f6f3c00206 | ||
|
|
cc87b823fa | ||
|
|
ba2395f7e7 | ||
|
|
b546ce8777 | ||
|
|
0900eaa9df | ||
|
|
9fb5b2a4e7 | ||
|
|
d80edea218 | ||
|
|
26d6074689 | ||
|
|
40a653215f | ||
|
|
1492f5d8dc | ||
|
|
76263f149a | ||
|
|
028006d15d | ||
|
|
d27ba8cc2a | ||
|
|
33750ce7a9 | ||
|
|
cb8d1a98d6 | ||
|
|
f32252d510 | ||
|
|
4849f8dde9 | ||
|
|
0cafdcdee9 | ||
|
|
3a70225164 | ||
|
|
892c766ac4 | ||
|
|
63a3fd84ae | ||
|
|
287ace1dcc | ||
|
|
4b302e415e | ||
|
|
f24744c910 | ||
|
|
d9a85eda2c | ||
|
|
82c8633e42 | ||
|
|
d3f23795f5 | ||
|
|
e7f4456a80 | ||
|
|
a36a309e2e | ||
|
|
8e3affd9ac | ||
|
|
71e979cae0 | ||
|
|
6edfd34a53 | ||
|
|
0c8c32e69e | ||
|
|
9138b7bacb | ||
|
|
072822d920 | ||
|
|
f67ce8cca5 | ||
|
|
9e6f768263 | ||
|
|
ba9c89186b | ||
|
|
16e7d9c13b | ||
|
|
c3536406bd | ||
|
|
0c66fe2e65 | ||
|
|
74933bf0ba | ||
|
|
1dae83da57 | ||
|
|
5ec8932182 | ||
|
|
701b258dc7 | ||
|
|
f7fcdf14d0 | ||
|
|
47ba6c0808 | ||
|
|
5b5fbbedb4 | ||
|
|
a1c575bfc5 | ||
|
|
27e887556d | ||
|
|
891f6bc241 | ||
|
|
5dd6817d47 | ||
|
|
7cdcb4743e | ||
|
|
6d03c4c543 | ||
|
|
bcc129cf94 | ||
|
|
40cff311c6 | ||
|
|
1a48a7fc57 | ||
|
|
652aa54586 | ||
|
|
42a3886ded | ||
|
|
3430493de1 | ||
|
|
f5bcf9d355 | ||
|
|
d809523bef | ||
|
|
bfe3c28986 | ||
|
|
3c8caa3d0a | ||
|
|
766d064dd0 | ||
|
|
ce196b68c4 | ||
|
|
42130c42a1 | ||
|
|
1a8639d256 | ||
|
|
1702fe1a83 | ||
|
|
354ebd35cc | ||
|
|
7297603f65 | ||
|
|
9626cb1356 | ||
|
|
9e027940d7 | ||
|
|
3754938d96 | ||
|
|
8a7f930a64 | ||
|
|
f7e506155b | ||
|
|
54da2a75fb | ||
|
|
5cbb9aca7e | ||
|
|
bd79882b16 | ||
|
|
960c50ba45 | ||
|
|
9411f85cd2 | ||
|
|
b4370f0461 | ||
|
|
97799521f9 | ||
|
|
96fa7f33ac | ||
|
|
1c2d0aa1f2 | ||
|
|
070aed7076 | ||
|
|
2b402d3cbf | ||
|
|
cca3e75ac1 | ||
|
|
6f27275f44 | ||
|
|
95548af426 | ||
|
|
cdc847d352 | ||
|
|
b69244f8ef | ||
|
|
cbd6d88025 | ||
|
|
028d7c939c | ||
|
|
a8fa969379 | ||
|
|
80ee4b29f5 | ||
|
|
e562c9173c | ||
|
|
ec0c359037 | ||
|
|
3b6bef180b | ||
|
|
640e4e1fea | ||
|
|
eeb817cd6e | ||
|
|
c6afa7c320 | ||
|
|
9ccd17e40b | ||
|
|
2a7e0d652c | ||
|
|
a94e35b60e | ||
|
|
72e3d5c7f9 | ||
|
|
be56441e55 | ||
|
|
aa2b213a45 | ||
|
|
668513d771 | ||
|
|
0242d33adb | ||
|
|
c38dc9828b | ||
|
|
c2e16bfa96 | ||
|
|
4ce1a9096b | ||
|
|
13644429b7 | ||
|
|
b8cc506fbe | ||
|
|
02163d64aa | ||
|
|
d91f0bff22 | ||
|
|
c91f6479f0 | ||
|
|
92572c5dec | ||
|
|
a8f08065fd | ||
|
|
e401cb7c9d | ||
|
|
0745d904fc | ||
|
|
bc4a58d2d7 | ||
|
|
f14795d29f | ||
|
|
e0104074b6 | ||
|
|
2993dea376 | ||
|
|
17b6019ea9 | ||
|
|
5969e5b52a | ||
|
|
e55f3793b6 | ||
|
|
901c598dd7 | ||
|
|
e41a90d7ad | ||
|
|
fa31341bbb | ||
|
|
051b4fcd06 | ||
|
|
cd045400ed | ||
|
|
2db668af30 | ||
|
|
39b1fcf07f | ||
|
|
94babf61da | ||
|
|
a5fba7ce28 | ||
|
|
24e01b6c98 | ||
|
|
4007f93aac | ||
|
|
77c9f88fc4 | ||
|
|
e9b7f067c5 | ||
|
|
f8aa02c4a7 | ||
|
|
3595108e49 | ||
|
|
d536ed248b | ||
|
|
71730c0eaf | ||
|
|
1b4c5dfc8b | ||
|
|
4179cfd036 | ||
|
|
49550db566 | ||
|
|
e0eba0ee7b | ||
|
|
165853ee2c | ||
|
|
0a7152fa55 | ||
|
|
6c29df11ca | ||
|
|
55bd0fd038 | ||
|
|
907cc2df16 | ||
|
|
8dcac1597b | ||
|
|
a3be1587e3 | ||
|
|
aa72f984e4 | ||
|
|
bcd2040025 | ||
|
|
f2c9dc9c32 | ||
|
|
6c94c235fc | ||
|
|
7ed45e3ef1 | ||
|
|
8722951022 | ||
|
|
568d4e831c | ||
|
|
deefc857ba | ||
|
|
d33736e7f0 | ||
|
|
1b1779cc49 | ||
|
|
d727bc3076 | ||
|
|
875b7e1ca3 | ||
|
|
c7f8755f9c | ||
|
|
0472715e0c | ||
|
|
2482e82548 | ||
|
|
e9c420467e | ||
|
|
2d5db7082b | ||
|
|
4a3a50435a | ||
|
|
05b57fee7a | ||
|
|
3729e39552 | ||
|
|
91911c8284 | ||
|
|
d7d56cbd79 | ||
|
|
d722b62b97 | ||
|
|
bf713ac7e1 | ||
|
|
51b3a15c90 | ||
|
|
74bc31e562 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -24,6 +24,7 @@ pip-log.txt
|
|||||||
.coverage*
|
.coverage*
|
||||||
.tox
|
.tox
|
||||||
nosetests.xml
|
nosetests.xml
|
||||||
|
.stestr/
|
||||||
.testrepository
|
.testrepository
|
||||||
.venv
|
.venv
|
||||||
.idea
|
.idea
|
||||||
|
|||||||
4
.stestr.conf
Normal file
4
.stestr.conf
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
[DEFAULT]
|
||||||
|
test_path=${OS_TEST_PATH:-./watcher/tests}
|
||||||
|
top_dir=./
|
||||||
|
|
||||||
139
.zuul.yaml
Normal file
139
.zuul.yaml
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
- project:
|
||||||
|
check:
|
||||||
|
jobs:
|
||||||
|
- watcher-tempest-functional
|
||||||
|
- watcher-tempest-dummy_optim
|
||||||
|
- watcher-tempest-actuator
|
||||||
|
- watcher-tempest-basic_optim
|
||||||
|
- watcher-tempest-workload_balancing
|
||||||
|
- watcherclient-tempest-functional
|
||||||
|
- legacy-rally-dsvm-watcher-rally
|
||||||
|
- openstack-tox-lower-constraints
|
||||||
|
gate:
|
||||||
|
jobs:
|
||||||
|
- watcher-tempest-functional
|
||||||
|
- watcher-tempest-dummy_optim
|
||||||
|
- watcher-tempest-actuator
|
||||||
|
- watcher-tempest-basic_optim
|
||||||
|
- watcher-tempest-workload_balancing
|
||||||
|
- watcherclient-tempest-functional
|
||||||
|
- legacy-rally-dsvm-watcher-rally
|
||||||
|
- openstack-tox-lower-constraints
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: watcher-tempest-dummy_optim
|
||||||
|
parent: watcher-tempest-multinode
|
||||||
|
vars:
|
||||||
|
tempest_test_regex: 'watcher_tempest_plugin.tests.scenario.test_execute_dummy_optim'
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: watcher-tempest-actuator
|
||||||
|
parent: watcher-tempest-multinode
|
||||||
|
vars:
|
||||||
|
tempest_test_regex: 'watcher_tempest_plugin.tests.scenario.test_execute_actuator'
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: watcher-tempest-basic_optim
|
||||||
|
parent: watcher-tempest-multinode
|
||||||
|
vars:
|
||||||
|
tempest_test_regex: 'watcher_tempest_plugin.tests.scenario.test_execute_basic_optim'
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: watcher-tempest-workload_balancing
|
||||||
|
parent: watcher-tempest-multinode
|
||||||
|
vars:
|
||||||
|
tempest_test_regex: 'watcher_tempest_plugin.tests.scenario.test_execute_workload_balancing'
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: watcher-tempest-multinode
|
||||||
|
parent: watcher-tempest-functional
|
||||||
|
voting: false
|
||||||
|
nodeset: openstack-two-node
|
||||||
|
pre-run: playbooks/pre.yaml
|
||||||
|
run: playbooks/orchestrate-tempest.yaml
|
||||||
|
roles:
|
||||||
|
- zuul: openstack/tempest
|
||||||
|
group-vars:
|
||||||
|
subnode:
|
||||||
|
devstack_local_conf:
|
||||||
|
post-config:
|
||||||
|
$NOVA_CONF:
|
||||||
|
libvirt:
|
||||||
|
live_migration_uri: 'qemu+ssh://root@%s/system'
|
||||||
|
devstack_services:
|
||||||
|
watcher-api: false
|
||||||
|
watcher-decision-engine: false
|
||||||
|
watcher-applier: false
|
||||||
|
# We need to add TLS support for watcher plugin
|
||||||
|
tls-proxy: false
|
||||||
|
ceilometer: false
|
||||||
|
ceilometer-acompute: false
|
||||||
|
ceilometer-acentral: false
|
||||||
|
ceilometer-anotification: false
|
||||||
|
watcher: false
|
||||||
|
gnocchi-api: false
|
||||||
|
gnocchi-metricd: false
|
||||||
|
rabbit: false
|
||||||
|
mysql: false
|
||||||
|
vars:
|
||||||
|
devstack_local_conf:
|
||||||
|
post-config:
|
||||||
|
$NOVA_CONF:
|
||||||
|
libvirt:
|
||||||
|
live_migration_uri: 'qemu+ssh://root@%s/system'
|
||||||
|
test-config:
|
||||||
|
$TEMPEST_CONFIG:
|
||||||
|
compute:
|
||||||
|
min_compute_nodes: 2
|
||||||
|
compute-feature-enabled:
|
||||||
|
live_migration: true
|
||||||
|
block_migration_for_live_migration: true
|
||||||
|
devstack_plugins:
|
||||||
|
ceilometer: https://git.openstack.org/openstack/ceilometer
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: watcher-tempest-functional
|
||||||
|
parent: devstack-tempest
|
||||||
|
timeout: 7200
|
||||||
|
required-projects:
|
||||||
|
- openstack/ceilometer
|
||||||
|
- openstack-infra/devstack-gate
|
||||||
|
- openstack/python-openstackclient
|
||||||
|
- openstack/python-watcherclient
|
||||||
|
- openstack/watcher
|
||||||
|
- openstack/watcher-tempest-plugin
|
||||||
|
- openstack/tempest
|
||||||
|
vars:
|
||||||
|
devstack_plugins:
|
||||||
|
watcher: https://git.openstack.org/openstack/watcher
|
||||||
|
devstack_services:
|
||||||
|
tls-proxy: false
|
||||||
|
watcher-api: true
|
||||||
|
watcher-decision-engine: true
|
||||||
|
watcher-applier: true
|
||||||
|
tempest: true
|
||||||
|
s-account: false
|
||||||
|
s-container: false
|
||||||
|
s-object: false
|
||||||
|
s-proxy: false
|
||||||
|
devstack_localrc:
|
||||||
|
TEMPEST_PLUGINS: '/opt/stack/watcher-tempest-plugin'
|
||||||
|
tempest_test_regex: 'watcher_tempest_plugin.tests.api'
|
||||||
|
tox_envlist: all
|
||||||
|
tox_environment:
|
||||||
|
# Do we really need to set this? It's cargo culted
|
||||||
|
PYTHONUNBUFFERED: 'true'
|
||||||
|
zuul_copy_output:
|
||||||
|
/etc/hosts: logs
|
||||||
|
|
||||||
|
- job:
|
||||||
|
# This job is used in python-watcherclient repo
|
||||||
|
name: watcherclient-tempest-functional
|
||||||
|
parent: watcher-tempest-functional
|
||||||
|
voting: false
|
||||||
|
timeout: 4200
|
||||||
|
vars:
|
||||||
|
tempest_concurrency: 1
|
||||||
|
devstack_localrc:
|
||||||
|
TEMPEST_PLUGINS: '/opt/stack/python-watcherclient'
|
||||||
|
tempest_test_regex: 'watcherclient.tests.functional'
|
||||||
@@ -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 https://docs.openstack.org/hacking/latest/
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
Team and repository tags
|
Team and repository tags
|
||||||
========================
|
========================
|
||||||
|
|
||||||
.. image:: https://governance.openstack.org/badges/watcher.svg
|
.. image:: https://governance.openstack.org/tc/badges/watcher.svg
|
||||||
:target: https://governance.openstack.org/reference/tags/index.html
|
:target: https://governance.openstack.org/tc/reference/tags/index.html
|
||||||
|
|
||||||
.. Change things from this point on
|
.. Change things from this point on
|
||||||
|
|
||||||
@@ -22,10 +22,11 @@ service for multi-tenant OpenStack-based clouds.
|
|||||||
Watcher provides a robust framework to realize a wide range of cloud
|
Watcher provides a robust framework to realize a wide range of cloud
|
||||||
optimization goals, including the reduction of data center
|
optimization goals, including the reduction of data center
|
||||||
operating costs, increased system performance via intelligent virtual machine
|
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: https://wiki.openstack.org/wiki/Watcher
|
||||||
* Source: https://github.com/openstack/watcher
|
* Source: https://github.com/openstack/watcher
|
||||||
* Bugs: https://bugs.launchpad.net/watcher
|
* Bugs: https://bugs.launchpad.net/watcher
|
||||||
* Documentation: https://docs.openstack.org/watcher/latest/
|
* Documentation: https://docs.openstack.org/watcher/latest/
|
||||||
|
* Release notes: https://docs.openstack.org/releasenotes/watcher/
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ WATCHER_AUTH_CACHE_DIR=${WATCHER_AUTH_CACHE_DIR:-/var/cache/watcher}
|
|||||||
|
|
||||||
WATCHER_CONF_DIR=/etc/watcher
|
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_YAML=$WATCHER_CONF_DIR/policy.yaml.sample
|
||||||
|
|
||||||
WATCHER_DEVSTACK_DIR=$WATCHER_DIR/devstack
|
WATCHER_DEVSTACK_DIR=$WATCHER_DIR/devstack
|
||||||
WATCHER_DEVSTACK_FILES_DIR=$WATCHER_DEVSTACK_DIR/files
|
WATCHER_DEVSTACK_FILES_DIR=$WATCHER_DEVSTACK_DIR/files
|
||||||
@@ -106,7 +106,25 @@ function configure_watcher {
|
|||||||
# Put config files in ``/etc/watcher`` for everyone to find
|
# Put config files in ``/etc/watcher`` for everyone to find
|
||||||
sudo install -d -o $STACK_USER $WATCHER_CONF_DIR
|
sudo install -d -o $STACK_USER $WATCHER_CONF_DIR
|
||||||
|
|
||||||
install_default_policy watcher
|
local project=watcher
|
||||||
|
local project_uc
|
||||||
|
project_uc=$(echo watcher|tr a-z A-Z)
|
||||||
|
local conf_dir="${project_uc}_CONF_DIR"
|
||||||
|
# eval conf dir to get the variable
|
||||||
|
conf_dir="${!conf_dir}"
|
||||||
|
local project_dir="${project_uc}_DIR"
|
||||||
|
# eval project dir to get the variable
|
||||||
|
project_dir="${!project_dir}"
|
||||||
|
local sample_conf_dir="${project_dir}/etc/${project}"
|
||||||
|
local sample_policy_dir="${project_dir}/etc/${project}/policy.d"
|
||||||
|
local sample_policy_generator="${project_dir}/etc/${project}/oslo-policy-generator/watcher-policy-generator.conf"
|
||||||
|
|
||||||
|
# first generate policy.yaml
|
||||||
|
oslopolicy-sample-generator --config-file $sample_policy_generator
|
||||||
|
# then optionally copy over policy.d
|
||||||
|
if [[ -d $sample_policy_dir ]]; then
|
||||||
|
cp -r $sample_policy_dir $conf_dir/policy.d
|
||||||
|
fi
|
||||||
|
|
||||||
# Rebuild the config file from scratch
|
# Rebuild the config file from scratch
|
||||||
create_watcher_conf
|
create_watcher_conf
|
||||||
@@ -159,15 +177,19 @@ function create_watcher_conf {
|
|||||||
iniset $WATCHER_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
|
iniset $WATCHER_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
|
||||||
iniset $WATCHER_CONF DEFAULT control_exchange watcher
|
iniset $WATCHER_CONF DEFAULT control_exchange watcher
|
||||||
|
|
||||||
|
iniset_rpc_backend watcher $WATCHER_CONF
|
||||||
|
|
||||||
iniset $WATCHER_CONF database connection $(database_connection_url watcher)
|
iniset $WATCHER_CONF database connection $(database_connection_url watcher)
|
||||||
iniset $WATCHER_CONF api host "$WATCHER_SERVICE_HOST"
|
iniset $WATCHER_CONF api host "$WATCHER_SERVICE_HOST"
|
||||||
iniset $WATCHER_CONF api port "$WATCHER_SERVICE_PORT"
|
|
||||||
|
|
||||||
iniset $WATCHER_CONF oslo_policy policy_file $WATCHER_POLICY_JSON
|
if is_service_enabled tls-proxy; then
|
||||||
|
iniset $WATCHER_CONF api port "$WATCHER_SERVICE_PORT_INT"
|
||||||
|
# iniset $WATCHER_CONF api enable_ssl_api "True"
|
||||||
|
else
|
||||||
|
iniset $WATCHER_CONF api port "$WATCHER_SERVICE_PORT"
|
||||||
|
fi
|
||||||
|
|
||||||
iniset $WATCHER_CONF oslo_messaging_rabbit rabbit_userid $RABBIT_USERID
|
iniset $WATCHER_CONF oslo_policy policy_file $WATCHER_POLICY_YAML
|
||||||
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_notifications driver "messagingv2"
|
iniset $WATCHER_CONF oslo_messaging_notifications driver "messagingv2"
|
||||||
|
|
||||||
@@ -279,8 +301,7 @@ function start_watcher_api {
|
|||||||
|
|
||||||
# Start proxies if enabled
|
# Start proxies if enabled
|
||||||
if is_service_enabled tls-proxy; then
|
if is_service_enabled tls-proxy; then
|
||||||
start_tls_proxy '*' $WATCHER_SERVICE_PORT $WATCHER_SERVICE_HOST $WATCHER_SERVICE_PORT_INT &
|
start_tls_proxy watcher '*' $WATCHER_SERVICE_PORT $WATCHER_SERVICE_HOST $WATCHER_SERVICE_PORT_INT
|
||||||
start_tls_proxy '*' $EC2_SERVICE_PORT $WATCHER_SERVICE_HOST $WATCHER_SERVICE_PORT_INT &
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
# Make sure rabbit is enabled
|
# Make sure rabbit is enabled
|
||||||
enable_service rabbit
|
enable_service rabbit
|
||||||
|
|
||||||
|
# Make sure mysql is enabled
|
||||||
|
enable_service mysql
|
||||||
|
|
||||||
# Enable Watcher services
|
# Enable Watcher services
|
||||||
enable_service watcher-api
|
enable_service watcher-api
|
||||||
enable_service watcher-decision-engine
|
enable_service watcher-decision-engine
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ It is used via a single directive in the .rst file
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from sphinx.util.compat import Directive
|
from docutils.parsers.rst import Directive
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
|
||||||
from watcher.notifications import base as notification
|
from watcher.notifications import base as notification
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"watcher_object.name": "TerseActionPlanPayload",
|
"watcher_object.name": "TerseActionPlanPayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"updated_at": null,
|
"updated_at": null,
|
||||||
"state": "CANCELLING",
|
"state": "CANCELLING",
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
"watcher_object.name": "TerseActionPlanPayload",
|
"watcher_object.name": "TerseActionPlanPayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"updated_at": null,
|
"updated_at": null,
|
||||||
"state": "CANCELLING",
|
"state": "CANCELLING",
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"watcher_object.name": "TerseActionPlanPayload",
|
"watcher_object.name": "TerseActionPlanPayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"updated_at": null,
|
"updated_at": null,
|
||||||
"state": "CANCELLING",
|
"state": "CANCELLING",
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"watcher_object.name": "TerseActionPlanPayload",
|
"watcher_object.name": "TerseActionPlanPayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"updated_at": null,
|
"updated_at": null,
|
||||||
"state": "ONGOING",
|
"state": "ONGOING",
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
"watcher_object.name": "TerseActionPlanPayload",
|
"watcher_object.name": "TerseActionPlanPayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"global_efficacy": {},
|
"global_efficacy":[],
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"updated_at": null,
|
"updated_at": null,
|
||||||
"state": "ONGOING",
|
"state": "ONGOING",
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"watcher_object.name": "TerseActionPlanPayload",
|
"watcher_object.name": "TerseActionPlanPayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"updated_at": null,
|
"updated_at": null,
|
||||||
"state": "ONGOING",
|
"state": "ONGOING",
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"fault": null,
|
"fault": null,
|
||||||
"state": "CANCELLED",
|
"state": "CANCELLED",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||||
"strategy": {
|
"strategy": {
|
||||||
"watcher_object.namespace": "watcher",
|
"watcher_object.namespace": "watcher",
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
"state": "SUCCEEDED"
|
"state": "SUCCEEDED"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"state": "CANCELLING"
|
"state": "CANCELLING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"fault": null,
|
"fault": null,
|
||||||
"state": "CANCELLING",
|
"state": "CANCELLING",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||||
"strategy": {
|
"strategy": {
|
||||||
"watcher_object.namespace": "watcher",
|
"watcher_object.namespace": "watcher",
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
"audit": {
|
"audit": {
|
||||||
"watcher_object.version": "1.0",
|
"watcher_object.version": "1.0",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"scope": [],
|
"scope": [],
|
||||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||||
"audit": {
|
"audit": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"deleted_at": null,
|
"deleted_at": null,
|
||||||
|
"name": "my_audit",
|
||||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||||
@@ -29,7 +30,7 @@
|
|||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"fault": null,
|
"fault": null,
|
||||||
"state": "ONGOING",
|
"state": "ONGOING",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||||
"strategy": {
|
"strategy": {
|
||||||
"watcher_object.namespace": "watcher",
|
"watcher_object.namespace": "watcher",
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
"watcher_object.name": "TerseAuditPayload",
|
"watcher_object.name": "TerseAuditPayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"parameters": {},
|
"parameters": {},
|
||||||
|
"name": "my_audit",
|
||||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||||
@@ -57,7 +58,7 @@
|
|||||||
"state": "PENDING"
|
"state": "PENDING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"state": "ONGOING"
|
"state": "ONGOING"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
"deleted_at": null,
|
"deleted_at": null,
|
||||||
|
"name": "my_audit",
|
||||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||||
@@ -29,7 +30,7 @@
|
|||||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||||
"fault": null,
|
"fault": null,
|
||||||
"state": "ONGOING",
|
"state": "ONGOING",
|
||||||
"global_efficacy": {},
|
"global_efficacy": [],
|
||||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||||
"strategy": {
|
"strategy": {
|
||||||
"watcher_object.namespace": "watcher",
|
"watcher_object.namespace": "watcher",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"audit": {
|
"audit": {
|
||||||
"watcher_object.version": "1.0",
|
"watcher_object.version": "1.0",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"scope": [],
|
"scope": [],
|
||||||
"created_at": "2016-10-18T09:52:05Z",
|
"created_at": "2016-10-18T09:52:05Z",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "INFO",
|
"priority": "INFO",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "INFO",
|
"priority": "INFO",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "INFO",
|
"priority": "INFO",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "ERROR",
|
"priority": "ERROR",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "INFO",
|
"priority": "INFO",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "INFO",
|
"priority": "INFO",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "ERROR",
|
"priority": "ERROR",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"priority": "INFO",
|
"priority": "INFO",
|
||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"audit_type": "ONESHOT",
|
"audit_type": "ONESHOT",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"para2": "hello",
|
"para2": "hello",
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
"payload": {
|
"payload": {
|
||||||
"watcher_object.name": "AuditUpdatePayload",
|
"watcher_object.name": "AuditUpdatePayload",
|
||||||
"watcher_object.data": {
|
"watcher_object.data": {
|
||||||
|
"name": "my_audit",
|
||||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||||
"strategy": {
|
"strategy": {
|
||||||
"watcher_object.name": "StrategyPayload",
|
"watcher_object.name": "StrategyPayload",
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ 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: https://pypi.org/
|
||||||
|
|
||||||
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.
|
||||||
@@ -126,7 +126,7 @@ Here is single Dockerfile snippet you can use to run your Docker container:
|
|||||||
MAINTAINER David TARDIVEL <david.tardivel@b-com.com>
|
MAINTAINER David TARDIVEL <david.tardivel@b-com.com>
|
||||||
|
|
||||||
RUN apt-get update
|
RUN apt-get update
|
||||||
RUN apt-get dist-upgrade -y
|
RUN apt-get dist-upgrade
|
||||||
RUN apt-get install vim net-tools
|
RUN apt-get install vim net-tools
|
||||||
RUN apt-get install experimental watcher-api
|
RUN apt-get install experimental watcher-api
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
==================================================
|
||||||
|
OpenStack Infrastructure Optimization Service APIs
|
||||||
|
==================================================
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
|||||||
@@ -86,3 +86,15 @@ Actions
|
|||||||
|
|
||||||
.. autotype:: watcher.api.controllers.v1.action.Action
|
.. autotype:: watcher.api.controllers.v1.action.Action
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
Scoring Engine
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. rest-controller:: watcher.api.controllers.v1.scoring_engine:ScoringEngineController
|
||||||
|
:webprefix: /v1/scoring_engine
|
||||||
|
|
||||||
|
.. autotype:: watcher.api.controllers.v1.scoring_engine.ScoringEngineCollection
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autotype:: watcher.api.controllers.v1.scoring_engine.ScoringEngine
|
||||||
|
:members:
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ extensions = [
|
|||||||
'ext.versioned_notifications',
|
'ext.versioned_notifications',
|
||||||
'oslo_config.sphinxconfiggen',
|
'oslo_config.sphinxconfiggen',
|
||||||
'openstackdocstheme',
|
'openstackdocstheme',
|
||||||
|
'sphinx.ext.napoleon',
|
||||||
]
|
]
|
||||||
|
|
||||||
wsme_protocols = ['restjson']
|
wsme_protocols = ['restjson']
|
||||||
|
|||||||
@@ -129,10 +129,14 @@ Configure the Identity service for the Watcher service
|
|||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
$ openstack endpoint create --region YOUR_REGION watcher \
|
$ openstack endpoint create --region YOUR_REGION
|
||||||
--publicurl http://WATCHER_API_PUBLIC_IP:9322 \
|
watcher public http://WATCHER_API_PUBLIC_IP:9322
|
||||||
--internalurl http://WATCHER_API_INTERNAL_IP:9322 \
|
|
||||||
--adminurl http://WATCHER_API_ADMIN_IP:9322
|
$ openstack endpoint create --region YOUR_REGION
|
||||||
|
watcher internal http://WATCHER_API_INTERNAL_IP:9322
|
||||||
|
|
||||||
|
$ openstack endpoint create --region YOUR_REGION
|
||||||
|
watcher admin http://WATCHER_API_ADMIN_IP:9322
|
||||||
|
|
||||||
.. _watcher-db_configuration:
|
.. _watcher-db_configuration:
|
||||||
|
|
||||||
@@ -200,8 +204,8 @@ configuration file, in order:
|
|||||||
|
|
||||||
|
|
||||||
Although some configuration options are mentioned here, it is recommended that
|
Although some configuration options are mentioned here, it is recommended that
|
||||||
you review all the `available options
|
you review all the :ref:`available options
|
||||||
<https://git.openstack.org/cgit/openstack/watcher/tree/etc/watcher/watcher.conf.sample>`_
|
<watcher_sample_configuration_files>`
|
||||||
so that the watcher service is configured for your needs.
|
so that the watcher service is configured for your needs.
|
||||||
|
|
||||||
#. The Watcher Service stores information in a database. This guide uses the
|
#. The Watcher Service stores information in a database. This guide uses the
|
||||||
@@ -217,7 +221,7 @@ so that the watcher service is configured for your needs.
|
|||||||
# The SQLAlchemy connection string used to connect to the
|
# The SQLAlchemy connection string used to connect to the
|
||||||
# database (string value)
|
# database (string value)
|
||||||
#connection=<None>
|
#connection=<None>
|
||||||
connection = mysql://watcher:WATCHER_DBPASSWORD@DB_IP/watcher?charset=utf8
|
connection = mysql+pymysql://watcher:WATCHER_DBPASSWORD@DB_IP/watcher?charset=utf8
|
||||||
|
|
||||||
#. Configure the Watcher Service to use the RabbitMQ message broker by
|
#. Configure the Watcher Service to use the RabbitMQ message broker by
|
||||||
setting one or more of these options. Replace RABBIT_HOST with the
|
setting one or more of these options. Replace RABBIT_HOST with the
|
||||||
@@ -235,21 +239,8 @@ so that the watcher service is configured for your needs.
|
|||||||
# option. (string value)
|
# option. (string value)
|
||||||
control_exchange = watcher
|
control_exchange = watcher
|
||||||
|
|
||||||
...
|
# ...
|
||||||
|
transport_url = rabbit://RABBITMQ_USER:RABBITMQ_PASSWORD@RABBIT_HOST
|
||||||
[oslo_messaging_rabbit]
|
|
||||||
|
|
||||||
# The username used by the message broker (string value)
|
|
||||||
rabbit_userid = RABBITMQ_USER
|
|
||||||
|
|
||||||
# The password of user used by the message broker (string value)
|
|
||||||
rabbit_password = RABBITMQ_PASSWORD
|
|
||||||
|
|
||||||
# The host where the message brokeris installed (string value)
|
|
||||||
rabbit_host = RABBIT_HOST
|
|
||||||
|
|
||||||
# The port used bythe message broker (string value)
|
|
||||||
#rabbit_port = 5672
|
|
||||||
|
|
||||||
|
|
||||||
#. Watcher API shall validate the token provided by every incoming request,
|
#. Watcher API shall validate the token provided by every incoming request,
|
||||||
@@ -273,7 +264,7 @@ so that the watcher service is configured for your needs.
|
|||||||
|
|
||||||
# Authentication URL (unknown value)
|
# Authentication URL (unknown value)
|
||||||
#auth_url = <None>
|
#auth_url = <None>
|
||||||
auth_url = http://IDENTITY_IP:35357
|
auth_url = http://IDENTITY_IP:5000
|
||||||
|
|
||||||
# Username (unknown value)
|
# Username (unknown value)
|
||||||
# Deprecated group/name - [DEFAULT]/username
|
# Deprecated group/name - [DEFAULT]/username
|
||||||
@@ -319,7 +310,7 @@ so that the watcher service is configured for your needs.
|
|||||||
|
|
||||||
# Authentication URL (unknown value)
|
# Authentication URL (unknown value)
|
||||||
#auth_url = <None>
|
#auth_url = <None>
|
||||||
auth_url = http://IDENTITY_IP:35357
|
auth_url = http://IDENTITY_IP:5000
|
||||||
|
|
||||||
# Username (unknown value)
|
# Username (unknown value)
|
||||||
# Deprecated group/name - [DEFAULT]/username
|
# Deprecated group/name - [DEFAULT]/username
|
||||||
@@ -349,7 +340,7 @@ so that the watcher service is configured for your needs.
|
|||||||
[nova_client]
|
[nova_client]
|
||||||
|
|
||||||
# Version of Nova API to use in novaclient. (string value)
|
# Version of Nova API to use in novaclient. (string value)
|
||||||
#api_version = 2.53
|
#api_version = 2.56
|
||||||
api_version = 2.1
|
api_version = 2.1
|
||||||
|
|
||||||
#. Create the Watcher Service database tables::
|
#. Create the Watcher Service database tables::
|
||||||
@@ -391,7 +382,7 @@ Ceilometer is designed to collect measurements from OpenStack services and from
|
|||||||
other external components. If you would like to add new meters to the currently
|
other external components. If you would like to add new meters to the currently
|
||||||
existing ones, you need to follow the documentation below:
|
existing ones, you need to follow the documentation below:
|
||||||
|
|
||||||
#. https://docs.openstack.org/ceilometer/latest/contributor/new_meters.html#meters
|
#. https://docs.openstack.org/ceilometer/latest/contributor/measurements.html#new-measurements
|
||||||
|
|
||||||
The Ceilometer collector uses a pluggable storage system, meaning that you can
|
The Ceilometer collector uses a pluggable storage system, meaning that you can
|
||||||
pick any database system you prefer.
|
pick any database system you prefer.
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
|
===================
|
||||||
|
Configuration Guide
|
||||||
|
===================
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 2
|
||||||
|
|
||||||
configuring
|
configuring
|
||||||
watcher
|
watcher
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ signed OpenStack's contributor's agreement.
|
|||||||
|
|
||||||
.. seealso::
|
.. seealso::
|
||||||
|
|
||||||
* http://docs.openstack.org/infra/manual/developers.html
|
* https://docs.openstack.org/infra/manual/developers.html
|
||||||
* http://wiki.openstack.org/CLA
|
* https://wiki.openstack.org/CLA
|
||||||
|
|
||||||
LaunchPad Project
|
LaunchPad Project
|
||||||
-----------------
|
-----------------
|
||||||
@@ -37,22 +37,22 @@ notifications of important events.
|
|||||||
|
|
||||||
.. seealso::
|
.. seealso::
|
||||||
|
|
||||||
* http://launchpad.net
|
* https://launchpad.net
|
||||||
* http://launchpad.net/watcher
|
* https://launchpad.net/watcher
|
||||||
* http://launchpad.net/~openstack
|
* https://launchpad.net/openstack
|
||||||
|
|
||||||
|
|
||||||
Project Hosting Details
|
Project Hosting Details
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Bug tracker
|
Bug tracker
|
||||||
http://launchpad.net/watcher
|
https://launchpad.net/watcher
|
||||||
|
|
||||||
Mailing list (prefix subjects with ``[watcher]`` for faster responses)
|
Mailing list (prefix subjects with ``[watcher]`` for faster responses)
|
||||||
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
|
http://lists.openstack.org/pipermail/openstack-dev/
|
||||||
|
|
||||||
Wiki
|
Wiki
|
||||||
http://wiki.openstack.org/Watcher
|
https://wiki.openstack.org/Watcher
|
||||||
|
|
||||||
Code Hosting
|
Code Hosting
|
||||||
https://git.openstack.org/cgit/openstack/watcher
|
https://git.openstack.org/cgit/openstack/watcher
|
||||||
@@ -65,7 +65,7 @@ IRC Channel
|
|||||||
|
|
||||||
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 in the ``#openstack-meeting-4``
|
||||||
IRC channel, 13:00 UTC on odd weeks in the ``#openstack-meeting-alt``
|
IRC channel, 08:00 UTC on odd weeks in the ``#openstack-meeting-alt``
|
||||||
IRC channel (`meetings logs`_)
|
IRC channel (`meetings logs`_)
|
||||||
|
|
||||||
.. _changelog: http://eavesdrop.openstack.org/irclogs/%23openstack-watcher/
|
.. _changelog: http://eavesdrop.openstack.org/irclogs/%23openstack-watcher/
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ Detailed DevStack Instructions
|
|||||||
needed (i.e., no computes are needed if you want to just experiment with
|
needed (i.e., no computes are needed if you want to just experiment with
|
||||||
the Watcher services). These servers can be VMs running on your local
|
the Watcher services). These servers can be VMs running on your local
|
||||||
machine via VirtualBox if you prefer. DevStack currently recommends that
|
machine via VirtualBox if you prefer. DevStack currently recommends that
|
||||||
you use Ubuntu 14.04 LTS. The servers should also have connections to the
|
you use Ubuntu 16.04 LTS. The servers should also have connections to the
|
||||||
same network such that they are all able to communicate with one another.
|
same network such that they are all able to communicate with one another.
|
||||||
|
|
||||||
#. For each server, clone the DevStack repository and create the stack user::
|
#. For each server, clone the DevStack repository and create the stack user::
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ different version of the above, please document your configuration here!
|
|||||||
|
|
||||||
.. _Python: https://www.python.org/
|
.. _Python: https://www.python.org/
|
||||||
.. _git: https://git-scm.com/
|
.. _git: https://git-scm.com/
|
||||||
.. _setuptools: https://pypi.python.org/pypi/setuptools
|
.. _setuptools: https://pypi.org/project/setuptools
|
||||||
.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/install.html
|
.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/install.html
|
||||||
|
|
||||||
Getting the latest code
|
Getting the latest code
|
||||||
@@ -69,8 +69,8 @@ itself.
|
|||||||
|
|
||||||
These dependencies can be installed from PyPi_ using the Python tool pip_.
|
These dependencies can be installed from PyPi_ using the Python tool pip_.
|
||||||
|
|
||||||
.. _PyPi: http://pypi.python.org/
|
.. _PyPi: https://pypi.org/
|
||||||
.. _pip: http://pypi.python.org/pypi/pip
|
.. _pip: https://pypi.org/project/pip
|
||||||
|
|
||||||
However, your system *may* need additional dependencies that `pip` (and by
|
However, your system *may* need additional dependencies that `pip` (and by
|
||||||
extension, PyPi) cannot satisfy. These dependencies should be installed
|
extension, PyPi) cannot satisfy. These dependencies should be installed
|
||||||
@@ -123,9 +123,10 @@ You can re-activate this virtualenv for your current shell using:
|
|||||||
|
|
||||||
$ workon watcher
|
$ workon watcher
|
||||||
|
|
||||||
For more information on virtual environments, see virtualenv_.
|
For more information on virtual environments, see virtualenv_ and
|
||||||
|
virtualenvwrapper_.
|
||||||
|
|
||||||
.. _virtualenv: http://www.virtualenv.org/
|
.. _virtualenv: https://pypi.org/project/virtualenv/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ requirements.txt file::
|
|||||||
|
|
||||||
.. _cookiecutter: https://github.com/audreyr/cookiecutter
|
.. _cookiecutter: https://github.com/audreyr/cookiecutter
|
||||||
.. _OpenStack cookiecutter: https://github.com/openstack-dev/cookiecutter
|
.. _OpenStack cookiecutter: https://github.com/openstack-dev/cookiecutter
|
||||||
.. _python-watcher: https://pypi.python.org/pypi/python-watcher
|
.. _python-watcher: https://pypi.org/project/python-watcher
|
||||||
|
|
||||||
Implementing a plugin for Watcher
|
Implementing a plugin for Watcher
|
||||||
=================================
|
=================================
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ In order to create a new cluster data model collector, you have to:
|
|||||||
- Implement its :py:meth:`~.BaseClusterDataModelCollector.execute` abstract
|
- Implement its :py:meth:`~.BaseClusterDataModelCollector.execute` abstract
|
||||||
method to return your entire cluster data model that this method should
|
method to return your entire cluster data model that this method should
|
||||||
build.
|
build.
|
||||||
|
- Implement its :py:meth:`~.BaseClusterDataModelCollector.audit_scope_handler`
|
||||||
|
abstract property to return your audit scope handler.
|
||||||
- Implement its :py:meth:`~.Goal.notification_endpoints` abstract property to
|
- Implement its :py:meth:`~.Goal.notification_endpoints` abstract property to
|
||||||
return the list of all the :py:class:`~.base.NotificationEndpoint` instances
|
return the list of all the :py:class:`~.base.NotificationEndpoint` instances
|
||||||
that will be responsible for handling incoming notifications in order to
|
that will be responsible for handling incoming notifications in order to
|
||||||
@@ -57,6 +59,10 @@ Here is an example showing how you can write a plugin called
|
|||||||
# Do something here...
|
# Do something here...
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
@property
|
||||||
|
def audit_scope_handler(self):
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def notification_endpoints(self):
|
def notification_endpoints(self):
|
||||||
return []
|
return []
|
||||||
@@ -135,6 +141,10 @@ class method as followed:
|
|||||||
# Do something here...
|
# Do something here...
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
@property
|
||||||
|
def audit_scope_handler(self):
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def notification_endpoints(self):
|
def notification_endpoints(self):
|
||||||
return []
|
return []
|
||||||
@@ -198,7 +208,7 @@ Here below is how to register ``DummyClusterDataModelCollector`` using pbr_:
|
|||||||
watcher_cluster_data_model_collectors =
|
watcher_cluster_data_model_collectors =
|
||||||
dummy = thirdparty.dummy:DummyClusterDataModelCollector
|
dummy = thirdparty.dummy:DummyClusterDataModelCollector
|
||||||
|
|
||||||
.. _pbr: http://docs.openstack.org/pbr/latest
|
.. _pbr: https://docs.openstack.org/pbr/latest/
|
||||||
|
|
||||||
|
|
||||||
Add new notification endpoints
|
Add new notification endpoints
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ requires new metrics not covered by Ceilometer, you can add them through a
|
|||||||
`Ceilometer plugin`_.
|
`Ceilometer plugin`_.
|
||||||
|
|
||||||
|
|
||||||
.. _`Helper`: https://github.com/openstack/watcher/blob/master/watcher/decision_engine/cluster/history/ceilometer.py
|
.. _`Helper`: https://github.com/openstack/watcher/blob/master/watcher/datasource/ceilometer.py
|
||||||
.. _`Ceilometer developer guide`: https://docs.openstack.org/ceilometer/latest/contributor/architecture.html#storing-accessing-the-data
|
.. _`Ceilometer developer guide`: https://docs.openstack.org/ceilometer/latest/contributor/architecture.html#storing-accessing-the-data
|
||||||
.. _`Ceilometer`: https://docs.openstack.org/ceilometer/latest
|
.. _`Ceilometer`: https://docs.openstack.org/ceilometer/latest
|
||||||
.. _`Monasca`: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md
|
.. _`Monasca`: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ the following::
|
|||||||
(watcher) $ tox -e pep8
|
(watcher) $ tox -e pep8
|
||||||
|
|
||||||
.. _tox: https://tox.readthedocs.org/
|
.. _tox: https://tox.readthedocs.org/
|
||||||
.. _Gerrit: http://review.openstack.org/
|
.. _Gerrit: https://review.openstack.org/
|
||||||
|
|
||||||
You may pass options to the test programs using positional arguments. To run a
|
You may pass options to the test programs using positional arguments. To run a
|
||||||
specific unit test, you can pass extra options to `os-testr`_ after putting
|
specific unit test, you can pass extra options to `os-testr`_ after putting
|
||||||
|
|||||||
@@ -267,14 +267,14 @@ the same goal and same workload of the :ref:`Cluster <cluster_definition>`.
|
|||||||
Project
|
Project
|
||||||
=======
|
=======
|
||||||
|
|
||||||
:ref:`Projects <project_definition>` represent the base unit of “ownership”
|
:ref:`Projects <project_definition>` represent the base unit of "ownership"
|
||||||
in OpenStack, in that all :ref:`resources <managed_resource_definition>` in
|
in OpenStack, in that all :ref:`resources <managed_resource_definition>` in
|
||||||
OpenStack should be owned by a specific :ref:`project <project_definition>`.
|
OpenStack should be owned by a specific :ref:`project <project_definition>`.
|
||||||
In OpenStack Identity, a :ref:`project <project_definition>` must be owned by a
|
In OpenStack Identity, a :ref:`project <project_definition>` must be owned by a
|
||||||
specific domain.
|
specific domain.
|
||||||
|
|
||||||
Please, read `the official OpenStack definition of a Project
|
Please, read `the official OpenStack definition of a Project
|
||||||
<http://docs.openstack.org/glossary/content/glossary.html>`_.
|
<https://docs.openstack.org/doc-contrib-guide/common/glossary.html>`_.
|
||||||
|
|
||||||
.. _scoring_engine_definition:
|
.. _scoring_engine_definition:
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ table(action_plans) {
|
|||||||
foreign_key("strategy_id : Integer")
|
foreign_key("strategy_id : Integer")
|
||||||
uuid : String[36]
|
uuid : String[36]
|
||||||
state : String[20], nullable
|
state : String[20], nullable
|
||||||
global_efficacy : JSONEncodedDict, nullable
|
global_efficacy : JSONEncodedList, nullable
|
||||||
|
|
||||||
created_at : DateTime
|
created_at : DateTime
|
||||||
updated_at : DateTime
|
updated_at : DateTime
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ metrics receiver, complex event processor and profiler, optimization processor
|
|||||||
and an action plan applier. This provides a robust framework to realize a wide
|
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
|
range of cloud optimization goals, including the reduction of data center
|
||||||
operating costs, increased system performance via intelligent virtual machine
|
operating costs, increased system performance via intelligent virtual machine
|
||||||
migration, increased energy efficiency—and more!
|
migration, increased energy efficiency and more!
|
||||||
|
|
||||||
Watcher project consists of several source code repositories:
|
Watcher project consists of several source code repositories:
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
|
|
||||||
[keystone_authtoken]
|
[keystone_authtoken]
|
||||||
...
|
...
|
||||||
auth_uri = http://controller:5000
|
www_authenticate_uri = http://controller:5000
|
||||||
auth_url = http://controller:35357
|
auth_url = http://controller:5000
|
||||||
memcached_servers = controller:11211
|
memcached_servers = controller:11211
|
||||||
auth_type = password
|
auth_type = password
|
||||||
project_domain_name = default
|
project_domain_name = default
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
[watcher_clients_auth]
|
[watcher_clients_auth]
|
||||||
...
|
...
|
||||||
auth_type = password
|
auth_type = password
|
||||||
auth_url = http://controller:35357
|
auth_url = http://controller:5000
|
||||||
username = watcher
|
username = watcher
|
||||||
password = WATCHER_PASS
|
password = WATCHER_PASS
|
||||||
project_domain_name = default
|
project_domain_name = default
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ Infrastructure Optimization service
|
|||||||
verify.rst
|
verify.rst
|
||||||
next-steps.rst
|
next-steps.rst
|
||||||
|
|
||||||
The Infrastructure Optimization service (watcher) provides
|
The Infrastructure Optimization service (Watcher) provides
|
||||||
flexible and scalable resource optimization service for
|
flexible and scalable resource optimization service for
|
||||||
multi-tenant OpenStack-based clouds.
|
multi-tenant OpenStack-based clouds.
|
||||||
|
|
||||||
@@ -21,19 +21,19 @@ applier. This provides a robust framework to realize a wide
|
|||||||
range of cloud optimization goals, including the reduction
|
range of cloud optimization goals, including the reduction
|
||||||
of data center operating costs, increased system performance
|
of data center operating costs, increased system performance
|
||||||
via intelligent virtual machine migration, increased energy
|
via intelligent virtual machine migration, increased energy
|
||||||
efficiency—and more!
|
efficiency and more!
|
||||||
|
|
||||||
Watcher also supports a pluggable architecture by which custom
|
Watcher also supports a pluggable architecture by which custom
|
||||||
optimization algorithms, data metrics and data profilers can be
|
optimization algorithms, data metrics and data profilers can be
|
||||||
developed and inserted into the Watcher framework.
|
developed and inserted into the Watcher framework.
|
||||||
|
|
||||||
Check the documentation for watcher optimization strategies at
|
Check the documentation for watcher optimization strategies at
|
||||||
https://docs.openstack.org/watcher/latest/strategies/index.html
|
`Strategies <https://docs.openstack.org/watcher/latest/strategies/index.html>`_.
|
||||||
|
|
||||||
Check watcher glossary at
|
Check watcher glossary at `Glossary
|
||||||
https://docs.openstack.org/watcher/latest/glossary.html
|
<https://docs.openstack.org/watcher/latest/glossary.html>`_.
|
||||||
|
|
||||||
|
|
||||||
This chapter assumes a working setup of OpenStack following the
|
This chapter assumes a working setup of OpenStack following the
|
||||||
`OpenStack Installation Tutorial
|
`OpenStack Installation Tutorial
|
||||||
<https://docs.openstack.org/pike/install/>`_.
|
<https://docs.openstack.org/queens/install/>`_.
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ Next steps
|
|||||||
Your OpenStack environment now includes the watcher service.
|
Your OpenStack environment now includes the watcher service.
|
||||||
|
|
||||||
To add additional services, see
|
To add additional services, see
|
||||||
https://docs.openstack.org/pike/install/.
|
https://docs.openstack.org/queens/install/.
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ Service for the Watcher API
|
|||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
:Author: openstack@lists.launchpad.net
|
:Author: openstack@lists.launchpad.net
|
||||||
:Date:
|
|
||||||
:Copyright: OpenStack Foundation
|
:Copyright: OpenStack Foundation
|
||||||
:Version:
|
|
||||||
:Manual section: 1
|
:Manual section: 1
|
||||||
:Manual group: cloud computing
|
:Manual group: cloud computing
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ Service for the Watcher Applier
|
|||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
:Author: openstack@lists.launchpad.net
|
:Author: openstack@lists.launchpad.net
|
||||||
:Date:
|
|
||||||
:Copyright: OpenStack Foundation
|
:Copyright: OpenStack Foundation
|
||||||
:Version:
|
|
||||||
:Manual section: 1
|
:Manual section: 1
|
||||||
:Manual group: cloud computing
|
:Manual group: cloud computing
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ Service for the Watcher Decision Engine
|
|||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
:Author: openstack@lists.launchpad.net
|
:Author: openstack@lists.launchpad.net
|
||||||
:Date:
|
|
||||||
:Copyright: OpenStack Foundation
|
:Copyright: OpenStack Foundation
|
||||||
:Version:
|
|
||||||
:Manual section: 1
|
:Manual section: 1
|
||||||
:Manual group: cloud computing
|
:Manual group: cloud computing
|
||||||
|
|
||||||
|
|||||||
86
doc/source/strategies/actuation.rst
Normal file
86
doc/source/strategies/actuation.rst
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
=============
|
||||||
|
Actuator
|
||||||
|
=============
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
**display name**: ``Actuator``
|
||||||
|
|
||||||
|
**goal**: ``unclassified``
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.actuation.Actuator
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
Metrics
|
||||||
|
*******
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Cluster data model
|
||||||
|
******************
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Actions
|
||||||
|
*******
|
||||||
|
|
||||||
|
Default Watcher's actions.
|
||||||
|
|
||||||
|
Planner
|
||||||
|
*******
|
||||||
|
|
||||||
|
Default Watcher's planner:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Strategy parameters are:
|
||||||
|
|
||||||
|
==================== ====== ===================== =============================
|
||||||
|
parameter type default Value description
|
||||||
|
==================== ====== ===================== =============================
|
||||||
|
``actions`` array None Actions to be executed.
|
||||||
|
==================== ====== ===================== =============================
|
||||||
|
|
||||||
|
The elements of actions array are:
|
||||||
|
|
||||||
|
==================== ====== ===================== =============================
|
||||||
|
parameter type default Value description
|
||||||
|
==================== ====== ===================== =============================
|
||||||
|
``action_type`` string None Action name defined in
|
||||||
|
setup.cfg(mandatory)
|
||||||
|
``resource_id`` string None Resource_id of the action.
|
||||||
|
``input_parameters`` object None Input_parameters of the
|
||||||
|
action(mandatory).
|
||||||
|
==================== ====== ===================== =============================
|
||||||
|
|
||||||
|
Efficacy Indicator
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Algorithm
|
||||||
|
---------
|
||||||
|
|
||||||
|
This strategy create an action plan with a predefined set of actions.
|
||||||
|
|
||||||
|
How to use it ?
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
$ openstack optimize audittemplate create \
|
||||||
|
at1 unclassified --strategy actuator
|
||||||
|
|
||||||
|
$ openstack optimize audit create -a at1 \
|
||||||
|
-p actions='[{"action_type": "migrate", "resource_id": "56a40802-6fde-4b59-957c-c84baec7eaed", "input_parameters": {"migration_type": "live", "source_node": "s01"}}]'
|
||||||
|
|
||||||
|
External Links
|
||||||
|
--------------
|
||||||
|
|
||||||
|
None
|
||||||
@@ -9,7 +9,7 @@ Synopsis
|
|||||||
|
|
||||||
**goal**: ``server_consolidation``
|
**goal**: ``server_consolidation``
|
||||||
|
|
||||||
.. watcher-term:: watcher.decision_engine.strategy.strategies.basic_consolidation
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.basic_consolidation.BasicConsolidation
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|||||||
92
doc/source/strategies/host_maintenance.rst
Normal file
92
doc/source/strategies/host_maintenance.rst
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
===========================
|
||||||
|
Host Maintenance Strategy
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
**display name**: ``Host Maintenance Strategy``
|
||||||
|
|
||||||
|
**goal**: ``cluster_maintaining``
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.host_maintenance.HostMaintenance
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Metrics
|
||||||
|
*******
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Cluster data model
|
||||||
|
******************
|
||||||
|
|
||||||
|
Default Watcher's Compute cluster data model:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.model.collector.nova.NovaClusterDataModelCollector
|
||||||
|
|
||||||
|
Actions
|
||||||
|
*******
|
||||||
|
|
||||||
|
Default Watcher's actions:
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:widths: 30 30
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - action
|
||||||
|
- description
|
||||||
|
* - ``migration``
|
||||||
|
- .. watcher-term:: watcher.applier.actions.migration.Migrate
|
||||||
|
|
||||||
|
Planner
|
||||||
|
*******
|
||||||
|
|
||||||
|
Default Watcher's planner:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Strategy parameters are:
|
||||||
|
|
||||||
|
==================== ====== ====================================
|
||||||
|
parameter type default Value description
|
||||||
|
==================== ====== ====================================
|
||||||
|
``maintenance_node`` String The name of the compute node which
|
||||||
|
need maintenance. Required.
|
||||||
|
``backup_node`` String The name of the compute node which
|
||||||
|
will backup the maintenance node.
|
||||||
|
Optional.
|
||||||
|
==================== ====== ====================================
|
||||||
|
|
||||||
|
Efficacy Indicator
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Algorithm
|
||||||
|
---------
|
||||||
|
|
||||||
|
For more information on the Host Maintenance Strategy please refer
|
||||||
|
to: https://specs.openstack.org/openstack/watcher-specs/specs/queens/approved/cluster-maintenance-strategy.html
|
||||||
|
|
||||||
|
How to use it ?
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
$ openstack optimize audit create \
|
||||||
|
-g cluster_maintaining -s host_maintenance \
|
||||||
|
-p maintenance_node=compute01 \
|
||||||
|
-p backup_node=compute02 \
|
||||||
|
--auto-trigger
|
||||||
|
|
||||||
|
External Links
|
||||||
|
--------------
|
||||||
|
|
||||||
|
None.
|
||||||
@@ -9,11 +9,7 @@ Synopsis
|
|||||||
|
|
||||||
**goal**: ``thermal_optimization``
|
**goal**: ``thermal_optimization``
|
||||||
|
|
||||||
Outlet (Exhaust Air) temperature is a new thermal telemetry which can be
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.outlet_temp_control
|
||||||
used to measure the host's thermal/workload status. This strategy makes
|
|
||||||
decisions to migrate workloads to the hosts with good thermal condition
|
|
||||||
(lowest outlet temperature) when the outlet temperature of source hosts
|
|
||||||
reach a configurable threshold.
|
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Synopsis
|
|||||||
|
|
||||||
**goal**: ``saving_energy``
|
**goal**: ``saving_energy``
|
||||||
|
|
||||||
.. watcher-term:: watcher.decision_engine.strategy.strategies.saving_energy
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.saving_energy.SavingEnergy
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
@@ -67,13 +67,13 @@ parameter type default description
|
|||||||
Efficacy Indicator
|
Efficacy Indicator
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
Energy saving strategy efficacy indicator is unclassified.
|
None
|
||||||
https://github.com/openstack/watcher/blob/master/watcher/decision_engine/goal/goals.py#L215-L218
|
|
||||||
|
|
||||||
Algorithm
|
Algorithm
|
||||||
---------
|
---------
|
||||||
|
|
||||||
For more information on the Energy Saving Strategy please refer to:http://specs.openstack.org/openstack/watcher-specs/specs/pike/implemented/energy-saving-strategy.html
|
For more information on the Energy Saving Strategy please refer to:
|
||||||
|
http://specs.openstack.org/openstack/watcher-specs/specs/pike/implemented/energy-saving-strategy.html
|
||||||
|
|
||||||
How to use it ?
|
How to use it ?
|
||||||
---------------
|
---------------
|
||||||
@@ -91,10 +91,10 @@ step 2: Create audit to do optimization
|
|||||||
$ openstack optimize audittemplate create \
|
$ openstack optimize audittemplate create \
|
||||||
at1 saving_energy --strategy saving_energy
|
at1 saving_energy --strategy saving_energy
|
||||||
|
|
||||||
$ openstack optimize audit create -a at1
|
$ openstack optimize audit create -a at1 \
|
||||||
|
-p free_used_percent=20.0
|
||||||
|
|
||||||
External Links
|
External Links
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
*Spec URL*
|
None
|
||||||
http://specs.openstack.org/openstack/watcher-specs/specs/pike/implemented/energy-saving-strategy.html
|
|
||||||
|
|||||||
87
doc/source/strategies/storage_capacity_balance.rst
Normal file
87
doc/source/strategies/storage_capacity_balance.rst
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
========================
|
||||||
|
Storage capacity balance
|
||||||
|
========================
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
**display name**: ``Storage Capacity Balance Strategy``
|
||||||
|
|
||||||
|
**goal**: ``workload_balancing``
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.storage_capacity_balance.StorageCapacityBalance
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
Metrics
|
||||||
|
*******
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Cluster data model
|
||||||
|
******************
|
||||||
|
|
||||||
|
Storage cluster data model is required:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.model.collector.cinder.CinderClusterDataModelCollector
|
||||||
|
|
||||||
|
Actions
|
||||||
|
*******
|
||||||
|
|
||||||
|
Default Watcher's actions:
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:widths: 25 35
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - action
|
||||||
|
- description
|
||||||
|
* - ``volume_migrate``
|
||||||
|
- .. watcher-term:: watcher.applier.actions.volume_migration.VolumeMigrate
|
||||||
|
|
||||||
|
Planner
|
||||||
|
*******
|
||||||
|
|
||||||
|
Default Watcher's planner:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Strategy parameter is:
|
||||||
|
|
||||||
|
==================== ====== ============= =====================================
|
||||||
|
parameter type default Value description
|
||||||
|
==================== ====== ============= =====================================
|
||||||
|
``volume_threshold`` Number 80.0 Volume threshold for capacity balance
|
||||||
|
==================== ====== ============= =====================================
|
||||||
|
|
||||||
|
|
||||||
|
Efficacy Indicator
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Algorithm
|
||||||
|
---------
|
||||||
|
|
||||||
|
For more information on the zone migration strategy please refer to:
|
||||||
|
http://specs.openstack.org/openstack/watcher-specs/specs/queens/implemented/storage-capacity-balance.html
|
||||||
|
|
||||||
|
How to use it ?
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
$ openstack optimize audittemplate create \
|
||||||
|
at1 workload_balancing --strategy storage_capacity_balance
|
||||||
|
|
||||||
|
$ openstack optimize audit create -a at1 \
|
||||||
|
-p volume_threshold=85.0
|
||||||
|
|
||||||
|
External Links
|
||||||
|
--------------
|
||||||
|
|
||||||
|
None
|
||||||
@@ -9,7 +9,7 @@ Synopsis
|
|||||||
|
|
||||||
**goal**: ``airflow_optimization``
|
**goal**: ``airflow_optimization``
|
||||||
|
|
||||||
.. watcher-term:: watcher.decision_engine.strategy.strategies.uniform_airflow
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.uniform_airflow.UniformAirflow
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Synopsis
|
|||||||
|
|
||||||
**goal**: ``vm_consolidation``
|
**goal**: ``vm_consolidation``
|
||||||
|
|
||||||
.. watcher-term:: watcher.decision_engine.strategy.strategies.vm_workload_consolidation
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.vm_workload_consolidation.VMWorkloadConsolidation
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Synopsis
|
|||||||
|
|
||||||
**goal**: ``workload_balancing``
|
**goal**: ``workload_balancing``
|
||||||
|
|
||||||
.. watcher-term:: watcher.decision_engine.strategy.strategies.workload_stabilization
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.workload_stabilization.WorkloadStabilization
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Synopsis
|
|||||||
|
|
||||||
**goal**: ``workload_balancing``
|
**goal**: ``workload_balancing``
|
||||||
|
|
||||||
.. watcher-term:: watcher.decision_engine.strategy.strategies.workload_balance
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.workload_balance.WorkloadBalance
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|||||||
154
doc/source/strategies/zone_migration.rst
Normal file
154
doc/source/strategies/zone_migration.rst
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
==============
|
||||||
|
Zone migration
|
||||||
|
==============
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
**display name**: ``Zone migration``
|
||||||
|
|
||||||
|
**goal**: ``hardware_maintenance``
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.strategy.strategies.zone_migration.ZoneMigration
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
Metrics
|
||||||
|
*******
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Cluster data model
|
||||||
|
******************
|
||||||
|
|
||||||
|
Default Watcher's Compute cluster data model:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.model.collector.nova.NovaClusterDataModelCollector
|
||||||
|
|
||||||
|
Storage cluster data model is also required:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.model.collector.cinder.CinderClusterDataModelCollector
|
||||||
|
|
||||||
|
Actions
|
||||||
|
*******
|
||||||
|
|
||||||
|
|
||||||
|
Default Watcher's actions:
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:widths: 30 30
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - action
|
||||||
|
- description
|
||||||
|
* - ``migrate``
|
||||||
|
- .. watcher-term:: watcher.applier.actions.migration.Migrate
|
||||||
|
* - ``volume_migrate``
|
||||||
|
- .. watcher-term:: watcher.applier.actions.volume_migration.VolumeMigrate
|
||||||
|
|
||||||
|
Planner
|
||||||
|
*******
|
||||||
|
|
||||||
|
Default Watcher's planner:
|
||||||
|
|
||||||
|
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Strategy parameters are:
|
||||||
|
|
||||||
|
======================== ======== ============= ==============================
|
||||||
|
parameter type default Value description
|
||||||
|
======================== ======== ============= ==============================
|
||||||
|
``compute_nodes`` array None Compute nodes to migrate.
|
||||||
|
``storage_pools`` array None Storage pools to migrate.
|
||||||
|
``parallel_total`` integer 6 The number of actions to be
|
||||||
|
run in parallel in total.
|
||||||
|
``parallel_per_node`` integer 2 The number of actions to be
|
||||||
|
run in parallel per compute
|
||||||
|
node.
|
||||||
|
``parallel_per_pool`` integer 2 The number of actions to be
|
||||||
|
run in parallel per storage
|
||||||
|
pool.
|
||||||
|
``priority`` object None List prioritizes instances
|
||||||
|
and volumes.
|
||||||
|
``with_attached_volume`` boolean False False: Instances will migrate
|
||||||
|
after all volumes migrate.
|
||||||
|
True: An instance will migrate
|
||||||
|
after the attached volumes
|
||||||
|
migrate.
|
||||||
|
======================== ======== ============= ==============================
|
||||||
|
|
||||||
|
The elements of compute_nodes array are:
|
||||||
|
|
||||||
|
============= ======= =============== =============================
|
||||||
|
parameter type default Value description
|
||||||
|
============= ======= =============== =============================
|
||||||
|
``src_node`` string None Compute node from which
|
||||||
|
instances migrate(mandatory).
|
||||||
|
``dst_node`` string None Compute node to which
|
||||||
|
instances migrate.
|
||||||
|
============= ======= =============== =============================
|
||||||
|
|
||||||
|
The elements of storage_pools array are:
|
||||||
|
|
||||||
|
============= ======= =============== ==============================
|
||||||
|
parameter type default Value description
|
||||||
|
============= ======= =============== ==============================
|
||||||
|
``src_pool`` string None Storage pool from which
|
||||||
|
volumes migrate(mandatory).
|
||||||
|
``dst_pool`` string None Storage pool to which
|
||||||
|
volumes migrate.
|
||||||
|
``src_type`` string None Source volume type(mandatory).
|
||||||
|
``dst_type`` string None Destination volume type
|
||||||
|
(mandatory).
|
||||||
|
============= ======= =============== ==============================
|
||||||
|
|
||||||
|
The elements of priority object are:
|
||||||
|
|
||||||
|
================ ======= =============== ======================
|
||||||
|
parameter type default Value description
|
||||||
|
================ ======= =============== ======================
|
||||||
|
``project`` array None Project names.
|
||||||
|
``compute_node`` array None Compute node names.
|
||||||
|
``storage_pool`` array None Storage pool names.
|
||||||
|
``compute`` enum None Instance attributes.
|
||||||
|
|compute|
|
||||||
|
``storage`` enum None Volume attributes.
|
||||||
|
|storage|
|
||||||
|
================ ======= =============== ======================
|
||||||
|
|
||||||
|
.. |compute| replace:: ["vcpu_num", "mem_size", "disk_size", "created_at"]
|
||||||
|
.. |storage| replace:: ["size", "created_at"]
|
||||||
|
|
||||||
|
Efficacy Indicator
|
||||||
|
------------------
|
||||||
|
|
||||||
|
.. watcher-func::
|
||||||
|
:format: literal_block
|
||||||
|
|
||||||
|
watcher.decision_engine.goal.efficacy.specs.HardwareMaintenance.get_global_efficacy_indicator
|
||||||
|
|
||||||
|
Algorithm
|
||||||
|
---------
|
||||||
|
|
||||||
|
For more information on the zone migration strategy please refer
|
||||||
|
to: http://specs.openstack.org/openstack/watcher-specs/specs/queens/implemented/zone-migration-strategy.html
|
||||||
|
|
||||||
|
How to use it ?
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. code-block:: shell
|
||||||
|
|
||||||
|
$ openstack optimize audittemplate create \
|
||||||
|
at1 hardware_maintenance --strategy zone_migration
|
||||||
|
|
||||||
|
$ openstack optimize audit create -a at1 \
|
||||||
|
-p compute_nodes='[{"src_node": "s01", "dst_node": "d01"}]'
|
||||||
|
|
||||||
|
External Links
|
||||||
|
--------------
|
||||||
|
|
||||||
|
None
|
||||||
@@ -39,6 +39,22 @@ named ``watcher``, or by using the `OpenStack CLI`_ ``openstack``.
|
|||||||
If you want to deploy Watcher in Horizon, please refer to the `Watcher Horizon
|
If you want to deploy Watcher in Horizon, please refer to the `Watcher Horizon
|
||||||
plugin installation guide`_.
|
plugin installation guide`_.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Notice, that in this guide we'll use `OpenStack CLI`_ as major interface.
|
||||||
|
Nevertheless, you can use `Watcher CLI`_ in the same way. It can be
|
||||||
|
achieved by replacing
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ openstack optimize ...
|
||||||
|
|
||||||
|
with
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ watcher ...
|
||||||
|
|
||||||
.. _`installation guide`: https://docs.openstack.org/python-watcherclient/latest
|
.. _`installation guide`: https://docs.openstack.org/python-watcherclient/latest
|
||||||
.. _`Watcher Horizon plugin installation guide`: https://docs.openstack.org/watcher-dashboard/latest/install/installation.html
|
.. _`Watcher Horizon plugin installation guide`: https://docs.openstack.org/watcher-dashboard/latest/install/installation.html
|
||||||
.. _`OpenStack CLI`: https://docs.openstack.org/python-openstackclient/latest/cli/man/openstack.html
|
.. _`OpenStack CLI`: https://docs.openstack.org/python-openstackclient/latest/cli/man/openstack.html
|
||||||
@@ -51,10 +67,6 @@ watcher binary without options.
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher help
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack help optimize
|
$ openstack help optimize
|
||||||
|
|
||||||
How do I run an audit of my cluster ?
|
How do I run an audit of my cluster ?
|
||||||
@@ -64,10 +76,6 @@ First, you need to find the :ref:`goal <goal_definition>` you want to achieve:
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher goal list
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize goal list
|
$ openstack optimize goal list
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
@@ -81,10 +89,6 @@ An :ref:`audit template <audit_template_definition>` defines an optimization
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher audittemplate create my_first_audit_template <your_goal>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize audittemplate create my_first_audit_template <your_goal>
|
$ openstack optimize audittemplate create my_first_audit_template <your_goal>
|
||||||
|
|
||||||
Although optional, you may want to actually set a specific strategy for your
|
Although optional, you may want to actually set a specific strategy for your
|
||||||
@@ -93,10 +97,6 @@ following command:
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher strategy list --goal <your_goal_uuid_or_name>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize strategy list --goal <your_goal_uuid_or_name>
|
$ openstack optimize strategy list --goal <your_goal_uuid_or_name>
|
||||||
|
|
||||||
You can use the following command to check strategy details including which
|
You can use the following command to check strategy details including which
|
||||||
@@ -104,21 +104,12 @@ parameters of which format it supports:
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher strategy show <your_strategy>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize strategy show <your_strategy>
|
$ openstack optimize strategy show <your_strategy>
|
||||||
|
|
||||||
The command to create your audit template would then be:
|
The command to create your audit template would then be:
|
||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher audittemplate create my_first_audit_template <your_goal> \
|
|
||||||
--strategy <your_strategy>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize audittemplate create my_first_audit_template <your_goal> \
|
$ openstack optimize audittemplate create my_first_audit_template <your_goal> \
|
||||||
--strategy <your_strategy>
|
--strategy <your_strategy>
|
||||||
|
|
||||||
@@ -133,10 +124,6 @@ audit) that you want to use.
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher audittemplate list
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize audittemplate list
|
$ openstack optimize audittemplate list
|
||||||
|
|
||||||
- Start an audit based on this :ref:`audit template
|
- Start an audit based on this :ref:`audit template
|
||||||
@@ -144,10 +131,6 @@ or::
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher audit create -a <your_audit_template>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize audit create -a <your_audit_template>
|
$ openstack optimize audit create -a <your_audit_template>
|
||||||
|
|
||||||
If your_audit_template was created by --strategy <your_strategy>, and it
|
If your_audit_template was created by --strategy <your_strategy>, and it
|
||||||
@@ -156,11 +139,6 @@ format), your can append `-p` to input required parameters:
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher audit create -a <your_audit_template> \
|
|
||||||
-p <your_strategy_para1>=5.5 -p <your_strategy_para2>=hi
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize audit create -a <your_audit_template> \
|
$ openstack optimize audit create -a <your_audit_template> \
|
||||||
-p <your_strategy_para1>=5.5 -p <your_strategy_para2>=hi
|
-p <your_strategy_para1>=5.5 -p <your_strategy_para2>=hi
|
||||||
|
|
||||||
@@ -173,19 +151,13 @@ Input parameter could cause audit creation failure, when:
|
|||||||
Watcher service will compute an :ref:`Action Plan <action_plan_definition>`
|
Watcher service will compute an :ref:`Action Plan <action_plan_definition>`
|
||||||
composed of a list of potential optimization :ref:`actions <action_definition>`
|
composed of a list of potential optimization :ref:`actions <action_definition>`
|
||||||
(instance migration, disabling of a compute node, ...) according to the
|
(instance migration, disabling of a compute node, ...) according to the
|
||||||
:ref:`goal <goal_definition>` to achieve. You can see all of the goals
|
:ref:`goal <goal_definition>` to achieve.
|
||||||
available in section ``[watcher_strategies]`` of the Watcher service
|
|
||||||
configuration file.
|
|
||||||
|
|
||||||
- Wait until the Watcher audit has produced a new :ref:`action plan
|
- Wait until the Watcher audit has produced a new :ref:`action plan
|
||||||
<action_plan_definition>`, and get it:
|
<action_plan_definition>`, and get it:
|
||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher actionplan list --audit <the_audit_uuid>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize actionplan list --audit <the_audit_uuid>
|
$ openstack optimize actionplan list --audit <the_audit_uuid>
|
||||||
|
|
||||||
- Have a look on the list of optimization :ref:`actions <action_definition>`
|
- Have a look on the list of optimization :ref:`actions <action_definition>`
|
||||||
@@ -193,10 +165,6 @@ or::
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher action list --action-plan <the_action_plan_uuid>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize action list --action-plan <the_action_plan_uuid>
|
$ openstack optimize action list --action-plan <the_action_plan_uuid>
|
||||||
|
|
||||||
Once you have learned how to create an :ref:`Action Plan
|
Once you have learned how to create an :ref:`Action Plan
|
||||||
@@ -207,10 +175,6 @@ cluster:
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher actionplan start <the_action_plan_uuid>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize actionplan start <the_action_plan_uuid>
|
$ openstack optimize actionplan start <the_action_plan_uuid>
|
||||||
|
|
||||||
You can follow the states of the :ref:`actions <action_definition>` by
|
You can follow the states of the :ref:`actions <action_definition>` by
|
||||||
@@ -218,19 +182,11 @@ periodically calling:
|
|||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher action list
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize action list
|
$ openstack optimize action list
|
||||||
|
|
||||||
You can also obtain more detailed information about a specific action:
|
You can also obtain more detailed information about a specific action:
|
||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
$ watcher action show <the_action_uuid>
|
|
||||||
|
|
||||||
or::
|
|
||||||
|
|
||||||
$ openstack optimize action show <the_action_uuid>
|
$ openstack optimize action show <the_action_uuid>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[DEFAULT]
|
||||||
|
output_file = /etc/watcher/policy.yaml.sample
|
||||||
|
namespace = watcher
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
"admin_api": "role:admin or role:administrator",
|
|
||||||
"show_password": "!",
|
|
||||||
"default": "rule:admin_api",
|
|
||||||
|
|
||||||
"action:detail": "rule:default",
|
|
||||||
"action:get": "rule:default",
|
|
||||||
"action:get_all": "rule:default",
|
|
||||||
|
|
||||||
"action_plan:delete": "rule:default",
|
|
||||||
"action_plan:detail": "rule:default",
|
|
||||||
"action_plan:get": "rule:default",
|
|
||||||
"action_plan:get_all": "rule:default",
|
|
||||||
"action_plan:update": "rule:default",
|
|
||||||
|
|
||||||
"audit:create": "rule:default",
|
|
||||||
"audit:delete": "rule:default",
|
|
||||||
"audit:detail": "rule:default",
|
|
||||||
"audit:get": "rule:default",
|
|
||||||
"audit:get_all": "rule:default",
|
|
||||||
"audit:update": "rule:default",
|
|
||||||
|
|
||||||
"audit_template:create": "rule:default",
|
|
||||||
"audit_template:delete": "rule:default",
|
|
||||||
"audit_template:detail": "rule:default",
|
|
||||||
"audit_template:get": "rule:default",
|
|
||||||
"audit_template:get_all": "rule:default",
|
|
||||||
"audit_template:update": "rule:default",
|
|
||||||
|
|
||||||
"goal:detail": "rule:default",
|
|
||||||
"goal:get": "rule:default",
|
|
||||||
"goal:get_all": "rule:default",
|
|
||||||
|
|
||||||
"scoring_engine:detail": "rule:default",
|
|
||||||
"scoring_engine:get": "rule:default",
|
|
||||||
"scoring_engine:get_all": "rule:default",
|
|
||||||
|
|
||||||
"strategy:detail": "rule:default",
|
|
||||||
"strategy:get": "rule:default",
|
|
||||||
"strategy:get_all": "rule:default",
|
|
||||||
|
|
||||||
"service:detail": "rule:default",
|
|
||||||
"service:get": "rule:default",
|
|
||||||
"service:get_all": "rule:default"
|
|
||||||
}
|
|
||||||
165
lower-constraints.txt
Normal file
165
lower-constraints.txt
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
alabaster==0.7.10
|
||||||
|
alembic==0.9.8
|
||||||
|
amqp==2.2.2
|
||||||
|
appdirs==1.4.3
|
||||||
|
APScheduler==3.5.1
|
||||||
|
asn1crypto==0.24.0
|
||||||
|
automaton==1.14.0
|
||||||
|
Babel==2.5.3
|
||||||
|
bandit==1.4.0
|
||||||
|
beautifulsoup4==4.6.0
|
||||||
|
cachetools==2.0.1
|
||||||
|
certifi==2018.1.18
|
||||||
|
cffi==1.11.5
|
||||||
|
chardet==3.0.4
|
||||||
|
cliff==2.11.0
|
||||||
|
cmd2==0.8.1
|
||||||
|
contextlib2==0.5.5
|
||||||
|
coverage==4.5.1
|
||||||
|
croniter==0.3.20
|
||||||
|
cryptography==2.1.4
|
||||||
|
debtcollector==1.19.0
|
||||||
|
decorator==4.2.1
|
||||||
|
deprecation==2.0
|
||||||
|
doc8==0.8.0
|
||||||
|
docutils==0.14
|
||||||
|
dogpile.cache==0.6.5
|
||||||
|
dulwich==0.19.0
|
||||||
|
enum34==1.1.6
|
||||||
|
enum-compat==0.0.2
|
||||||
|
eventlet==0.20.0
|
||||||
|
extras==1.0.0
|
||||||
|
fasteners==0.14.1
|
||||||
|
fixtures==3.0.0
|
||||||
|
flake8==2.5.5
|
||||||
|
freezegun==0.3.10
|
||||||
|
future==0.16.0
|
||||||
|
futurist==1.6.0
|
||||||
|
gitdb2==2.0.3
|
||||||
|
GitPython==2.1.8
|
||||||
|
gnocchiclient==7.0.1
|
||||||
|
greenlet==0.4.13
|
||||||
|
hacking==0.12.0
|
||||||
|
idna==2.6
|
||||||
|
imagesize==1.0.0
|
||||||
|
iso8601==0.1.12
|
||||||
|
Jinja2==2.10
|
||||||
|
jmespath==0.9.3
|
||||||
|
jsonpatch==1.21
|
||||||
|
jsonpointer==2.0
|
||||||
|
jsonschema==2.6.0
|
||||||
|
keystoneauth1==3.4.0
|
||||||
|
keystonemiddleware==4.21.0
|
||||||
|
kombu==4.1.0
|
||||||
|
linecache2==1.0.0
|
||||||
|
logutils==0.3.5
|
||||||
|
lxml==4.1.1
|
||||||
|
Mako==1.0.7
|
||||||
|
MarkupSafe==1.0
|
||||||
|
mccabe==0.2.1
|
||||||
|
mock==2.0.0
|
||||||
|
monotonic==1.4
|
||||||
|
mox3==0.25.0
|
||||||
|
msgpack==0.5.6
|
||||||
|
munch==2.2.0
|
||||||
|
netaddr==0.7.19
|
||||||
|
netifaces==0.10.6
|
||||||
|
networkx==1.11
|
||||||
|
openstackdocstheme==1.20.0
|
||||||
|
openstacksdk==0.12.0
|
||||||
|
os-api-ref===1.4.0
|
||||||
|
os-client-config==1.29.0
|
||||||
|
os-service-types==1.2.0
|
||||||
|
os-testr==1.0.0
|
||||||
|
osc-lib==1.10.0
|
||||||
|
oslo.cache==1.29.0
|
||||||
|
oslo.concurrency==3.26.0
|
||||||
|
oslo.config==5.2.0
|
||||||
|
oslo.context==2.20.0
|
||||||
|
oslo.db==4.35.0
|
||||||
|
oslo.i18n==3.20.0
|
||||||
|
oslo.log==3.37.0
|
||||||
|
oslo.messaging==5.36.0
|
||||||
|
oslo.middleware==3.35.0
|
||||||
|
oslo.policy==1.34.0
|
||||||
|
oslo.reports==1.27.0
|
||||||
|
oslo.serialization==2.25.0
|
||||||
|
oslo.service==1.30.0
|
||||||
|
oslo.utils==3.36.0
|
||||||
|
oslo.versionedobjects==1.32.0
|
||||||
|
oslotest==3.3.0
|
||||||
|
packaging==17.1
|
||||||
|
Paste==2.0.3
|
||||||
|
PasteDeploy==1.5.2
|
||||||
|
pbr==3.1.1
|
||||||
|
pecan==1.2.1
|
||||||
|
pep8==1.5.7
|
||||||
|
pika==0.10.0
|
||||||
|
pika-pool==0.1.3
|
||||||
|
prettytable==0.7.2
|
||||||
|
psutil==5.4.3
|
||||||
|
pycadf==2.7.0
|
||||||
|
pycparser==2.18
|
||||||
|
pyflakes==0.8.1
|
||||||
|
Pygments==2.2.0
|
||||||
|
pyinotify==0.9.6
|
||||||
|
pyOpenSSL==17.5.0
|
||||||
|
pyparsing==2.2.0
|
||||||
|
pyperclip==1.6.0
|
||||||
|
python-ceilometerclient==2.9.0
|
||||||
|
python-cinderclient==3.5.0
|
||||||
|
python-dateutil==2.7.0
|
||||||
|
python-editor==1.0.3
|
||||||
|
python-glanceclient==2.9.1
|
||||||
|
python-ironicclient==2.3.0
|
||||||
|
python-keystoneclient==3.15.0
|
||||||
|
python-mimeparse==1.6.0
|
||||||
|
python-monascaclient==1.10.0
|
||||||
|
python-neutronclient==6.7.0
|
||||||
|
python-novaclient==10.1.0
|
||||||
|
python-openstackclient==3.14.0
|
||||||
|
python-subunit==1.2.0
|
||||||
|
pytz==2018.3
|
||||||
|
PyYAML==3.12
|
||||||
|
reno==2.7.0
|
||||||
|
repoze.lru==0.7
|
||||||
|
requests==2.18.4
|
||||||
|
requestsexceptions==1.4.0
|
||||||
|
restructuredtext-lint==1.1.3
|
||||||
|
rfc3986==1.1.0
|
||||||
|
Routes==2.4.1
|
||||||
|
simplegeneric==0.8.1
|
||||||
|
simplejson==3.13.2
|
||||||
|
six==1.11.0
|
||||||
|
smmap2==2.0.3
|
||||||
|
snowballstemmer==1.2.1
|
||||||
|
Sphinx==1.6.5
|
||||||
|
sphinxcontrib-httpdomain==1.6.1
|
||||||
|
sphinxcontrib-pecanwsme==0.8.0
|
||||||
|
sphinxcontrib-websupport==1.0.1
|
||||||
|
SQLAlchemy==1.2.5
|
||||||
|
sqlalchemy-migrate==0.11.0
|
||||||
|
sqlparse==0.2.4
|
||||||
|
statsd==3.2.2
|
||||||
|
stestr==2.0.0
|
||||||
|
stevedore==1.28.0
|
||||||
|
taskflow==3.1.0
|
||||||
|
Tempita==0.5.2
|
||||||
|
tenacity==4.9.0
|
||||||
|
testrepository==0.0.20
|
||||||
|
testresources==2.0.1
|
||||||
|
testscenarios==0.5.0
|
||||||
|
testtools==2.3.0
|
||||||
|
traceback2==1.4.0
|
||||||
|
tzlocal==1.5.1
|
||||||
|
ujson==1.35
|
||||||
|
unittest2==1.1.0
|
||||||
|
urllib3==1.22
|
||||||
|
vine==1.1.4
|
||||||
|
voluptuous==0.11.1
|
||||||
|
waitress==1.1.0
|
||||||
|
warlock==1.3.0
|
||||||
|
WebOb==1.7.4
|
||||||
|
WebTest==2.0.29
|
||||||
|
wrapt==1.10.11
|
||||||
|
WSME==0.9.2
|
||||||
14
playbooks/orchestrate-tempest.yaml
Normal file
14
playbooks/orchestrate-tempest.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
- hosts: all
|
||||||
|
# This is the default strategy, however since orchestrate-devstack requires
|
||||||
|
# "linear", it is safer to enforce it in case this is running in an
|
||||||
|
# environment configured with a different default strategy.
|
||||||
|
strategy: linear
|
||||||
|
roles:
|
||||||
|
- orchestrate-devstack
|
||||||
|
|
||||||
|
- hosts: tempest
|
||||||
|
roles:
|
||||||
|
- setup-tempest-run-dir
|
||||||
|
- setup-tempest-data-dir
|
||||||
|
- acl-devstack-files
|
||||||
|
- run-tempest
|
||||||
3
playbooks/pre.yaml
Normal file
3
playbooks/pre.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
- hosts: all
|
||||||
|
roles:
|
||||||
|
- add-hostnames-to-hosts
|
||||||
@@ -29,14 +29,14 @@ Useful links
|
|||||||
|
|
||||||
* How to install: https://docs.openstack.org/rally/latest/install_and_upgrade/install.html
|
* How to install: https://docs.openstack.org/rally/latest/install_and_upgrade/install.html
|
||||||
|
|
||||||
* How to set Rally up and launch your first scenario: https://rally.readthedocs.io/en/latest/tutorial/step_1_setting_up_env_and_running_benchmark_from_samples.html
|
* How to set Rally up and launch your first scenario: https://rally.readthedocs.io/en/latest/quick_start/tutorial/step_1_setting_up_env_and_running_benchmark_from_samples.html
|
||||||
|
|
||||||
* More about Rally: https://rally.readthedocs.org/en/latest/
|
* More about Rally: https://docs.openstack.org/rally/latest/
|
||||||
|
|
||||||
* Rally release notes: https://rally.readthedocs.org/en/latest/release_notes.html
|
* Rally project info and release notes: https://docs.openstack.org/rally/latest/project_info/index.html
|
||||||
|
|
||||||
* How to add rally-gates: https://rally.readthedocs.org/en/latest/gates.html
|
* How to add rally-gates: https://docs.openstack.org/rally/latest/quick_start/gates.html#gate-jobs
|
||||||
|
|
||||||
* About plugins: https://rally.readthedocs.org/en/latest/plugins.html
|
* About plugins: https://docs.openstack.org/rally/latest/plugins/index.html
|
||||||
|
|
||||||
* Plugin samples: https://github.com/openstack/rally/tree/master/samples/plugins
|
* Plugin samples: https://github.com/openstack/rally/tree/master/samples/
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Audits have 'name' field now, that is more friendly to end users.
|
||||||
|
Audit's name can't exceed 63 characters.
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Adds audit scoper for storage data model, now watcher users can specify
|
||||||
|
audit scope for storage CDM in the same manner as compute scope.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Feature to exclude instances from audit scope based on project_id is added.
|
||||||
|
Now instances from particular project in OpenStack can be excluded from audit
|
||||||
|
defining scope in audit templates.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Adds baremetal data model in Watcher
|
||||||
6
releasenotes/notes/cdm-scoping-8d9c307bad46bfa1.yaml
Normal file
6
releasenotes/notes/cdm-scoping-8d9c307bad46bfa1.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Each CDM collector can have its own CDM scoper now. This changed Scope
|
||||||
|
JSON schema definition for the audit template POST data. Please see audit
|
||||||
|
template create help message in python-watcherclient.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Added a way to check state of strategy before audit's execution.
|
||||||
|
Administrator can use "watcher strategy state <strategy_name>" command
|
||||||
|
to get information about metrics' availability, datasource's availability
|
||||||
|
and CDM's availability.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Watcher has a whole scope of the cluster, when building
|
||||||
|
compute CDM which includes all instances.
|
||||||
|
It filters excluded instances when migration during the
|
||||||
|
audit.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Added a strategy for one compute node maintenance,
|
||||||
|
without having the user's application been interrupted.
|
||||||
|
If given one backup node, the strategy will firstly
|
||||||
|
migrate all instances from the maintenance node to
|
||||||
|
the backup node. If the backup node is not provided,
|
||||||
|
it will migrate all instances, relying on nova-scheduler.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Watcher got an ability to calculate multiple global efficacy indicators
|
||||||
|
during audit's execution. Now global efficacy can be calculated for many
|
||||||
|
resource types (like volumes, instances, network) if strategy supports
|
||||||
|
efficacy indicators.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
features:
|
features:
|
||||||
- Added strategy to identify and migrate a Noisy Neighbor - a low priority VM
|
- Added strategy to identify and migrate a Noisy Neighbor - a low priority VM
|
||||||
that negatively affects peformance of a high priority VM by over utilizing
|
that negatively affects performance of a high priority VM by over utilizing
|
||||||
Last Level Cache.
|
Last Level Cache.
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Added notifications about cancelling of action plan.
|
||||||
|
Now event based plugins know when action plan cancel
|
||||||
|
started and completed.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Instance cold migration logic is now replaced with using Nova migrate
|
||||||
|
Server(migrate Action) API which has host option since v2.56.
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
Nova API version is now set to 2.56 by default. This needs the migrate
|
||||||
|
action of migration type cold with destination_node parameter to work.
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
The migrate action of migration type cold with destination_node parameter
|
||||||
|
was fixed. Before fixing, it booted an instance in the service project
|
||||||
|
as a migrated instance.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Added storage capacity balance strategy.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Added strategy "Zone migration" and it's goal "Hardware maintenance".
|
||||||
|
The strategy migrates many instances and volumes efficiently with
|
||||||
|
minimum downtime automatically.
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from watcher import version as watcher_version
|
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
@@ -57,14 +56,11 @@ master_doc = 'index'
|
|||||||
project = u'watcher'
|
project = u'watcher'
|
||||||
copyright = u'2016, Watcher developers'
|
copyright = u'2016, Watcher developers'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# Release notes are version independent
|
||||||
# |version| and |release|, also used in various other places throughout the
|
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = watcher_version.version_info.release_string()
|
version = ''
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = watcher_version.version_string
|
release = ''
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ Contents:
|
|||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
unreleased
|
unreleased
|
||||||
|
queens
|
||||||
pike
|
pike
|
||||||
ocata
|
ocata
|
||||||
newton
|
newton
|
||||||
|
|||||||
426
releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
Normal file
426
releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
Normal file
@@ -0,0 +1,426 @@
|
|||||||
|
# Andi Chandler <andi@gowling.com>, 2017. #zanata
|
||||||
|
# Andi Chandler <andi@gowling.com>, 2018. #zanata
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: watcher\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2018-02-28 12:27+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"PO-Revision-Date: 2018-02-16 07:20+0000\n"
|
||||||
|
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
|
||||||
|
"Language-Team: English (United Kingdom)\n"
|
||||||
|
"Language: en_GB\n"
|
||||||
|
"X-Generator: Zanata 4.3.3\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||||
|
|
||||||
|
msgid "0.29.0"
|
||||||
|
msgstr "0.29.0"
|
||||||
|
|
||||||
|
msgid "0.34.0"
|
||||||
|
msgstr "0.34.0"
|
||||||
|
|
||||||
|
msgid "1.0.0"
|
||||||
|
msgstr "1.0.0"
|
||||||
|
|
||||||
|
msgid "1.1.0"
|
||||||
|
msgstr "1.1.0"
|
||||||
|
|
||||||
|
msgid "1.3.0"
|
||||||
|
msgstr "1.3.0"
|
||||||
|
|
||||||
|
msgid "1.4.0"
|
||||||
|
msgstr "1.4.0"
|
||||||
|
|
||||||
|
msgid "1.4.1"
|
||||||
|
msgstr "1.4.1"
|
||||||
|
|
||||||
|
msgid "1.5.0"
|
||||||
|
msgstr "1.5.0"
|
||||||
|
|
||||||
|
msgid "1.6.0"
|
||||||
|
msgstr "1.6.0"
|
||||||
|
|
||||||
|
msgid "1.7.0"
|
||||||
|
msgstr "1.7.0"
|
||||||
|
|
||||||
|
msgid "Add a service supervisor to watch Watcher deamons."
|
||||||
|
msgstr "Add a service supervisor to watch Watcher daemons."
|
||||||
|
|
||||||
|
msgid "Add action for compute node power on/off"
|
||||||
|
msgstr "Add action for compute node power on/off"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Add description property for dynamic action. Admin can see detail "
|
||||||
|
"information of any specify action."
|
||||||
|
msgstr ""
|
||||||
|
"Add description property for dynamic action. Admin can see detail "
|
||||||
|
"information of any specify action."
|
||||||
|
|
||||||
|
msgid "Add notifications related to Action object."
|
||||||
|
msgstr "Add notifications related to Action object."
|
||||||
|
|
||||||
|
msgid "Add notifications related to Action plan object."
|
||||||
|
msgstr "Add notifications related to Action plan object."
|
||||||
|
|
||||||
|
msgid "Add notifications related to Audit object."
|
||||||
|
msgstr "Add notifications related to Audit object."
|
||||||
|
|
||||||
|
msgid "Add notifications related to Service object."
|
||||||
|
msgstr "Add notifications related to Service object."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Add superseded state for an action plan if the cluster data model has "
|
||||||
|
"changed after it has been created."
|
||||||
|
msgstr ""
|
||||||
|
"Add superseded state for an action plan if the cluster data model has "
|
||||||
|
"changed after it has been created."
|
||||||
|
|
||||||
|
msgid "Added SUSPENDED audit state"
|
||||||
|
msgstr "Added SUSPENDED audit state"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a generic scoring engine module, which will standarize interactions "
|
||||||
|
"with scoring engines through the common API. It is possible to use the "
|
||||||
|
"scoring engine by different Strategies, which improve the code and data "
|
||||||
|
"model re-use."
|
||||||
|
msgstr ""
|
||||||
|
"Added a generic scoring engine module, which will standardise interactions "
|
||||||
|
"with scoring engines through the common API. It is possible to use the "
|
||||||
|
"scoring engine by different Strategies, which improve the code and data "
|
||||||
|
"model re-use."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a new strategy based on the airflow of servers. This strategy makes "
|
||||||
|
"decisions to migrate VMs to make the airflow uniform."
|
||||||
|
msgstr ""
|
||||||
|
"Added a new strategy based on the airflow of servers. This strategy makes "
|
||||||
|
"decisions to migrate VMs to make the airflow uniform."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a standard way to both declare and fetch configuration options so that "
|
||||||
|
"whenever the administrator generates the Watcher configuration sample file, "
|
||||||
|
"it contains the configuration options of the plugins that are currently "
|
||||||
|
"available."
|
||||||
|
msgstr ""
|
||||||
|
"Added a standard way to both declare and fetch configuration options so that "
|
||||||
|
"whenever the administrator generates the Watcher configuration sample file, "
|
||||||
|
"it contains the configuration options of the plugins that are currently "
|
||||||
|
"available."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a strategy based on the VM workloads of hypervisors. This strategy "
|
||||||
|
"makes decisions to migrate workloads to make the total VM workloads of each "
|
||||||
|
"hypervisor balanced, when the total VM workloads of hypervisor reaches "
|
||||||
|
"threshold."
|
||||||
|
msgstr ""
|
||||||
|
"Added a strategy based on the VM workloads of hypervisors. This strategy "
|
||||||
|
"makes decisions to migrate workloads to make the total VM workloads of each "
|
||||||
|
"hypervisor balanced, when the total VM workloads of hypervisor reaches "
|
||||||
|
"threshold."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a strategy that monitors if there is a higher load on some hosts "
|
||||||
|
"compared to other hosts in the cluster and re-balances the work across hosts "
|
||||||
|
"to minimize the standard deviation of the loads in the cluster."
|
||||||
|
msgstr ""
|
||||||
|
"Added a strategy that monitors if there is a higher load on some hosts "
|
||||||
|
"compared to other hosts in the cluster and re-balances the work across hosts "
|
||||||
|
"to minimise the standard deviation of the loads in the cluster."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a way to add a new action without having to amend the source code of "
|
||||||
|
"the default planner."
|
||||||
|
msgstr ""
|
||||||
|
"Added a way to add a new action without having to amend the source code of "
|
||||||
|
"the default planner."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a way to check state of strategy before audit's execution. "
|
||||||
|
"Administrator can use \"watcher strategy state <strategy_name>\" command to "
|
||||||
|
"get information about metrics' availability, datasource's availability and "
|
||||||
|
"CDM's availability."
|
||||||
|
msgstr ""
|
||||||
|
"Added a way to check state of strategy before audit's execution. "
|
||||||
|
"Administrator can use \"watcher strategy state <strategy_name>\" command to "
|
||||||
|
"get information about metrics' availability, datasource's availability and "
|
||||||
|
"CDM's availability."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a way to compare the efficacy of different strategies for a give "
|
||||||
|
"optimization goal."
|
||||||
|
msgstr ""
|
||||||
|
"Added a way to compare the efficacy of different strategies for a give "
|
||||||
|
"optimisation goal."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a way to create periodic audit to be able to optimize continuously the "
|
||||||
|
"cloud infrastructure."
|
||||||
|
msgstr ""
|
||||||
|
"Added a way to create periodic audit to be able to continuously optimise the "
|
||||||
|
"cloud infrastructure."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added a way to return the of available goals depending on which strategies "
|
||||||
|
"have been deployed on the node where the decison engine is running."
|
||||||
|
msgstr ""
|
||||||
|
"Added a way to return the of available goals depending on which strategies "
|
||||||
|
"have been deployed on the node where the decision engine is running."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added an in-memory cache of the cluster model built up and kept fresh via "
|
||||||
|
"notifications from services of interest in addition to periodic syncing "
|
||||||
|
"logic."
|
||||||
|
msgstr ""
|
||||||
|
"Added an in-memory cache of the cluster model built up and kept fresh via "
|
||||||
|
"notifications from services of interest in addition to periodic syncing "
|
||||||
|
"logic."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added binding between apscheduler job and Watcher decision engine service. "
|
||||||
|
"It will allow to provide HA support in the future."
|
||||||
|
msgstr ""
|
||||||
|
"Added binding between apscheduler job and Watcher decision engine service. "
|
||||||
|
"It will allow to provide HA support in the future."
|
||||||
|
|
||||||
|
msgid "Added cinder cluster data model"
|
||||||
|
msgstr "Added cinder cluster data model"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added gnocchi support as data source for metrics. Administrator can change "
|
||||||
|
"data source for each strategy using config file."
|
||||||
|
msgstr ""
|
||||||
|
"Added Gnocchi support as data source for metrics. Administrator can change "
|
||||||
|
"data source for each strategy using config file."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added notifications about cancelling of action plan. Now event based plugins "
|
||||||
|
"know when action plan cancel started and completed."
|
||||||
|
msgstr ""
|
||||||
|
"Added notifications about cancelling of action plan. Now event based plugins "
|
||||||
|
"know when action plan cancel started and completed."
|
||||||
|
|
||||||
|
msgid "Added policies to handle user rights to access Watcher API."
|
||||||
|
msgstr "Added policies to handle user rights to access Watcher API."
|
||||||
|
|
||||||
|
msgid "Added storage capacity balance strategy."
|
||||||
|
msgstr "Added storage capacity balance strategy."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added strategy \"Zone migration\" and it's goal \"Hardware maintenance\". "
|
||||||
|
"The strategy migrates many instances and volumes efficiently with minimum "
|
||||||
|
"downtime automatically."
|
||||||
|
msgstr ""
|
||||||
|
"Added strategy \"Zone migration\" and it's goal \"Hardware maintenance\". "
|
||||||
|
"The strategy migrates many instances and volumes efficiently with minimum "
|
||||||
|
"downtime automatically."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added strategy to identify and migrate a Noisy Neighbor - a low priority VM "
|
||||||
|
"that negatively affects peformance of a high priority VM by over utilizing "
|
||||||
|
"Last Level Cache."
|
||||||
|
msgstr ""
|
||||||
|
"Added strategy to identify and migrate a Noisy Neighbour - a low priority VM "
|
||||||
|
"that negatively affects performance of a high priority VM by over utilising "
|
||||||
|
"Last Level Cache."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Added the functionality to filter out instances which have metadata field "
|
||||||
|
"'optimize' set to False. For now, this is only available for the "
|
||||||
|
"basic_consolidation strategy (if \"check_optimize_metadata\" configuration "
|
||||||
|
"option is enabled)."
|
||||||
|
msgstr ""
|
||||||
|
"Added the functionality to filter out instances which have metadata field "
|
||||||
|
"'optimize' set to False. For now, this is only available for the "
|
||||||
|
"basic_consolidation strategy (if \"check_optimize_metadata\" configuration "
|
||||||
|
"option is enabled)."
|
||||||
|
|
||||||
|
msgid "Added using of JSONSchema instead of voluptuous to validate Actions."
|
||||||
|
msgstr "Added using of JSONSchema instead of voluptuous to validate Actions."
|
||||||
|
|
||||||
|
msgid "Added volume migrate action"
|
||||||
|
msgstr "Added volume migrate action"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Adds audit scoper for storage data model, now watcher users can specify "
|
||||||
|
"audit scope for storage CDM in the same manner as compute scope."
|
||||||
|
msgstr ""
|
||||||
|
"Adds audit scoper for storage data model, now watcher users can specify "
|
||||||
|
"audit scope for storage CDM in the same manner as compute scope."
|
||||||
|
|
||||||
|
msgid "Adds baremetal data model in Watcher"
|
||||||
|
msgstr "Adds baremetal data model in Watcher"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Allow decision engine to pass strategy parameters, like optimization "
|
||||||
|
"threshold, to selected strategy, also strategy to provide parameters info to "
|
||||||
|
"end user."
|
||||||
|
msgstr ""
|
||||||
|
"Allow decision engine to pass strategy parameters, like optimisation "
|
||||||
|
"threshold, to selected strategy, also strategy to provide parameters info to "
|
||||||
|
"end user."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Audits have 'name' field now, that is more friendly to end users. Audit's "
|
||||||
|
"name can't exceed 63 characters."
|
||||||
|
msgstr ""
|
||||||
|
"Audits have 'name' field now, that is more friendly to end users. Audit's "
|
||||||
|
"name can't exceed 63 characters."
|
||||||
|
|
||||||
|
msgid "Centralize all configuration options for Watcher."
|
||||||
|
msgstr "Centralise all configuration options for Watcher."
|
||||||
|
|
||||||
|
msgid "Contents:"
|
||||||
|
msgstr "Contents:"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Copy all audit templates parameters into audit instead of having a reference "
|
||||||
|
"to the audit template."
|
||||||
|
msgstr ""
|
||||||
|
"Copy all audit templates parameters into audit instead of having a reference "
|
||||||
|
"to the audit template."
|
||||||
|
|
||||||
|
msgid "Current Series Release Notes"
|
||||||
|
msgstr "Current Series Release Notes"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Each CDM collector can have its own CDM scoper now. This changed Scope JSON "
|
||||||
|
"schema definition for the audit template POST data. Please see audit "
|
||||||
|
"template create help message in python-watcherclient."
|
||||||
|
msgstr ""
|
||||||
|
"Each CDM collector can have its own CDM scoper now. This changed Scope JSON "
|
||||||
|
"schema definition for the audit template POST data. Please see audit "
|
||||||
|
"template create help message in python-watcherclient."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enhancement of vm_workload_consolidation strategy by using 'memory.resident' "
|
||||||
|
"metric in place of 'memory.usage', as memory.usage shows the memory usage "
|
||||||
|
"inside guest-os and memory.resident represents volume of RAM used by "
|
||||||
|
"instance on host machine."
|
||||||
|
msgstr ""
|
||||||
|
"Enhancement of vm_workload_consolidation strategy by using 'memory.resident' "
|
||||||
|
"metric in place of 'memory.usage', as memory.usage shows the memory usage "
|
||||||
|
"inside guest-os and memory.resident represents volume of RAM used by "
|
||||||
|
"instance on host machine."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Existing workload_balance strategy based on the VM workloads of CPU. This "
|
||||||
|
"feature improves the strategy. By the input parameter \"metrics\", it makes "
|
||||||
|
"decision to migrate a VM base on CPU or memory utilization."
|
||||||
|
msgstr ""
|
||||||
|
"Existing workload_balance strategy based on the VM workloads of CPU. This "
|
||||||
|
"feature improves the strategy. By the input parameter \"metrics\", it makes "
|
||||||
|
"decision to migrate a VM base on CPU or memory utilisation."
|
||||||
|
|
||||||
|
msgid "New Features"
|
||||||
|
msgstr "New Features"
|
||||||
|
|
||||||
|
msgid "Newton Series Release Notes"
|
||||||
|
msgstr "Newton Series Release Notes"
|
||||||
|
|
||||||
|
msgid "Ocata Series Release Notes"
|
||||||
|
msgstr "Ocata Series Release Notes"
|
||||||
|
|
||||||
|
msgid "Pike Series Release Notes"
|
||||||
|
msgstr "Pike Series Release Notes"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Provide a notification mechanism into Watcher that supports versioning. "
|
||||||
|
"Whenever a Watcher object is created, updated or deleted, a versioned "
|
||||||
|
"notification will, if it's relevant, be automatically sent to notify in "
|
||||||
|
"order to allow an event-driven style of architecture within Watcher. "
|
||||||
|
"Moreover, it will also give other services and/or 3rd party softwares (e.g. "
|
||||||
|
"monitoring solutions or rules engines) the ability to react to such events."
|
||||||
|
msgstr ""
|
||||||
|
"Provide a notification mechanism into Watcher that supports versioning. "
|
||||||
|
"Whenever a Watcher object is created, updated or deleted, a versioned "
|
||||||
|
"notification will, if it's relevant, be automatically sent to notify in "
|
||||||
|
"order to allow an event-driven style of architecture within Watcher. "
|
||||||
|
"Moreover, it will also give other services and/or 3rd party software (e.g. "
|
||||||
|
"monitoring solutions or rules engines) the ability to react to such events."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Provides a generic way to define the scope of an audit. The set of audited "
|
||||||
|
"resources will be called \"Audit scope\" and will be defined in each audit "
|
||||||
|
"template (which contains the audit settings)."
|
||||||
|
msgstr ""
|
||||||
|
"Provides a generic way to define the scope of an audit. The set of audited "
|
||||||
|
"resources will be called \"Audit scope\" and will be defined in each audit "
|
||||||
|
"template (which contains the audit settings)."
|
||||||
|
|
||||||
|
msgid "Queens Series Release Notes"
|
||||||
|
msgstr "Queens Series Release Notes"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"The graph model describes how VMs are associated to compute hosts. This "
|
||||||
|
"allows for seeing relationships upfront between the entities and hence can "
|
||||||
|
"be used to identify hot/cold spots in the data center and influence a "
|
||||||
|
"strategy decision."
|
||||||
|
msgstr ""
|
||||||
|
"The graph model describes how VMs are associated to compute hosts. This "
|
||||||
|
"allows for seeing relationships upfront between the entities and hence can "
|
||||||
|
"be used to identify hot/cold spots in the data centre and influence a "
|
||||||
|
"strategy decision."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"There is new ability to create Watcher continuous audits with cron interval. "
|
||||||
|
"It means you may use, for example, optional argument '--interval \"\\*/5 \\* "
|
||||||
|
"\\* \\* \\*\"' to launch audit every 5 minutes. These jobs are executed on a "
|
||||||
|
"best effort basis and therefore, we recommend you to use a minimal cron "
|
||||||
|
"interval of at least one minute."
|
||||||
|
msgstr ""
|
||||||
|
"There is new ability to create Watcher continuous audits with cron interval. "
|
||||||
|
"It means you may use, for example, optional argument '--interval \"\\*/5 \\* "
|
||||||
|
"\\* \\* \\*\"' to launch audit every 5 minutes. These jobs are executed on a "
|
||||||
|
"best effort basis and therefore, we recommend you to use a minimal cron "
|
||||||
|
"interval of at least one minute."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Watcher can continuously optimize the OpenStack cloud for a specific "
|
||||||
|
"strategy or goal by triggering an audit periodically which generates an "
|
||||||
|
"action plan and run it automatically."
|
||||||
|
msgstr ""
|
||||||
|
"Watcher can continuously optimise the OpenStack cloud for a specific "
|
||||||
|
"strategy or goal by triggering an audit periodically which generates an "
|
||||||
|
"action plan and run it automatically."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Watcher can now run specific actions in parallel improving the performances "
|
||||||
|
"dramatically when executing an action plan."
|
||||||
|
msgstr ""
|
||||||
|
"Watcher can now run specific actions in parallel improving the performance "
|
||||||
|
"dramatically when executing an action plan."
|
||||||
|
|
||||||
|
msgid "Watcher database can now be upgraded thanks to Alembic."
|
||||||
|
msgstr "Watcher database can now be upgraded thanks to Alembic."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Watcher got an ability to calculate multiple global efficacy indicators "
|
||||||
|
"during audit's execution. Now global efficacy can be calculated for many "
|
||||||
|
"resource types (like volumes, instances, network) if strategy supports "
|
||||||
|
"efficacy indicators."
|
||||||
|
msgstr ""
|
||||||
|
"Watcher got an ability to calculate multiple global efficacy indicators "
|
||||||
|
"during audit's execution. Now global efficacy can be calculated for many "
|
||||||
|
"resource types (like volumes, instances, network) if strategy supports "
|
||||||
|
"efficacy indicators."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Watcher supports multiple metrics backend and relies on Ceilometer and "
|
||||||
|
"Monasca."
|
||||||
|
msgstr ""
|
||||||
|
"Watcher supports multiple metrics backend and relies on Ceilometer and "
|
||||||
|
"Monasca."
|
||||||
|
|
||||||
|
msgid "Welcome to watcher's Release Notes documentation!"
|
||||||
|
msgstr "Welcome to watcher's Release Notes documentation!"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"all Watcher objects have been refactored to support OVO (oslo."
|
||||||
|
"versionedobjects) which was a prerequisite step in order to implement "
|
||||||
|
"versioned notifications."
|
||||||
|
msgstr ""
|
||||||
|
"all Watcher objects have been refactored to support OVO (oslo."
|
||||||
|
"versionedobjects) which was a prerequisite step in order to implement "
|
||||||
|
"versioned notifications."
|
||||||
@@ -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"
|
|
||||||
6
releasenotes/source/queens.rst
Normal file
6
releasenotes/source/queens.rst
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
===================================
|
||||||
|
Queens Series Release Notes
|
||||||
|
===================================
|
||||||
|
|
||||||
|
.. release-notes::
|
||||||
|
:branch: stable/queens
|
||||||
@@ -2,48 +2,48 @@
|
|||||||
# 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.
|
||||||
|
|
||||||
apscheduler>=3.0.5 # MIT License
|
apscheduler>=3.5.1 # MIT License
|
||||||
enum34>=1.0.4;python_version=='2.7' or python_version=='2.6' or python_version=='3.3' # BSD
|
enum34>=1.1.6;python_version=='2.7' or python_version=='2.6' or python_version=='3.3' # BSD
|
||||||
jsonpatch>=1.16 # BSD
|
jsonpatch>=1.21 # BSD
|
||||||
keystoneauth1>=3.2.0 # Apache-2.0
|
keystoneauth1>=3.4.0 # Apache-2.0
|
||||||
jsonschema<3.0.0,>=2.6.0 # MIT
|
jsonschema<3.0.0,>=2.6.0 # MIT
|
||||||
keystonemiddleware>=4.17.0 # Apache-2.0
|
keystonemiddleware>=4.21.0 # Apache-2.0
|
||||||
lxml!=3.7.0,>=3.4.1 # BSD
|
lxml>=4.1.1 # BSD
|
||||||
croniter>=0.3.4 # MIT License
|
croniter>=0.3.20 # MIT License
|
||||||
oslo.concurrency>=3.20.0 # Apache-2.0
|
oslo.concurrency>=3.26.0 # Apache-2.0
|
||||||
oslo.cache>=1.26.0 # Apache-2.0
|
oslo.cache>=1.29.0 # Apache-2.0
|
||||||
oslo.config>=4.6.0 # Apache-2.0
|
oslo.config>=5.2.0 # Apache-2.0
|
||||||
oslo.context!=2.19.1,>=2.14.0 # Apache-2.0
|
oslo.context>=2.20.0 # Apache-2.0
|
||||||
oslo.db>=4.27.0 # Apache-2.0
|
oslo.db>=4.35.0 # Apache-2.0
|
||||||
oslo.i18n>=3.15.3 # Apache-2.0
|
oslo.i18n>=3.20.0 # Apache-2.0
|
||||||
oslo.log>=3.30.0 # Apache-2.0
|
oslo.log>=3.37.0 # Apache-2.0
|
||||||
oslo.messaging>=5.29.0 # Apache-2.0
|
oslo.messaging>=5.36.0 # Apache-2.0
|
||||||
oslo.policy>=1.23.0 # Apache-2.0
|
oslo.policy>=1.34.0 # Apache-2.0
|
||||||
oslo.reports>=1.18.0 # Apache-2.0
|
oslo.reports>=1.27.0 # Apache-2.0
|
||||||
oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
|
oslo.serialization>=2.25.0 # Apache-2.0
|
||||||
oslo.service>=1.24.0 # Apache-2.0
|
oslo.service>=1.30.0 # Apache-2.0
|
||||||
oslo.utils>=3.28.0 # Apache-2.0
|
oslo.utils>=3.36.0 # Apache-2.0
|
||||||
oslo.versionedobjects>=1.28.0 # Apache-2.0
|
oslo.versionedobjects>=1.32.0 # Apache-2.0
|
||||||
PasteDeploy>=1.5.0 # MIT
|
PasteDeploy>=1.5.2 # MIT
|
||||||
pbr!=2.1.0,>=2.0.0 # Apache-2.0
|
pbr>=3.1.1 # Apache-2.0
|
||||||
pecan!=1.0.2,!=1.0.3,!=1.0.4,!=1.2,>=1.0.0 # BSD
|
pecan>=1.2.1 # BSD
|
||||||
PrettyTable<0.8,>=0.7.1 # BSD
|
PrettyTable<0.8,>=0.7.2 # BSD
|
||||||
voluptuous>=0.8.9 # BSD License
|
voluptuous>=0.11.1 # BSD License
|
||||||
gnocchiclient>=3.3.1 # Apache-2.0
|
gnocchiclient>=7.0.1 # Apache-2.0
|
||||||
python-ceilometerclient>=2.5.0 # Apache-2.0
|
python-ceilometerclient>=2.9.0 # Apache-2.0
|
||||||
python-cinderclient>=3.2.0 # Apache-2.0
|
python-cinderclient>=3.5.0 # Apache-2.0
|
||||||
python-glanceclient>=2.8.0 # Apache-2.0
|
python-glanceclient>=2.9.1 # Apache-2.0
|
||||||
python-keystoneclient>=3.8.0 # Apache-2.0
|
python-keystoneclient>=3.15.0 # Apache-2.0
|
||||||
python-monascaclient>=1.7.0 # Apache-2.0
|
python-monascaclient>=1.10.0 # Apache-2.0
|
||||||
python-neutronclient>=6.3.0 # Apache-2.0
|
python-neutronclient>=6.7.0 # Apache-2.0
|
||||||
python-novaclient>=9.1.0 # Apache-2.0
|
python-novaclient>=10.1.0 # Apache-2.0
|
||||||
python-openstackclient>=3.12.0 # Apache-2.0
|
python-openstackclient>=3.14.0 # Apache-2.0
|
||||||
python-ironicclient>=1.14.0 # Apache-2.0
|
python-ironicclient>=2.3.0 # Apache-2.0
|
||||||
six>=1.9.0 # MIT
|
six>=1.11.0 # MIT
|
||||||
SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT
|
SQLAlchemy>=1.2.5 # MIT
|
||||||
stevedore>=1.20.0 # Apache-2.0
|
stevedore>=1.28.0 # Apache-2.0
|
||||||
taskflow>=2.7.0 # Apache-2.0
|
taskflow>=3.1.0 # Apache-2.0
|
||||||
WebOb>=1.7.1 # MIT
|
WebOb>=1.7.4 # MIT
|
||||||
WSME>=0.8.0 # MIT
|
WSME>=0.9.2 # MIT
|
||||||
networkx<2.0,>=1.10 # BSD
|
networkx>=1.11 # BSD
|
||||||
|
|
||||||
|
|||||||
16
roles/add-hostnames-to-hosts/tasks/main.yaml
Normal file
16
roles/add-hostnames-to-hosts/tasks/main.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
- name: Set up the list of hostnames and addresses
|
||||||
|
set_fact:
|
||||||
|
hostname_addresses: >
|
||||||
|
{% set hosts = {} -%}
|
||||||
|
{% for host, vars in hostvars.items() -%}
|
||||||
|
{% set _ = hosts.update({vars['ansible_hostname']: vars['nodepool']['private_ipv4']}) -%}
|
||||||
|
{% endfor -%}
|
||||||
|
{{- hosts -}}
|
||||||
|
- name: Add inventory hostnames to the hosts file
|
||||||
|
become: yes
|
||||||
|
lineinfile:
|
||||||
|
dest: /etc/hosts
|
||||||
|
state: present
|
||||||
|
insertafter: EOF
|
||||||
|
line: "{{ item.value }} {{ item.key }}"
|
||||||
|
with_dict: "{{ hostname_addresses }}"
|
||||||
12
setup.cfg
12
setup.cfg
@@ -32,6 +32,12 @@ setup-hooks =
|
|||||||
oslo.config.opts =
|
oslo.config.opts =
|
||||||
watcher = watcher.conf.opts:list_opts
|
watcher = watcher.conf.opts:list_opts
|
||||||
|
|
||||||
|
oslo.policy.policies =
|
||||||
|
watcher = watcher.common.policies:list_rules
|
||||||
|
|
||||||
|
oslo.policy.enforcer =
|
||||||
|
watcher = watcher.common.policy:get_enforcer
|
||||||
|
|
||||||
console_scripts =
|
console_scripts =
|
||||||
watcher-api = watcher.cmd.api:main
|
watcher-api = watcher.cmd.api:main
|
||||||
watcher-db-manage = watcher.cmd.dbmanage:main
|
watcher-db-manage = watcher.cmd.dbmanage:main
|
||||||
@@ -51,6 +57,8 @@ watcher_goals =
|
|||||||
airflow_optimization = watcher.decision_engine.goal.goals:AirflowOptimization
|
airflow_optimization = watcher.decision_engine.goal.goals:AirflowOptimization
|
||||||
noisy_neighbor = watcher.decision_engine.goal.goals:NoisyNeighborOptimization
|
noisy_neighbor = watcher.decision_engine.goal.goals:NoisyNeighborOptimization
|
||||||
saving_energy = watcher.decision_engine.goal.goals:SavingEnergy
|
saving_energy = watcher.decision_engine.goal.goals:SavingEnergy
|
||||||
|
hardware_maintenance = watcher.decision_engine.goal.goals:HardwareMaintenance
|
||||||
|
cluster_maintaining = watcher.decision_engine.goal.goals:ClusterMaintaining
|
||||||
|
|
||||||
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,6 +79,9 @@ watcher_strategies =
|
|||||||
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
|
noisy_neighbor = watcher.decision_engine.strategy.strategies.noisy_neighbor:NoisyNeighbor
|
||||||
|
storage_capacity_balance = watcher.decision_engine.strategy.strategies.storage_capacity_balance:StorageCapacityBalance
|
||||||
|
zone_migration = watcher.decision_engine.strategy.strategies.zone_migration:ZoneMigration
|
||||||
|
host_maintenance = watcher.decision_engine.strategy.strategies.host_maintenance:HostMaintenance
|
||||||
|
|
||||||
watcher_actions =
|
watcher_actions =
|
||||||
migrate = watcher.applier.actions.migration:Migrate
|
migrate = watcher.applier.actions.migration:Migrate
|
||||||
@@ -91,6 +102,7 @@ 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
|
storage = watcher.decision_engine.model.collector.cinder:CinderClusterDataModelCollector
|
||||||
|
baremetal = watcher.decision_engine.model.collector.ironic:BaremetalClusterDataModelCollector
|
||||||
|
|
||||||
|
|
||||||
[pbr]
|
[pbr]
|
||||||
|
|||||||
@@ -2,25 +2,27 @@
|
|||||||
# 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.4 # Apache-2.0
|
||||||
doc8>=0.6.0 # Apache-2.0
|
doc8 # Apache-2.0
|
||||||
freezegun>=0.3.6 # Apache-2.0
|
freezegun # Apache-2.0
|
||||||
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
|
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
|
||||||
mock>=2.0.0 # BSD
|
mock # BSD
|
||||||
oslotest>=1.10.0 # Apache-2.0
|
oslotest # Apache-2.0
|
||||||
os-testr>=1.0.0 # Apache-2.0
|
os-testr # Apache-2.0
|
||||||
testrepository>=0.0.18 # Apache-2.0/BSD
|
testrepository # Apache-2.0/BSD
|
||||||
testscenarios>=0.4 # Apache-2.0/BSD
|
testscenarios # Apache-2.0/BSD
|
||||||
testtools>=1.4.0 # MIT
|
testtools # MIT
|
||||||
|
|
||||||
# Doc requirements
|
# Doc requirements
|
||||||
openstackdocstheme>=1.17.0 # Apache-2.0
|
openstackdocstheme # Apache-2.0
|
||||||
sphinx>=1.6.2 # BSD
|
sphinx!=1.6.6,!=1.6.7 # BSD
|
||||||
sphinxcontrib-pecanwsme>=0.8.0 # Apache-2.0
|
sphinxcontrib-pecanwsme # Apache-2.0
|
||||||
|
|
||||||
|
# api-ref
|
||||||
|
os-api-ref # Apache-2.0
|
||||||
|
|
||||||
# releasenotes
|
# releasenotes
|
||||||
reno>=2.5.0 # Apache-2.0
|
reno # Apache-2.0
|
||||||
|
|
||||||
# bandit
|
# bandit
|
||||||
bandit>=1.1.0 # Apache-2.0
|
bandit>=1.1.0 # Apache-2.0
|
||||||
|
|||||||
16
tox.ini
16
tox.ini
@@ -14,7 +14,7 @@ deps = -r{toxinidir}/test-requirements.txt
|
|||||||
commands =
|
commands =
|
||||||
rm -f .testrepository/times.dbm
|
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}
|
stestr run {posargs}
|
||||||
passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
|
passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
|
||||||
|
|
||||||
[testenv:pep8]
|
[testenv:pep8]
|
||||||
@@ -46,11 +46,16 @@ sitepackages = False
|
|||||||
commands =
|
commands =
|
||||||
oslo-config-generator --config-file etc/watcher/oslo-config-generator/watcher.conf
|
oslo-config-generator --config-file etc/watcher/oslo-config-generator/watcher.conf
|
||||||
|
|
||||||
|
[testenv:genpolicy]
|
||||||
|
commands =
|
||||||
|
oslopolicy-sample-generator --config-file etc/watcher/oslo-policy-generator/watcher-policy-generator.conf
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
|
filename = *.py,app.wsgi
|
||||||
show-source=True
|
show-source=True
|
||||||
ignore= H105,E123,E226,N320,H202
|
ignore= H105,E123,E226,N320,H202
|
||||||
builtins= _
|
builtins= _
|
||||||
enable-extensions = H106,H203
|
enable-extensions = H106,H203,H904
|
||||||
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]
|
||||||
@@ -71,3 +76,10 @@ commands = sphinx-build -a -W -E -d releasenotes/build/doctrees -b html releasen
|
|||||||
[testenv:bandit]
|
[testenv:bandit]
|
||||||
deps = -r{toxinidir}/test-requirements.txt
|
deps = -r{toxinidir}/test-requirements.txt
|
||||||
commands = bandit -r watcher -x tests -n5 -ll -s B320
|
commands = bandit -r watcher -x tests -n5 -ll -s B320
|
||||||
|
|
||||||
|
[testenv:lower-constraints]
|
||||||
|
basepython = python3
|
||||||
|
deps =
|
||||||
|
-c{toxinidir}/lower-constraints.txt
|
||||||
|
-r{toxinidir}/test-requirements.txt
|
||||||
|
-r{toxinidir}/requirements.txt
|
||||||
|
|||||||
@@ -37,4 +37,3 @@ LOG.debug("Configuration:")
|
|||||||
CONF.log_opt_values(LOG, log.DEBUG)
|
CONF.log_opt_values(LOG, log.DEBUG)
|
||||||
|
|
||||||
application = app.VersionSelectorApplication()
|
application = app.VersionSelectorApplication()
|
||||||
|
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ class ActionCollection(collection.Collection):
|
|||||||
collection = ActionCollection()
|
collection = ActionCollection()
|
||||||
collection.actions = [Action.convert_with_links(p, expand)
|
collection.actions = [Action.convert_with_links(p, expand)
|
||||||
for p in actions]
|
for p in actions]
|
||||||
|
collection.next = collection.get_next(limit, url=url, **kwargs)
|
||||||
return collection
|
return collection
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -232,6 +232,10 @@ class ActionsController(rest.RestController):
|
|||||||
sort_key, sort_dir, expand=False,
|
sort_key, sort_dir, expand=False,
|
||||||
resource_url=None,
|
resource_url=None,
|
||||||
action_plan_uuid=None, audit_uuid=None):
|
action_plan_uuid=None, audit_uuid=None):
|
||||||
|
additional_fields = ['action_plan_uuid']
|
||||||
|
|
||||||
|
api_utils.validate_sort_key(sort_key, list(objects.Action.fields) +
|
||||||
|
additional_fields)
|
||||||
limit = api_utils.validate_limit(limit)
|
limit = api_utils.validate_limit(limit)
|
||||||
api_utils.validate_sort_dir(sort_dir)
|
api_utils.validate_sort_dir(sort_dir)
|
||||||
|
|
||||||
@@ -247,7 +251,10 @@ class ActionsController(rest.RestController):
|
|||||||
if audit_uuid:
|
if audit_uuid:
|
||||||
filters['audit_uuid'] = audit_uuid
|
filters['audit_uuid'] = audit_uuid
|
||||||
|
|
||||||
sort_db_key = sort_key
|
need_api_sort = api_utils.check_need_api_sort(sort_key,
|
||||||
|
additional_fields)
|
||||||
|
sort_db_key = (sort_key if not need_api_sort
|
||||||
|
else None)
|
||||||
|
|
||||||
actions = objects.Action.list(pecan.request.context,
|
actions = objects.Action.list(pecan.request.context,
|
||||||
limit,
|
limit,
|
||||||
@@ -255,11 +262,15 @@ class ActionsController(rest.RestController):
|
|||||||
sort_dir=sort_dir,
|
sort_dir=sort_dir,
|
||||||
filters=filters)
|
filters=filters)
|
||||||
|
|
||||||
return ActionCollection.convert_with_links(actions, limit,
|
actions_collection = ActionCollection.convert_with_links(
|
||||||
url=resource_url,
|
actions, limit, url=resource_url, expand=expand,
|
||||||
expand=expand,
|
sort_key=sort_key, sort_dir=sort_dir)
|
||||||
sort_key=sort_key,
|
|
||||||
sort_dir=sort_dir)
|
if need_api_sort:
|
||||||
|
api_utils.make_api_sort(actions_collection.actions,
|
||||||
|
sort_key, sort_dir)
|
||||||
|
|
||||||
|
return actions_collection
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(ActionCollection, types.uuid, int,
|
@wsme_pecan.wsexpose(ActionCollection, types.uuid, int,
|
||||||
wtypes.text, wtypes.text, types.uuid,
|
wtypes.text, wtypes.text, types.uuid,
|
||||||
@@ -341,7 +352,7 @@ class ActionsController(rest.RestController):
|
|||||||
|
|
||||||
@wsme_pecan.wsexpose(Action, body=Action, status_code=201)
|
@wsme_pecan.wsexpose(Action, body=Action, status_code=201)
|
||||||
def post(self, action):
|
def post(self, action):
|
||||||
"""Create a new action.
|
"""Create a new action(forbidden).
|
||||||
|
|
||||||
:param action: a action within the request body.
|
:param action: a action within the request body.
|
||||||
"""
|
"""
|
||||||
@@ -364,7 +375,7 @@ class ActionsController(rest.RestController):
|
|||||||
@wsme.validate(types.uuid, [ActionPatchType])
|
@wsme.validate(types.uuid, [ActionPatchType])
|
||||||
@wsme_pecan.wsexpose(Action, types.uuid, body=[ActionPatchType])
|
@wsme_pecan.wsexpose(Action, types.uuid, body=[ActionPatchType])
|
||||||
def patch(self, action_uuid, patch):
|
def patch(self, action_uuid, patch):
|
||||||
"""Update an existing action.
|
"""Update an existing action(forbidden).
|
||||||
|
|
||||||
:param action_uuid: UUID of a action.
|
:param action_uuid: UUID of a action.
|
||||||
:param patch: a json PATCH document to apply to this action.
|
:param patch: a json PATCH document to apply to this action.
|
||||||
@@ -401,7 +412,7 @@ class ActionsController(rest.RestController):
|
|||||||
|
|
||||||
@wsme_pecan.wsexpose(None, types.uuid, status_code=204)
|
@wsme_pecan.wsexpose(None, types.uuid, status_code=204)
|
||||||
def delete(self, action_uuid):
|
def delete(self, action_uuid):
|
||||||
"""Delete a action.
|
"""Delete a action(forbidden).
|
||||||
|
|
||||||
:param action_uuid: UUID of a action.
|
:param action_uuid: UUID of a action.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -305,17 +305,6 @@ class ActionPlanCollection(collection.Collection):
|
|||||||
ap_collection = ActionPlanCollection()
|
ap_collection = ActionPlanCollection()
|
||||||
ap_collection.action_plans = [ActionPlan.convert_with_links(
|
ap_collection.action_plans = [ActionPlan.convert_with_links(
|
||||||
p, expand) for p in rpc_action_plans]
|
p, expand) for p in rpc_action_plans]
|
||||||
|
|
||||||
if 'sort_key' in kwargs:
|
|
||||||
reverse = False
|
|
||||||
if kwargs['sort_key'] == 'audit_uuid':
|
|
||||||
if 'sort_dir' in kwargs:
|
|
||||||
reverse = True if kwargs['sort_dir'] == 'desc' else False
|
|
||||||
ap_collection.action_plans = sorted(
|
|
||||||
ap_collection.action_plans,
|
|
||||||
key=lambda action_plan: action_plan.audit_uuid,
|
|
||||||
reverse=reverse)
|
|
||||||
|
|
||||||
ap_collection.next = ap_collection.get_next(limit, url=url, **kwargs)
|
ap_collection.next = ap_collection.get_next(limit, url=url, **kwargs)
|
||||||
return ap_collection
|
return ap_collection
|
||||||
|
|
||||||
@@ -331,20 +320,25 @@ class ActionPlansController(rest.RestController):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ActionPlansController, self).__init__()
|
super(ActionPlansController, self).__init__()
|
||||||
|
self.applier_client = rpcapi.ApplierAPI()
|
||||||
|
|
||||||
from_actionsPlans = False
|
from_actionsPlans = False
|
||||||
"""A flag to indicate if the requests to this controller are coming
|
"""A flag to indicate if the requests to this controller are coming
|
||||||
from the top-level resource ActionPlan."""
|
from the top-level resource ActionPlan."""
|
||||||
|
|
||||||
_custom_actions = {
|
_custom_actions = {
|
||||||
'detail': ['GET'],
|
'start': ['POST'],
|
||||||
|
'detail': ['GET']
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_action_plans_collection(self, marker, limit,
|
def _get_action_plans_collection(self, marker, limit,
|
||||||
sort_key, sort_dir, expand=False,
|
sort_key, sort_dir, expand=False,
|
||||||
resource_url=None, audit_uuid=None,
|
resource_url=None, audit_uuid=None,
|
||||||
strategy=None):
|
strategy=None):
|
||||||
|
additional_fields = ['audit_uuid', 'strategy_uuid', 'strategy_name']
|
||||||
|
|
||||||
|
api_utils.validate_sort_key(
|
||||||
|
sort_key, list(objects.ActionPlan.fields) + additional_fields)
|
||||||
limit = api_utils.validate_limit(limit)
|
limit = api_utils.validate_limit(limit)
|
||||||
api_utils.validate_sort_dir(sort_dir)
|
api_utils.validate_sort_dir(sort_dir)
|
||||||
|
|
||||||
@@ -363,10 +357,10 @@ class ActionPlansController(rest.RestController):
|
|||||||
else:
|
else:
|
||||||
filters['strategy_name'] = strategy
|
filters['strategy_name'] = strategy
|
||||||
|
|
||||||
if sort_key == 'audit_uuid':
|
need_api_sort = api_utils.check_need_api_sort(sort_key,
|
||||||
sort_db_key = None
|
additional_fields)
|
||||||
else:
|
sort_db_key = (sort_key if not need_api_sort
|
||||||
sort_db_key = sort_key
|
else None)
|
||||||
|
|
||||||
action_plans = objects.ActionPlan.list(
|
action_plans = objects.ActionPlan.list(
|
||||||
pecan.request.context,
|
pecan.request.context,
|
||||||
@@ -374,12 +368,15 @@ class ActionPlansController(rest.RestController):
|
|||||||
marker_obj, sort_key=sort_db_key,
|
marker_obj, sort_key=sort_db_key,
|
||||||
sort_dir=sort_dir, filters=filters)
|
sort_dir=sort_dir, filters=filters)
|
||||||
|
|
||||||
return ActionPlanCollection.convert_with_links(
|
action_plans_collection = ActionPlanCollection.convert_with_links(
|
||||||
action_plans, limit,
|
action_plans, limit, url=resource_url, expand=expand,
|
||||||
url=resource_url,
|
sort_key=sort_key, sort_dir=sort_dir)
|
||||||
expand=expand,
|
|
||||||
sort_key=sort_key,
|
if need_api_sort:
|
||||||
sort_dir=sort_dir)
|
api_utils.make_api_sort(action_plans_collection.action_plans,
|
||||||
|
sort_key, sort_dir)
|
||||||
|
|
||||||
|
return action_plans_collection
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(ActionPlanCollection, types.uuid, int, wtypes.text,
|
@wsme_pecan.wsexpose(ActionPlanCollection, types.uuid, int, wtypes.text,
|
||||||
wtypes.text, types.uuid, wtypes.text)
|
wtypes.text, types.uuid, wtypes.text)
|
||||||
@@ -460,6 +457,15 @@ class ActionPlansController(rest.RestController):
|
|||||||
policy.enforce(context, 'action_plan:delete', action_plan,
|
policy.enforce(context, 'action_plan:delete', action_plan,
|
||||||
action='action_plan:delete')
|
action='action_plan:delete')
|
||||||
|
|
||||||
|
allowed_states = (ap_objects.State.SUCCEEDED,
|
||||||
|
ap_objects.State.RECOMMENDED,
|
||||||
|
ap_objects.State.FAILED,
|
||||||
|
ap_objects.State.SUPERSEDED,
|
||||||
|
ap_objects.State.CANCELLED)
|
||||||
|
if action_plan.state not in allowed_states:
|
||||||
|
raise exception.DeleteError(
|
||||||
|
state=action_plan.state)
|
||||||
|
|
||||||
action_plan.soft_delete()
|
action_plan.soft_delete()
|
||||||
|
|
||||||
@wsme.validate(types.uuid, [ActionPlanPatchType])
|
@wsme.validate(types.uuid, [ActionPlanPatchType])
|
||||||
@@ -531,7 +537,7 @@ class ActionPlansController(rest.RestController):
|
|||||||
if action_plan_to_update[field] != patch_val:
|
if action_plan_to_update[field] != patch_val:
|
||||||
action_plan_to_update[field] = patch_val
|
action_plan_to_update[field] = patch_val
|
||||||
|
|
||||||
if (field == 'state'and
|
if (field == 'state' and
|
||||||
patch_val == objects.action_plan.State.PENDING):
|
patch_val == objects.action_plan.State.PENDING):
|
||||||
launch_action_plan = True
|
launch_action_plan = True
|
||||||
|
|
||||||
@@ -548,11 +554,39 @@ class ActionPlansController(rest.RestController):
|
|||||||
a.save()
|
a.save()
|
||||||
|
|
||||||
if launch_action_plan:
|
if launch_action_plan:
|
||||||
applier_client = rpcapi.ApplierAPI()
|
self.applier_client.launch_action_plan(pecan.request.context,
|
||||||
applier_client.launch_action_plan(pecan.request.context,
|
action_plan.uuid)
|
||||||
action_plan.uuid)
|
|
||||||
|
|
||||||
action_plan_to_update = objects.ActionPlan.get_by_uuid(
|
action_plan_to_update = objects.ActionPlan.get_by_uuid(
|
||||||
pecan.request.context,
|
pecan.request.context,
|
||||||
action_plan_uuid)
|
action_plan_uuid)
|
||||||
return ActionPlan.convert_with_links(action_plan_to_update)
|
return ActionPlan.convert_with_links(action_plan_to_update)
|
||||||
|
|
||||||
|
@wsme_pecan.wsexpose(ActionPlan, types.uuid)
|
||||||
|
def start(self, action_plan_uuid, **kwargs):
|
||||||
|
"""Start an action_plan
|
||||||
|
|
||||||
|
:param action_plan_uuid: UUID of an action_plan.
|
||||||
|
"""
|
||||||
|
|
||||||
|
action_plan_to_start = api_utils.get_resource(
|
||||||
|
'ActionPlan', action_plan_uuid, eager=True)
|
||||||
|
context = pecan.request.context
|
||||||
|
|
||||||
|
policy.enforce(context, 'action_plan:start', action_plan_to_start,
|
||||||
|
action='action_plan:start')
|
||||||
|
|
||||||
|
if action_plan_to_start['state'] != \
|
||||||
|
objects.action_plan.State.RECOMMENDED:
|
||||||
|
raise Exception.StartError(
|
||||||
|
state=action_plan_to_start.state)
|
||||||
|
|
||||||
|
action_plan_to_start['state'] = objects.action_plan.State.PENDING
|
||||||
|
action_plan_to_start.save()
|
||||||
|
|
||||||
|
self.applier_client.launch_action_plan(pecan.request.context,
|
||||||
|
action_plan_uuid)
|
||||||
|
action_plan_to_start = objects.ActionPlan.get_by_uuid(
|
||||||
|
pecan.request.context, action_plan_uuid)
|
||||||
|
|
||||||
|
return ActionPlan.convert_with_links(action_plan_to_start)
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ 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 oslo_log import log
|
||||||
|
|
||||||
from watcher._i18n import _
|
from watcher._i18n import _
|
||||||
from watcher.api.controllers import base
|
from watcher.api.controllers import base
|
||||||
from watcher.api.controllers import link
|
from watcher.api.controllers import link
|
||||||
@@ -49,9 +51,13 @@ from watcher.common import utils
|
|||||||
from watcher.decision_engine import rpcapi
|
from watcher.decision_engine import rpcapi
|
||||||
from watcher import objects
|
from watcher import objects
|
||||||
|
|
||||||
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class AuditPostType(wtypes.Base):
|
class AuditPostType(wtypes.Base):
|
||||||
|
|
||||||
|
name = wtypes.wsattr(wtypes.text, mandatory=False)
|
||||||
|
|
||||||
audit_template_uuid = wtypes.wsattr(types.uuid, mandatory=False)
|
audit_template_uuid = wtypes.wsattr(types.uuid, mandatory=False)
|
||||||
|
|
||||||
goal = wtypes.wsattr(wtypes.text, mandatory=False)
|
goal = wtypes.wsattr(wtypes.text, mandatory=False)
|
||||||
@@ -111,7 +117,30 @@ class AuditPostType(wtypes.Base):
|
|||||||
setattr(self, k, at_attr)
|
setattr(self, k, at_attr)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Note: If audit name was not provided, used a default name
|
||||||
|
if not self.name:
|
||||||
|
if self.strategy:
|
||||||
|
strategy = objects.Strategy.get(context, self.strategy)
|
||||||
|
self.name = "%s-%s" % (strategy.name,
|
||||||
|
datetime.datetime.utcnow().isoformat())
|
||||||
|
elif self.audit_template_uuid:
|
||||||
|
audit_template = objects.AuditTemplate.get(
|
||||||
|
context, self.audit_template_uuid)
|
||||||
|
self.name = "%s-%s" % (audit_template.name,
|
||||||
|
datetime.datetime.utcnow().isoformat())
|
||||||
|
else:
|
||||||
|
goal = objects.Goal.get(context, self.goal)
|
||||||
|
self.name = "%s-%s" % (goal.name,
|
||||||
|
datetime.datetime.utcnow().isoformat())
|
||||||
|
# No more than 63 characters
|
||||||
|
if len(self.name) > 63:
|
||||||
|
LOG.warning("Audit: %s length exceeds 63 characters",
|
||||||
|
self.name)
|
||||||
|
self.name = self.name[0:63]
|
||||||
|
|
||||||
return Audit(
|
return Audit(
|
||||||
|
name=self.name,
|
||||||
audit_type=self.audit_type,
|
audit_type=self.audit_type,
|
||||||
parameters=self.parameters,
|
parameters=self.parameters,
|
||||||
goal_id=self.goal,
|
goal_id=self.goal,
|
||||||
@@ -146,10 +175,10 @@ class AuditPatchType(types.JsonPatchType):
|
|||||||
|
|
||||||
|
|
||||||
class Audit(base.APIBase):
|
class Audit(base.APIBase):
|
||||||
"""API representation of a audit.
|
"""API representation of an audit.
|
||||||
|
|
||||||
This class enforces type checking and value constraints, and converts
|
This class enforces type checking and value constraints, and converts
|
||||||
between the internal object model and the API representation of a audit.
|
between the internal object model and the API representation of an audit.
|
||||||
"""
|
"""
|
||||||
_goal_uuid = None
|
_goal_uuid = None
|
||||||
_goal_name = None
|
_goal_name = None
|
||||||
@@ -233,6 +262,9 @@ class Audit(base.APIBase):
|
|||||||
uuid = types.uuid
|
uuid = types.uuid
|
||||||
"""Unique UUID for this audit"""
|
"""Unique UUID for this audit"""
|
||||||
|
|
||||||
|
name = wtypes.text
|
||||||
|
"""Name of this audit"""
|
||||||
|
|
||||||
audit_type = wtypes.text
|
audit_type = wtypes.text
|
||||||
"""Type of this audit"""
|
"""Type of this audit"""
|
||||||
|
|
||||||
@@ -241,19 +273,19 @@ class Audit(base.APIBase):
|
|||||||
|
|
||||||
goal_uuid = wsme.wsproperty(
|
goal_uuid = wsme.wsproperty(
|
||||||
wtypes.text, _get_goal_uuid, _set_goal_uuid, mandatory=True)
|
wtypes.text, _get_goal_uuid, _set_goal_uuid, mandatory=True)
|
||||||
"""Goal UUID the audit template refers to"""
|
"""Goal UUID the audit refers to"""
|
||||||
|
|
||||||
goal_name = wsme.wsproperty(
|
goal_name = wsme.wsproperty(
|
||||||
wtypes.text, _get_goal_name, _set_goal_name, mandatory=False)
|
wtypes.text, _get_goal_name, _set_goal_name, mandatory=False)
|
||||||
"""The name of the goal this audit template refers to"""
|
"""The name of the goal this audit refers to"""
|
||||||
|
|
||||||
strategy_uuid = wsme.wsproperty(
|
strategy_uuid = wsme.wsproperty(
|
||||||
wtypes.text, _get_strategy_uuid, _set_strategy_uuid, mandatory=False)
|
wtypes.text, _get_strategy_uuid, _set_strategy_uuid, mandatory=False)
|
||||||
"""Strategy UUID the audit template refers to"""
|
"""Strategy UUID the audit refers to"""
|
||||||
|
|
||||||
strategy_name = wsme.wsproperty(
|
strategy_name = wsme.wsproperty(
|
||||||
wtypes.text, _get_strategy_name, _set_strategy_name, mandatory=False)
|
wtypes.text, _get_strategy_name, _set_strategy_name, mandatory=False)
|
||||||
"""The name of the strategy this audit template refers to"""
|
"""The name of the strategy this audit refers to"""
|
||||||
|
|
||||||
parameters = {wtypes.text: types.jsontype}
|
parameters = {wtypes.text: types.jsontype}
|
||||||
"""The strategy parameters for this audit"""
|
"""The strategy parameters for this audit"""
|
||||||
@@ -301,7 +333,7 @@ class Audit(base.APIBase):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def _convert_with_links(audit, url, expand=True):
|
def _convert_with_links(audit, url, expand=True):
|
||||||
if not expand:
|
if not expand:
|
||||||
audit.unset_fields_except(['uuid', 'audit_type', 'state',
|
audit.unset_fields_except(['uuid', 'name', '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', 'auto_trigger',
|
||||||
@@ -324,6 +356,7 @@ class Audit(base.APIBase):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def sample(cls, expand=True):
|
def sample(cls, expand=True):
|
||||||
sample = cls(uuid='27e3153e-d5bf-4b7e-b517-fb518e17f34c',
|
sample = cls(uuid='27e3153e-d5bf-4b7e-b517-fb518e17f34c',
|
||||||
|
name='My Audit',
|
||||||
audit_type='ONESHOT',
|
audit_type='ONESHOT',
|
||||||
state='PENDING',
|
state='PENDING',
|
||||||
created_at=datetime.datetime.utcnow(),
|
created_at=datetime.datetime.utcnow(),
|
||||||
@@ -356,17 +389,6 @@ class AuditCollection(collection.Collection):
|
|||||||
collection = AuditCollection()
|
collection = AuditCollection()
|
||||||
collection.audits = [Audit.convert_with_links(p, expand)
|
collection.audits = [Audit.convert_with_links(p, expand)
|
||||||
for p in rpc_audits]
|
for p in rpc_audits]
|
||||||
|
|
||||||
if 'sort_key' in kwargs:
|
|
||||||
reverse = False
|
|
||||||
if kwargs['sort_key'] == 'goal_uuid':
|
|
||||||
if 'sort_dir' in kwargs:
|
|
||||||
reverse = True if kwargs['sort_dir'] == 'desc' else False
|
|
||||||
collection.audits = sorted(
|
|
||||||
collection.audits,
|
|
||||||
key=lambda audit: audit.goal_uuid,
|
|
||||||
reverse=reverse)
|
|
||||||
|
|
||||||
collection.next = collection.get_next(limit, url=url, **kwargs)
|
collection.next = collection.get_next(limit, url=url, **kwargs)
|
||||||
return collection
|
return collection
|
||||||
|
|
||||||
@@ -381,6 +403,7 @@ class AuditsController(rest.RestController):
|
|||||||
"""REST controller for Audits."""
|
"""REST controller for Audits."""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(AuditsController, self).__init__()
|
super(AuditsController, self).__init__()
|
||||||
|
self.dc_client = rpcapi.DecisionEngineAPI()
|
||||||
|
|
||||||
from_audits = False
|
from_audits = False
|
||||||
"""A flag to indicate if the requests to this controller are coming
|
"""A flag to indicate if the requests to this controller are coming
|
||||||
@@ -394,8 +417,14 @@ class AuditsController(rest.RestController):
|
|||||||
sort_key, sort_dir, expand=False,
|
sort_key, sort_dir, expand=False,
|
||||||
resource_url=None, goal=None,
|
resource_url=None, goal=None,
|
||||||
strategy=None):
|
strategy=None):
|
||||||
|
additional_fields = ["goal_uuid", "goal_name", "strategy_uuid",
|
||||||
|
"strategy_name"]
|
||||||
|
|
||||||
|
api_utils.validate_sort_key(
|
||||||
|
sort_key, list(objects.Audit.fields) + additional_fields)
|
||||||
limit = api_utils.validate_limit(limit)
|
limit = api_utils.validate_limit(limit)
|
||||||
api_utils.validate_sort_dir(sort_dir)
|
api_utils.validate_sort_dir(sort_dir)
|
||||||
|
|
||||||
marker_obj = None
|
marker_obj = None
|
||||||
if marker:
|
if marker:
|
||||||
marker_obj = objects.Audit.get_by_uuid(pecan.request.context,
|
marker_obj = objects.Audit.get_by_uuid(pecan.request.context,
|
||||||
@@ -416,23 +445,25 @@ class AuditsController(rest.RestController):
|
|||||||
# TODO(michaelgugino): add method to get goal by name.
|
# TODO(michaelgugino): add method to get goal by name.
|
||||||
filters['strategy_name'] = strategy
|
filters['strategy_name'] = strategy
|
||||||
|
|
||||||
if sort_key == 'goal_uuid':
|
need_api_sort = api_utils.check_need_api_sort(sort_key,
|
||||||
sort_db_key = 'goal_id'
|
additional_fields)
|
||||||
elif sort_key == 'strategy_uuid':
|
sort_db_key = (sort_key if not need_api_sort
|
||||||
sort_db_key = 'strategy_id'
|
else None)
|
||||||
else:
|
|
||||||
sort_db_key = sort_key
|
|
||||||
|
|
||||||
audits = objects.Audit.list(pecan.request.context,
|
audits = objects.Audit.list(pecan.request.context,
|
||||||
limit,
|
limit,
|
||||||
marker_obj, sort_key=sort_db_key,
|
marker_obj, sort_key=sort_db_key,
|
||||||
sort_dir=sort_dir, filters=filters)
|
sort_dir=sort_dir, filters=filters)
|
||||||
|
|
||||||
return AuditCollection.convert_with_links(audits, limit,
|
audits_collection = AuditCollection.convert_with_links(
|
||||||
url=resource_url,
|
audits, limit, url=resource_url, expand=expand,
|
||||||
expand=expand,
|
sort_key=sort_key, sort_dir=sort_dir)
|
||||||
sort_key=sort_key,
|
|
||||||
sort_dir=sort_dir)
|
if need_api_sort:
|
||||||
|
api_utils.make_api_sort(audits_collection.audits, sort_key,
|
||||||
|
sort_dir)
|
||||||
|
|
||||||
|
return audits_collection
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(AuditCollection, types.uuid, int, wtypes.text,
|
@wsme_pecan.wsexpose(AuditCollection, types.uuid, int, wtypes.text,
|
||||||
wtypes.text, wtypes.text, wtypes.text, int)
|
wtypes.text, wtypes.text, wtypes.text, int)
|
||||||
@@ -483,17 +514,17 @@ class AuditsController(rest.RestController):
|
|||||||
resource_url,
|
resource_url,
|
||||||
goal=goal)
|
goal=goal)
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(Audit, types.uuid)
|
@wsme_pecan.wsexpose(Audit, wtypes.text)
|
||||||
def get_one(self, audit_uuid):
|
def get_one(self, audit):
|
||||||
"""Retrieve information about the given audit.
|
"""Retrieve information about the given audit.
|
||||||
|
|
||||||
:param audit_uuid: UUID of a audit.
|
:param audit: UUID or name of an audit.
|
||||||
"""
|
"""
|
||||||
if self.from_audits:
|
if self.from_audits:
|
||||||
raise exception.OperationNotPermitted
|
raise exception.OperationNotPermitted
|
||||||
|
|
||||||
context = pecan.request.context
|
context = pecan.request.context
|
||||||
rpc_audit = api_utils.get_resource('Audit', audit_uuid)
|
rpc_audit = api_utils.get_resource('Audit', audit)
|
||||||
policy.enforce(context, 'audit:get', rpc_audit, action='audit:get')
|
policy.enforce(context, 'audit:get', rpc_audit, action='audit:get')
|
||||||
|
|
||||||
return Audit.convert_with_links(rpc_audit)
|
return Audit.convert_with_links(rpc_audit)
|
||||||
@@ -502,7 +533,7 @@ class AuditsController(rest.RestController):
|
|||||||
def post(self, audit_p):
|
def post(self, audit_p):
|
||||||
"""Create a new audit.
|
"""Create a new audit.
|
||||||
|
|
||||||
:param audit_p: a audit within the request body.
|
:param audit_p: an audit within the request body.
|
||||||
"""
|
"""
|
||||||
context = pecan.request.context
|
context = pecan.request.context
|
||||||
policy.enforce(context, 'audit:create',
|
policy.enforce(context, 'audit:create',
|
||||||
@@ -532,7 +563,7 @@ class AuditsController(rest.RestController):
|
|||||||
|
|
||||||
if no_schema and audit.parameters:
|
if no_schema and audit.parameters:
|
||||||
raise exception.Invalid(_('Specify parameters but no predefined '
|
raise exception.Invalid(_('Specify parameters but no predefined '
|
||||||
'strategy for audit template, or no '
|
'strategy for audit, or no '
|
||||||
'parameter spec in predefined strategy'))
|
'parameter spec in predefined strategy'))
|
||||||
|
|
||||||
audit_dict = audit.as_dict()
|
audit_dict = audit.as_dict()
|
||||||
@@ -545,17 +576,16 @@ class AuditsController(rest.RestController):
|
|||||||
|
|
||||||
# trigger decision-engine to run the audit
|
# trigger decision-engine to run the audit
|
||||||
if new_audit.audit_type == objects.audit.AuditType.ONESHOT.value:
|
if new_audit.audit_type == objects.audit.AuditType.ONESHOT.value:
|
||||||
dc_client = rpcapi.DecisionEngineAPI()
|
self.dc_client.trigger_audit(context, new_audit.uuid)
|
||||||
dc_client.trigger_audit(context, new_audit.uuid)
|
|
||||||
|
|
||||||
return Audit.convert_with_links(new_audit)
|
return Audit.convert_with_links(new_audit)
|
||||||
|
|
||||||
@wsme.validate(types.uuid, [AuditPatchType])
|
@wsme.validate(types.uuid, [AuditPatchType])
|
||||||
@wsme_pecan.wsexpose(Audit, types.uuid, body=[AuditPatchType])
|
@wsme_pecan.wsexpose(Audit, wtypes.text, body=[AuditPatchType])
|
||||||
def patch(self, audit_uuid, patch):
|
def patch(self, audit, patch):
|
||||||
"""Update an existing audit.
|
"""Update an existing audit.
|
||||||
|
|
||||||
:param audit_uuid: UUID of a audit.
|
:param audit: UUID or name of an audit.
|
||||||
:param patch: a json PATCH document to apply to this audit.
|
:param patch: a json PATCH document to apply to this audit.
|
||||||
"""
|
"""
|
||||||
if self.from_audits:
|
if self.from_audits:
|
||||||
@@ -563,7 +593,7 @@ class AuditsController(rest.RestController):
|
|||||||
|
|
||||||
context = pecan.request.context
|
context = pecan.request.context
|
||||||
audit_to_update = api_utils.get_resource(
|
audit_to_update = api_utils.get_resource(
|
||||||
'Audit', audit_uuid, eager=True)
|
'Audit', audit, eager=True)
|
||||||
policy.enforce(context, 'audit:update', audit_to_update,
|
policy.enforce(context, 'audit:update', audit_to_update,
|
||||||
action='audit:update')
|
action='audit:update')
|
||||||
|
|
||||||
@@ -600,16 +630,23 @@ class AuditsController(rest.RestController):
|
|||||||
audit_to_update.save()
|
audit_to_update.save()
|
||||||
return Audit.convert_with_links(audit_to_update)
|
return Audit.convert_with_links(audit_to_update)
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(None, types.uuid, status_code=204)
|
@wsme_pecan.wsexpose(None, wtypes.text, status_code=204)
|
||||||
def delete(self, audit_uuid):
|
def delete(self, audit):
|
||||||
"""Delete a audit.
|
"""Delete an audit.
|
||||||
|
|
||||||
:param audit_uuid: UUID of a audit.
|
:param audit: UUID or name of an audit.
|
||||||
"""
|
"""
|
||||||
context = pecan.request.context
|
context = pecan.request.context
|
||||||
audit_to_delete = api_utils.get_resource(
|
audit_to_delete = api_utils.get_resource(
|
||||||
'Audit', audit_uuid, eager=True)
|
'Audit', audit, eager=True)
|
||||||
policy.enforce(context, 'audit:update', audit_to_delete,
|
policy.enforce(context, 'audit:delete', audit_to_delete,
|
||||||
action='audit:update')
|
action='audit:delete')
|
||||||
|
|
||||||
|
initial_state = audit_to_delete.state
|
||||||
|
new_state = objects.audit.State.DELETED
|
||||||
|
if not objects.audit.AuditStateTransitionManager(
|
||||||
|
).check_transition(initial_state, new_state):
|
||||||
|
raise exception.DeleteError(
|
||||||
|
state=initial_state)
|
||||||
|
|
||||||
audit_to_delete.soft_delete()
|
audit_to_delete.soft_delete()
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user