Compare commits
233 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2e16bfa96 | ||
|
|
13644429b7 | ||
|
|
b8cc506fbe | ||
|
|
c91f6479f0 | ||
|
|
92572c5dec | ||
|
|
a8f08065fd | ||
|
|
0745d904fc | ||
|
|
bc4a58d2d7 | ||
|
|
f14795d29f | ||
|
|
e0104074b6 | ||
|
|
2993dea376 | ||
|
|
17b6019ea9 | ||
|
|
5969e5b52a | ||
|
|
e55f3793b6 | ||
|
|
901c598dd7 | ||
|
|
e41a90d7ad | ||
|
|
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 | ||
|
|
84fb7423f1 | ||
|
|
ee5b01d33b | ||
|
|
b35feb5432 | ||
|
|
d722b62b97 | ||
|
|
bf713ac7e1 | ||
|
|
8343f4bf46 | ||
|
|
cd3f792eef | ||
|
|
7f7f7a9fd2 | ||
|
|
d5b778b730 | ||
|
|
62a902df7c | ||
|
|
5b6f65630d | ||
|
|
e5031ef04a | ||
|
|
ab2408ea67 | ||
|
|
4c0d2ab4b2 | ||
|
|
cf8d7bb2f4 | ||
|
|
b3d60cb13d | ||
|
|
ffdc3b554d | ||
|
|
9933d61065 | ||
|
|
b4bc1599e6 | ||
|
|
280188a762 | ||
|
|
3942f44e56 | ||
|
|
6208caba0c | ||
|
|
f3b3e82313 | ||
|
|
be69ebd8bd | ||
|
|
7d33bf8813 | ||
|
|
b3fa8a0f86 | ||
|
|
9d3cc28d2d | ||
|
|
eed2e128b0 | ||
|
|
7091fe435f | ||
|
|
7f9b562bbd | ||
|
|
f445fc451e | ||
|
|
fa7749ac8f | ||
|
|
e6c06c1bdf | ||
|
|
f461b8c567 | ||
|
|
c717be12a6 | ||
|
|
5814914aef | ||
|
|
fb3c2355a6 | ||
|
|
d4e6e82dd2 | ||
|
|
816765374d | ||
|
|
35e502f666 | ||
|
|
ee36bb8180 | ||
|
|
51b3a15c90 | ||
|
|
0213bee63b | ||
|
|
f516a9c3b9 | ||
|
|
8e89d5489c | ||
|
|
773b20a05f | ||
|
|
03d6580819 | ||
|
|
afa73238c4 | ||
|
|
2467780f9d | ||
|
|
25854aabd8 | ||
|
|
e4f4588e69 | ||
|
|
1465aa0c5f | ||
|
|
e6e0b3dbaa | ||
|
|
d8274e062e | ||
|
|
28b9766693 | ||
|
|
74bc31e562 | ||
|
|
998e86f6c7 | ||
|
|
a5e7fd90c2 | ||
|
|
a99a9ae69e | ||
|
|
6e6e5907ee | ||
|
|
c887499b4d | ||
|
|
58e4bf2727 | ||
|
|
1df395d31d | ||
|
|
f811c8af48 | ||
|
|
e447393f18 | ||
|
|
a25be6498c | ||
|
|
8e372ee153 | ||
|
|
7bc984b84a | ||
|
|
eeee32ad36 | ||
|
|
3a7fc7a8e5 | ||
|
|
63697d5a6e | ||
|
|
887fa746ae | ||
|
|
e74095da1f | ||
|
|
65c7cd0e02 | ||
|
|
5df54ea3fb | ||
|
|
51dba60e01 | ||
|
|
a9f33467fb | ||
|
|
4640d88adf | ||
|
|
154aca3948 | ||
|
|
fa7afc89ab | ||
|
|
790548fff0 | ||
|
|
a2fa13c8ff | ||
|
|
4c3c84dee9 | ||
|
|
8f585c3def | ||
|
|
c9a43d8da4 | ||
|
|
2ea7d61ac8 | ||
|
|
bbfd6711fc | ||
|
|
162aaa75ee | ||
|
|
4cb2b45e3a | ||
|
|
50935af15f | ||
|
|
cf92ece936 | ||
|
|
b7c4a0467c | ||
|
|
c12f132699 | ||
|
|
0329dafec9 | ||
|
|
e73ead4807 | ||
|
|
cb90f60cc1 | ||
|
|
d7994a2466 | ||
|
|
62822fa933 | ||
|
|
3f0ff1ed7e | ||
|
|
8e3b5c90a6 | ||
|
|
1c5e254124 | ||
|
|
39e200e5eb | ||
|
|
2650b89fe5 | ||
|
|
d5bcd37478 | ||
|
|
0c4b439c5e | ||
|
|
0e43504e44 | ||
|
|
322843b21c | ||
|
|
1b413f5536 | ||
|
|
f76a628d1f | ||
|
|
3e6ea71cbc | ||
|
|
e5c3df0c2f | ||
|
|
6005d6ebdd | ||
|
|
965af1b6fd | ||
|
|
daf428ad69 | ||
|
|
ab64dab646 | ||
|
|
eaa09a4cfc | ||
|
|
5c86a54d20 | ||
|
|
e78f2d073f | ||
|
|
47004b7c67 | ||
|
|
9ecd22f4c8 | ||
|
|
daee2336a4 | ||
|
|
893b730a44 | ||
|
|
d5b6e0a54f | ||
|
|
13b89c8dd2 | ||
|
|
7a300832b2 | ||
|
|
d218e6f107 | ||
|
|
d2f70f9d6f | ||
|
|
4951854f76 | ||
|
|
ffbd263888 | ||
|
|
985c6c49f9 | ||
|
|
adac2c0c16 | ||
|
|
f700ca4e0f | ||
|
|
5b741b2a4d | ||
|
|
382f641b22 | ||
|
|
5da5db8b56 | ||
|
|
5cc4716a95 | ||
|
|
c4888fee63 | ||
|
|
76f85591ea | ||
|
|
b006cadd22 | ||
|
|
1fd2053001 | ||
|
|
6a920fd307 | ||
|
|
514eeb75ef | ||
|
|
b43633fa6d | ||
|
|
d5a7d7674c | ||
|
|
b532355232 | ||
|
|
bce87b3d05 | ||
|
|
783627626c | ||
|
|
3043e57066 | ||
|
|
be8b163a62 | ||
|
|
4f38595e4e | ||
|
|
30def6f35b | ||
|
|
0b31828a01 | ||
|
|
b5ac97bc2d | ||
|
|
398974a7b0 | ||
|
|
3a29b4e710 | ||
|
|
8024dbf913 | ||
|
|
529b0d34ee | ||
|
|
dac0924194 | ||
|
|
3bb66b645c | ||
|
|
63cebc0bfa | ||
|
|
5a28ac772a | ||
|
|
fe7ad9e42b | ||
|
|
711de94855 | ||
|
|
a24b7f0b61 | ||
|
|
c03668cb02 | ||
|
|
aab18245eb | ||
|
|
c12178920b | ||
|
|
f733fbeecd | ||
|
|
bff76de6f1 | ||
|
|
22ee0aa8f7 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -24,6 +24,7 @@ pip-log.txt
|
||||
.coverage*
|
||||
.tox
|
||||
nosetests.xml
|
||||
.stestr/
|
||||
.testrepository
|
||||
.venv
|
||||
.idea
|
||||
@@ -72,3 +73,6 @@ releasenotes/build
|
||||
|
||||
# Desktop Service Store
|
||||
*.DS_Store
|
||||
|
||||
# Autogenerated sample config file
|
||||
etc/watcher/watcher.conf.sample
|
||||
|
||||
4
.stestr.conf
Normal file
4
.stestr.conf
Normal file
@@ -0,0 +1,4 @@
|
||||
[DEFAULT]
|
||||
test_path=${OS_TEST_PATH:-./watcher/tests}
|
||||
top_dir=./
|
||||
|
||||
39
.zuul.yaml
Normal file
39
.zuul.yaml
Normal file
@@ -0,0 +1,39 @@
|
||||
- project:
|
||||
name: openstack/watcher
|
||||
check:
|
||||
jobs:
|
||||
- watcher-tempest-multinode
|
||||
- legacy-rally-dsvm-watcher-rally
|
||||
|
||||
- job:
|
||||
name: watcher-tempest-base-multinode
|
||||
parent: legacy-dsvm-base-multinode
|
||||
run: playbooks/legacy/watcher-tempest-base-multinode/run.yaml
|
||||
post-run: playbooks/legacy/watcher-tempest-base-multinode/post.yaml
|
||||
timeout: 4200
|
||||
required-projects:
|
||||
- openstack-infra/devstack-gate
|
||||
- openstack/python-openstackclient
|
||||
- openstack/python-watcherclient
|
||||
- openstack/watcher
|
||||
- openstack/watcher-tempest-plugin
|
||||
nodeset: legacy-ubuntu-xenial-2-node
|
||||
|
||||
- job:
|
||||
name: watcher-tempest-multinode
|
||||
parent: watcher-tempest-base-multinode
|
||||
voting: false
|
||||
|
||||
- job:
|
||||
# This job is used by python-watcherclient repo
|
||||
name: watcherclient-tempest-functional
|
||||
parent: legacy-dsvm-base
|
||||
run: playbooks/legacy/watcherclient-tempest-functional/run.yaml
|
||||
post-run: playbooks/legacy/watcherclient-tempest-functional/post.yaml
|
||||
timeout: 4200
|
||||
required-projects:
|
||||
- openstack-dev/devstack
|
||||
- openstack-infra/devstack-gate
|
||||
- openstack/python-openstackclient
|
||||
- openstack/python-watcherclient
|
||||
- openstack/watcher
|
||||
@@ -24,13 +24,6 @@ MULTI_HOST=1
|
||||
# This is the controller node, so disable nova-compute
|
||||
disable_service n-cpu
|
||||
|
||||
# Disable nova-network and use neutron instead
|
||||
disable_service n-net
|
||||
ENABLED_SERVICES+=,q-svc,q-dhcp,q-meta,q-agt,q-l3,neutron
|
||||
|
||||
# Enable remote console access
|
||||
enable_service n-cauth
|
||||
|
||||
# Enable the Watcher Dashboard plugin
|
||||
enable_plugin watcher-dashboard git://git.openstack.org/openstack/watcher-dashboard
|
||||
|
||||
@@ -42,11 +35,12 @@ enable_plugin ceilometer git://git.openstack.org/openstack/ceilometer
|
||||
|
||||
# This is the controller node, so disable the ceilometer compute agent
|
||||
disable_service ceilometer-acompute
|
||||
|
||||
# Enable the ceilometer api explicitly(bug:1667678)
|
||||
enable_service ceilometer-api
|
||||
|
||||
# Enable the Gnocchi plugin
|
||||
enable_plugin gnocchi https://git.openstack.org/openstack/gnocchi
|
||||
enable_plugin gnocchi https://github.com/gnocchixyz/gnocchi
|
||||
|
||||
LOGFILE=$DEST/logs/stack.sh.log
|
||||
LOGDAYS=2
|
||||
|
||||
@@ -7,7 +7,7 @@ _XTRACE_WATCHER_PLUGIN=$(set +o | grep xtrace)
|
||||
set -o xtrace
|
||||
|
||||
echo_summary "watcher's plugin.sh was called..."
|
||||
source $DEST/watcher/devstack/lib/watcher
|
||||
. $DEST/watcher/devstack/lib/watcher
|
||||
|
||||
# Show all of defined environment variables
|
||||
(set -o posix; set)
|
||||
|
||||
@@ -22,7 +22,7 @@ from docutils import nodes
|
||||
from docutils.parsers import rst
|
||||
from docutils import statemachine
|
||||
|
||||
from watcher.version import version_info
|
||||
from watcher.version import version_string
|
||||
|
||||
|
||||
class BaseWatcherDirective(rst.Directive):
|
||||
@@ -169,4 +169,4 @@ class WatcherFunc(BaseWatcherDirective):
|
||||
def setup(app):
|
||||
app.add_directive('watcher-term', WatcherTerm)
|
||||
app.add_directive('watcher-func', WatcherFunc)
|
||||
return {'version': version_info.version_string()}
|
||||
return {'version': version_string}
|
||||
|
||||
41
doc/notification_samples/action-cancel-end.json
Normal file
41
doc/notification_samples/action-cancel-end.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.name": "ActionCancelPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"input_parameters": {
|
||||
"param2": 2,
|
||||
"param1": 1
|
||||
},
|
||||
"fault": null,
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "CANCELLED",
|
||||
"action_plan": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.name": "TerseActionPlanPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"global_efficacy": [],
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "CANCELLING",
|
||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"deleted_at": null
|
||||
}
|
||||
},
|
||||
"parents": [],
|
||||
"action_type": "nop",
|
||||
"deleted_at": null
|
||||
}
|
||||
},
|
||||
"event_type": "action.cancel.end",
|
||||
"publisher_id": "infra-optim:node0",
|
||||
"timestamp": "2017-01-01 00:00:00.000000",
|
||||
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
|
||||
}
|
||||
51
doc/notification_samples/action-cancel-error.json
Normal file
51
doc/notification_samples/action-cancel-error.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"priority": "ERROR",
|
||||
"payload": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.name": "ActionCancelPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"input_parameters": {
|
||||
"param2": 2,
|
||||
"param1": 1
|
||||
},
|
||||
"fault": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.name": "ExceptionPayload",
|
||||
"watcher_object.data": {
|
||||
"module_name": "watcher.tests.notifications.test_action_notification",
|
||||
"exception": "WatcherException",
|
||||
"exception_message": "TEST",
|
||||
"function_name": "test_send_action_cancel_with_error"
|
||||
}
|
||||
},
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "FAILED",
|
||||
"action_plan": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.name": "TerseActionPlanPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"global_efficacy": [],
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "CANCELLING",
|
||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"deleted_at": null
|
||||
}
|
||||
},
|
||||
"parents": [],
|
||||
"action_type": "nop",
|
||||
"deleted_at": null
|
||||
}
|
||||
},
|
||||
"event_type": "action.cancel.error",
|
||||
"publisher_id": "infra-optim:node0",
|
||||
"timestamp": "2017-01-01 00:00:00.000000",
|
||||
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
|
||||
}
|
||||
41
doc/notification_samples/action-cancel-start.json
Normal file
41
doc/notification_samples/action-cancel-start.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.name": "ActionCancelPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"input_parameters": {
|
||||
"param2": 2,
|
||||
"param1": 1
|
||||
},
|
||||
"fault": null,
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "CANCELLING",
|
||||
"action_plan": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.name": "TerseActionPlanPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"global_efficacy": [],
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "CANCELLING",
|
||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"deleted_at": null
|
||||
}
|
||||
},
|
||||
"parents": [],
|
||||
"action_type": "nop",
|
||||
"deleted_at": null
|
||||
}
|
||||
},
|
||||
"event_type": "action.cancel.start",
|
||||
"publisher_id": "infra-optim:node0",
|
||||
"timestamp": "2017-01-01 00:00:00.000000",
|
||||
"message_id": "530b409c-9b6b-459b-8f08-f93dbfeb4d41"
|
||||
}
|
||||
@@ -20,7 +20,7 @@
|
||||
"watcher_object.name": "TerseActionPlanPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"global_efficacy": {},
|
||||
"global_efficacy": [],
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "ONGOING",
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"watcher_object.name": "TerseActionPlanPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"global_efficacy": {},
|
||||
"global_efficacy":[],
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "ONGOING",
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"watcher_object.name": "TerseActionPlanPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"global_efficacy": {},
|
||||
"global_efficacy": [],
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"updated_at": null,
|
||||
"state": "ONGOING",
|
||||
|
||||
55
doc/notification_samples/action_plan-cancel-end.json
Normal file
55
doc/notification_samples/action_plan-cancel-end.json
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"event_type": "action_plan.cancel.end",
|
||||
"payload": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "ActionPlanCancelPayload",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"audit": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "TerseAuditPayload",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
"scope": [],
|
||||
"audit_type": "ONESHOT",
|
||||
"state": "SUCCEEDED",
|
||||
"parameters": {},
|
||||
"interval": null,
|
||||
"updated_at": null
|
||||
}
|
||||
},
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"fault": null,
|
||||
"state": "CANCELLED",
|
||||
"global_efficacy": [],
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"strategy": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "StrategyPayload",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"name": "TEST",
|
||||
"uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"parameters_spec": {},
|
||||
"display_name": "test strategy",
|
||||
"updated_at": null
|
||||
}
|
||||
},
|
||||
"updated_at": null
|
||||
}
|
||||
},
|
||||
"priority": "INFO",
|
||||
"message_id": "3984dc2b-8aef-462b-a220-8ae04237a56e",
|
||||
"timestamp": "2016-10-18 09:52:05.219414",
|
||||
"publisher_id": "infra-optim:node0"
|
||||
}
|
||||
65
doc/notification_samples/action_plan-cancel-error.json
Normal file
65
doc/notification_samples/action_plan-cancel-error.json
Normal file
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"event_type": "action_plan.cancel.error",
|
||||
"publisher_id": "infra-optim:node0",
|
||||
"priority": "ERROR",
|
||||
"message_id": "9a45c5ae-0e21-4300-8fa0-5555d52a66d9",
|
||||
"payload": {
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "ActionPlanCancelPayload",
|
||||
"watcher_object.data": {
|
||||
"fault": {
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "ExceptionPayload",
|
||||
"watcher_object.data": {
|
||||
"exception_message": "TEST",
|
||||
"module_name": "watcher.tests.notifications.test_action_plan_notification",
|
||||
"function_name": "test_send_action_plan_cancel_with_error",
|
||||
"exception": "WatcherException"
|
||||
}
|
||||
},
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"strategy": {
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "StrategyPayload",
|
||||
"watcher_object.data": {
|
||||
"uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"name": "TEST",
|
||||
"updated_at": null,
|
||||
"display_name": "test strategy",
|
||||
"parameters_spec": {},
|
||||
"deleted_at": null
|
||||
}
|
||||
},
|
||||
"updated_at": null,
|
||||
"deleted_at": null,
|
||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"audit": {
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "TerseAuditPayload",
|
||||
"watcher_object.data": {
|
||||
"parameters": {},
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"scope": [],
|
||||
"updated_at": null,
|
||||
"audit_type": "ONESHOT",
|
||||
"interval": null,
|
||||
"deleted_at": null,
|
||||
"state": "SUCCEEDED"
|
||||
}
|
||||
},
|
||||
"global_efficacy": [],
|
||||
"state": "CANCELLING"
|
||||
}
|
||||
},
|
||||
"timestamp": "2016-10-18 09:52:05.219414"
|
||||
}
|
||||
55
doc/notification_samples/action_plan-cancel-start.json
Normal file
55
doc/notification_samples/action_plan-cancel-start.json
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"event_type": "action_plan.cancel.start",
|
||||
"payload": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "ActionPlanCancelPayload",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"audit": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "TerseAuditPayload",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
"scope": [],
|
||||
"audit_type": "ONESHOT",
|
||||
"state": "SUCCEEDED",
|
||||
"parameters": {},
|
||||
"interval": null,
|
||||
"updated_at": null
|
||||
}
|
||||
},
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"fault": null,
|
||||
"state": "CANCELLING",
|
||||
"global_efficacy": [],
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"strategy": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
"watcher_object.name": "StrategyPayload",
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"name": "TEST",
|
||||
"uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"parameters_spec": {},
|
||||
"display_name": "test strategy",
|
||||
"updated_at": null
|
||||
}
|
||||
},
|
||||
"updated_at": null
|
||||
}
|
||||
},
|
||||
"priority": "INFO",
|
||||
"message_id": "3984dc2b-8aef-462b-a220-8ae04237a56e",
|
||||
"timestamp": "2016-10-18 09:52:05.219414",
|
||||
"publisher_id": "infra-optim:node0"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"audit": {
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"scope": [],
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"audit": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"name": "my_audit",
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
@@ -29,7 +30,7 @@
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"fault": null,
|
||||
"state": "ONGOING",
|
||||
"global_efficacy": {},
|
||||
"global_efficacy": [],
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"strategy": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
"watcher_object.name": "TerseAuditPayload",
|
||||
"watcher_object.data": {
|
||||
"parameters": {},
|
||||
"name": "my_audit",
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
@@ -57,7 +58,7 @@
|
||||
"state": "PENDING"
|
||||
}
|
||||
},
|
||||
"global_efficacy": {},
|
||||
"global_efficacy": [],
|
||||
"state": "ONGOING"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"watcher_object.data": {
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
"deleted_at": null,
|
||||
"name": "my_audit",
|
||||
"uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
|
||||
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
@@ -29,7 +30,7 @@
|
||||
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
|
||||
"fault": null,
|
||||
"state": "ONGOING",
|
||||
"global_efficacy": {},
|
||||
"global_efficacy": [],
|
||||
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
|
||||
"strategy": {
|
||||
"watcher_object.namespace": "watcher",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"audit": {
|
||||
"watcher_object.version": "1.0",
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"scope": [],
|
||||
"created_at": "2016-10-18T09:52:05Z",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "ERROR",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "ERROR",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"priority": "INFO",
|
||||
"payload": {
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"audit_type": "ONESHOT",
|
||||
"parameters": {
|
||||
"para2": "hello",
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
"payload": {
|
||||
"watcher_object.name": "AuditUpdatePayload",
|
||||
"watcher_object.data": {
|
||||
"name": "my_audit",
|
||||
"strategy_uuid": "75234dfe-87e3-4f11-a0e0-3c3305d86a39",
|
||||
"strategy": {
|
||||
"watcher_object.name": "StrategyPayload",
|
||||
|
||||
@@ -126,9 +126,9 @@ Here is single Dockerfile snippet you can use to run your Docker container:
|
||||
MAINTAINER David TARDIVEL <david.tardivel@b-com.com>
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get dist-upgrade -y
|
||||
RUN apt-get install -y vim net-tools
|
||||
RUN apt-get install -yt experimental watcher-api
|
||||
RUN apt-get dist-upgrade
|
||||
RUN apt-get install vim net-tools
|
||||
RUN apt-get install experimental watcher-api
|
||||
|
||||
CMD ["/usr/bin/watcher-api"]
|
||||
|
||||
|
||||
@@ -86,3 +86,15 @@ Actions
|
||||
|
||||
.. autotype:: watcher.api.controllers.v1.action.Action
|
||||
: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:
|
||||
|
||||
@@ -119,7 +119,7 @@ The watcher command-line interface (CLI) can be used to interact with the
|
||||
Watcher system in order to control it or to know its current status.
|
||||
|
||||
Please, read `the detailed documentation about Watcher CLI
|
||||
<https://factory.b-com.com/www/watcher/doc/python-watcherclient/>`_.
|
||||
<https://docs.openstack.org/python-watcherclient/latest/cli/>`_.
|
||||
|
||||
.. _archi_watcher_dashboard_definition:
|
||||
|
||||
@@ -130,7 +130,7 @@ The Watcher Dashboard can be used to interact with the Watcher system through
|
||||
Horizon in order to control it or to know its current status.
|
||||
|
||||
Please, read `the detailed documentation about Watcher Dashboard
|
||||
<http://docs.openstack.org/developer/watcher-dashboard/>`_.
|
||||
<https://docs.openstack.org/watcher-dashboard/latest>`_.
|
||||
|
||||
.. _archi_watcher_database_definition:
|
||||
|
||||
@@ -170,7 +170,7 @@ Unless specified, it then selects the most appropriate :ref:`strategy
|
||||
goal.
|
||||
|
||||
The :ref:`Strategy <strategy_definition>` is then dynamically loaded (via
|
||||
`stevedore <http://docs.openstack.org/developer/stevedore/>`_). The
|
||||
`stevedore <https://docs.openstack.org/stevedore/latest>`_). The
|
||||
:ref:`Watcher Decision Engine <watcher_decision_engine_definition>` executes
|
||||
the strategy.
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ copyright = u'OpenStack Foundation'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = watcher_version.version_info.release_string()
|
||||
# The short X.Y version.
|
||||
version = watcher_version.version_info.version_string()
|
||||
version = watcher_version.version_string
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
modindex_common_prefix = ['watcher.']
|
||||
|
||||
@@ -15,7 +15,7 @@ Service overview
|
||||
================
|
||||
|
||||
The Watcher system is a collection of services that provides support to
|
||||
optimize your IAAS platform. The Watcher service may, depending upon
|
||||
optimize your IaaS platform. The Watcher service may, depending upon
|
||||
configuration, interact with several other OpenStack services. This includes:
|
||||
|
||||
- the OpenStack Identity service (`keystone`_) for request authentication and
|
||||
@@ -27,7 +27,7 @@ configuration, interact with several other OpenStack services. This includes:
|
||||
|
||||
The Watcher service includes the following components:
|
||||
|
||||
- ``watcher-decision-engine``: runs audit on part of your IAAS and return an
|
||||
- ``watcher-decision-engine``: runs audit on part of your IaaS and return an
|
||||
action plan in order to optimize resource placement.
|
||||
- ``watcher-api``: A RESTful API that processes application requests by sending
|
||||
them to the watcher-decision-engine over RPC.
|
||||
@@ -349,7 +349,7 @@ so that the watcher service is configured for your needs.
|
||||
[nova_client]
|
||||
|
||||
# Version of Nova API to use in novaclient. (string value)
|
||||
#api_version = 2
|
||||
#api_version = 2.53
|
||||
api_version = 2.1
|
||||
|
||||
#. Create the Watcher Service database tables::
|
||||
@@ -366,15 +366,14 @@ Configure Nova compute
|
||||
Please check your hypervisor configuration to correctly handle
|
||||
`instance migration`_.
|
||||
|
||||
.. _`instance migration`: http://docs.openstack.org/admin-guide/compute-live-migration-usage.html
|
||||
.. _`instance migration`: https://docs.openstack.org/nova/latest/admin/migration.html
|
||||
|
||||
Configure Measurements
|
||||
======================
|
||||
|
||||
You can configure and install Ceilometer by following the documentation below :
|
||||
|
||||
#. http://docs.openstack.org/developer/ceilometer
|
||||
#. http://docs.openstack.org/kilo/install-guide/install/apt/content/ceilometer-nova.html
|
||||
#. https://docs.openstack.org/ceilometer/latest
|
||||
|
||||
The built-in strategy 'basic_consolidation' provided by watcher requires
|
||||
"**compute.node.cpu.percent**" and "**cpu_util**" measurements to be collected
|
||||
@@ -386,13 +385,13 @@ the OpenStack site.
|
||||
You can use 'ceilometer meter-list' to list the available meters.
|
||||
|
||||
For more information:
|
||||
http://docs.openstack.org/developer/ceilometer/measurements.html
|
||||
https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html
|
||||
|
||||
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
|
||||
existing ones, you need to follow the documentation below:
|
||||
|
||||
#. http://docs.openstack.org/developer/ceilometer/new_meters.html
|
||||
#. https://docs.openstack.org/ceilometer/latest/contributor/new_meters.html#meters
|
||||
|
||||
The Ceilometer collector uses a pluggable storage system, meaning that you can
|
||||
pick any database system you prefer.
|
||||
@@ -430,6 +429,26 @@ to Watcher receives Nova notifications in ``watcher_notifications`` as well.
|
||||
* Restart the Nova services.
|
||||
|
||||
|
||||
Configure Cinder Notifications
|
||||
==============================
|
||||
|
||||
Watcher can also consume notifications generated by the Cinder services, in
|
||||
order to build or update, in real time, its cluster data model related to
|
||||
storage resources. To do so, you have to update the Cinder configuration
|
||||
file on controller and volume nodes, in order to let Watcher receive Cinder
|
||||
notifications in a dedicated ``watcher_notifications`` channel.
|
||||
|
||||
* In the file ``/etc/cinder/cinder.conf``, update the section
|
||||
``[oslo_messaging_notifications]``, by redefining the list of topics
|
||||
into which Cinder services will publish events ::
|
||||
|
||||
[oslo_messaging_notifications]
|
||||
driver = messagingv2
|
||||
topics = notifications,watcher_notifications
|
||||
|
||||
* Restart the Cinder services.
|
||||
|
||||
|
||||
Workers
|
||||
=======
|
||||
|
||||
|
||||
@@ -24,8 +24,8 @@ signed OpenStack's contributor's agreement.
|
||||
|
||||
.. seealso::
|
||||
|
||||
* http://docs.openstack.org/infra/manual/developers.html
|
||||
* http://wiki.openstack.org/CLA
|
||||
* https://docs.openstack.org/infra/manual/developers.html
|
||||
* https://wiki.openstack.org/CLA
|
||||
|
||||
LaunchPad Project
|
||||
-----------------
|
||||
@@ -37,22 +37,22 @@ notifications of important events.
|
||||
|
||||
.. seealso::
|
||||
|
||||
* http://launchpad.net
|
||||
* http://launchpad.net/watcher
|
||||
* http://launchpad.net/~openstack
|
||||
* https://launchpad.net
|
||||
* https://launchpad.net/watcher
|
||||
* https://launchpad.net/~openstack
|
||||
|
||||
|
||||
Project Hosting Details
|
||||
-----------------------
|
||||
|
||||
Bug tracker
|
||||
http://launchpad.net/watcher
|
||||
https://launchpad.net/watcher
|
||||
|
||||
Mailing list (prefix subjects with ``[watcher]`` for faster responses)
|
||||
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
|
||||
https://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
|
||||
|
||||
Wiki
|
||||
http://wiki.openstack.org/Watcher
|
||||
https://wiki.openstack.org/Watcher
|
||||
|
||||
Code Hosting
|
||||
https://git.openstack.org/cgit/openstack/watcher
|
||||
|
||||
@@ -24,8 +24,8 @@ Watcher plugin::
|
||||
For more detailed instructions, see `Detailed DevStack Instructions`_. Check
|
||||
out the `DevStack documentation`_ for more information regarding DevStack.
|
||||
|
||||
.. _PluginModelDocs: http://docs.openstack.org/developer/devstack/plugins.html
|
||||
.. _DevStack documentation: http://docs.openstack.org/developer/devstack/
|
||||
.. _PluginModelDocs: https://docs.openstack.org/devstack/latest/plugins.html
|
||||
.. _DevStack documentation: https://docs.openstack.org/devstack/latest
|
||||
|
||||
Detailed DevStack Instructions
|
||||
==============================
|
||||
@@ -37,7 +37,7 @@ Detailed DevStack Instructions
|
||||
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
|
||||
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.
|
||||
|
||||
#. For each server, clone the DevStack repository and create the stack user::
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
https://creativecommons.org/licenses/by/3.0/
|
||||
|
||||
.. _watcher_developement_environment:
|
||||
.. _watcher_development_environment:
|
||||
|
||||
=========================================
|
||||
Set up a development environment manually
|
||||
@@ -25,7 +25,7 @@ Prerequisites
|
||||
This document assumes you are using Ubuntu or Fedora, and that you have the
|
||||
following tools available on your system:
|
||||
|
||||
- Python_ 2.7 and 3.4
|
||||
- Python_ 2.7 and 3.5
|
||||
- git_
|
||||
- setuptools_
|
||||
- pip_
|
||||
@@ -69,21 +69,21 @@ itself.
|
||||
|
||||
These dependencies can be installed from PyPi_ using the Python tool pip_.
|
||||
|
||||
.. _PyPi: http://pypi.python.org/
|
||||
.. _pip: http://pypi.python.org/pypi/pip
|
||||
.. _PyPi: https://pypi.python.org/
|
||||
.. _pip: https://pypi.python.org/pypi/pip
|
||||
|
||||
However, your system *may* need additional dependencies that `pip` (and by
|
||||
extension, PyPi) cannot satisfy. These dependencies should be installed
|
||||
prior to using `pip`, and the installation method may vary depending on
|
||||
your platform.
|
||||
|
||||
* Ubuntu 14.04::
|
||||
* Ubuntu 16.04::
|
||||
|
||||
$ sudo apt-get install python-dev libssl-dev libmysqlclient-dev libffi-dev
|
||||
|
||||
* Fedora 19+::
|
||||
* Fedora 24+::
|
||||
|
||||
$ sudo yum install openssl-devel libffi-devel mysql-devel
|
||||
$ sudo dnf install redhat-rpm-config gcc python-devel libxml2-devel
|
||||
|
||||
* CentOS 7::
|
||||
|
||||
@@ -125,7 +125,7 @@ You can re-activate this virtualenv for your current shell using:
|
||||
|
||||
For more information on virtual environments, see virtualenv_.
|
||||
|
||||
.. _virtualenv: http://www.virtualenv.org/
|
||||
.. _virtualenv: https://www.virtualenv.org/
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ Here below is how you would proceed to register ``DummyAction`` using pbr_:
|
||||
watcher_actions =
|
||||
dummy = thirdparty.dummy:DummyAction
|
||||
|
||||
.. _pbr: http://docs.openstack.org/developer/pbr/
|
||||
.. _pbr: https://docs.openstack.org/pbr/latest
|
||||
|
||||
|
||||
Using action plugins
|
||||
@@ -217,3 +217,11 @@ which is only able to process the Watcher built-in actions. Therefore, you will
|
||||
either have to use an existing third-party planner or :ref:`implement another
|
||||
planner <implement_planner_plugin>` that will be able to take into account your
|
||||
new action plugin.
|
||||
|
||||
|
||||
Test your new action
|
||||
====================
|
||||
|
||||
In order to test your new action via a manual test or a Tempest test, you can
|
||||
use the :py:class:`~.Actuator` strategy and pass it one or more actions to
|
||||
execute. This way, you can isolate your action to see if it works as expected.
|
||||
|
||||
@@ -22,7 +22,7 @@ Pre-requisites
|
||||
We assume that you have set up a working Watcher development environment. So if
|
||||
this not already the case, you can check out our documentation which explains
|
||||
how to set up a :ref:`development environment
|
||||
<watcher_developement_environment>`.
|
||||
<watcher_development_environment>`.
|
||||
|
||||
.. _development environment:
|
||||
|
||||
@@ -34,7 +34,7 @@ First off, we need to create the project structure. To do so, we can use
|
||||
generate the skeleton of our project::
|
||||
|
||||
$ virtualenv thirdparty
|
||||
$ source thirdparty/bin/activate
|
||||
$ . thirdparty/bin/activate
|
||||
$ pip install cookiecutter
|
||||
$ cookiecutter https://github.com/openstack-dev/cookiecutter
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ In order to create a new cluster data model collector, you have to:
|
||||
- Implement its :py:meth:`~.BaseClusterDataModelCollector.execute` abstract
|
||||
method to return your entire cluster data model that this method should
|
||||
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
|
||||
return the list of all the :py:class:`~.base.NotificationEndpoint` instances
|
||||
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...
|
||||
return model
|
||||
|
||||
@property
|
||||
def audit_scope_handler(self):
|
||||
return None
|
||||
|
||||
@property
|
||||
def notification_endpoints(self):
|
||||
return []
|
||||
@@ -135,6 +141,10 @@ class method as followed:
|
||||
# Do something here...
|
||||
return model
|
||||
|
||||
@property
|
||||
def audit_scope_handler(self):
|
||||
return None
|
||||
|
||||
@property
|
||||
def notification_endpoints(self):
|
||||
return []
|
||||
@@ -198,7 +208,7 @@ Here below is how to register ``DummyClusterDataModelCollector`` using pbr_:
|
||||
watcher_cluster_data_model_collectors =
|
||||
dummy = thirdparty.dummy:DummyClusterDataModelCollector
|
||||
|
||||
.. _pbr: http://docs.openstack.org/developer/pbr/
|
||||
.. _pbr: http://docs.openstack.org/pbr/latest
|
||||
|
||||
|
||||
Add new notification endpoints
|
||||
|
||||
@@ -127,7 +127,7 @@ To get a better understanding on how to implement a more advanced goal, have
|
||||
a look at the
|
||||
:py:class:`watcher.decision_engine.goal.goals.ServerConsolidation` class.
|
||||
|
||||
.. _pbr: http://docs.openstack.org/developer/pbr/
|
||||
.. _pbr: https://docs.openstack.org/pbr/latest
|
||||
|
||||
.. _implement_efficacy_specification:
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ Here below is how you would proceed to register ``DummyPlanner`` using pbr_:
|
||||
watcher_planners =
|
||||
dummy = third_party.dummy:DummyPlanner
|
||||
|
||||
.. _pbr: http://docs.openstack.org/developer/pbr/
|
||||
.. _pbr: https://docs.openstack.org/pbr/latest
|
||||
|
||||
|
||||
Using planner plugins
|
||||
|
||||
@@ -190,7 +190,7 @@ the :py:class:`~.DummyScoringContainer` and the way it is configured in
|
||||
watcher_scoring_engine_containers =
|
||||
new_scoring_container = thirdparty.new:NewContainer
|
||||
|
||||
.. _pbr: http://docs.openstack.org/developer/pbr/
|
||||
.. _pbr: https://docs.openstack.org/pbr/latest/
|
||||
|
||||
|
||||
Using scoring engine plugins
|
||||
|
||||
@@ -219,7 +219,7 @@ Here below is how you would proceed to register ``NewStrategy`` using pbr_:
|
||||
To get a better understanding on how to implement a more advanced strategy,
|
||||
have a look at the :py:class:`~.BasicConsolidation` class.
|
||||
|
||||
.. _pbr: http://docs.openstack.org/developer/pbr/
|
||||
.. _pbr: https://docs.openstack.org/pbr/latest
|
||||
|
||||
Using strategy plugins
|
||||
======================
|
||||
@@ -264,11 +264,11 @@ requires new metrics not covered by Ceilometer, you can add them through a
|
||||
|
||||
|
||||
.. _`Helper`: https://github.com/openstack/watcher/blob/master/watcher/decision_engine/cluster/history/ceilometer.py
|
||||
.. _`Ceilometer developer guide`: http://docs.openstack.org/developer/ceilometer/architecture.html#storing-the-data
|
||||
.. _`Ceilometer`: http://docs.openstack.org/developer/ceilometer/
|
||||
.. _`Ceilometer developer guide`: https://docs.openstack.org/ceilometer/latest/contributor/architecture.html#storing-accessing-the-data
|
||||
.. _`Ceilometer`: https://docs.openstack.org/ceilometer/latest
|
||||
.. _`Monasca`: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md
|
||||
.. _`here`: http://docs.openstack.org/developer/ceilometer/install/dbreco.html#choosing-a-database-backend
|
||||
.. _`Ceilometer plugin`: http://docs.openstack.org/developer/ceilometer/plugins.html
|
||||
.. _`here`: https://docs.openstack.org/ceilometer/latest/contributor/install/dbreco.html#choosing-a-database-backend
|
||||
.. _`Ceilometer plugin`: https://docs.openstack.org/ceilometer/latest/contributor/plugins.html
|
||||
.. _`Ceilosca`: https://github.com/openstack/monasca-ceilometer/blob/master/ceilosca/ceilometer/storage/impl_monasca.py
|
||||
|
||||
Read usage metrics using the Watcher Datasource Helper
|
||||
|
||||
@@ -41,10 +41,18 @@ you can run the desired test::
|
||||
$ workon watcher
|
||||
(watcher) $ tox -e py27 -- -r watcher.tests.api
|
||||
|
||||
.. _os-testr: http://docs.openstack.org/developer/os-testr/
|
||||
.. _os-testr: https://docs.openstack.org/os-testr/latest
|
||||
|
||||
When you're done, deactivate the virtualenv::
|
||||
|
||||
$ deactivate
|
||||
|
||||
.. include:: ../../../watcher_tempest_plugin/README.rst
|
||||
.. _tempest_tests:
|
||||
|
||||
Tempest tests
|
||||
=============
|
||||
|
||||
Tempest tests for Watcher has been migrated to the external repo
|
||||
`watcher-tempest-plugin`_.
|
||||
|
||||
.. _watcher-tempest-plugin: https://github.com/openstack/watcher-tempest-plugin
|
||||
|
||||
@@ -83,7 +83,7 @@ Audit Template
|
||||
Availability Zone
|
||||
=================
|
||||
|
||||
Please, read `the official OpenStack definition of an Availability Zone <http://docs.openstack.org/developer/nova/aggregates.html#availability-zones-azs>`_.
|
||||
Please, read `the official OpenStack definition of an Availability Zone <https://docs.openstack.org/nova/latest/user/aggregates.html#availability-zones-azs>`_.
|
||||
|
||||
.. _cluster_definition:
|
||||
|
||||
@@ -115,15 +115,8 @@ Cluster Data Model (CDM)
|
||||
Controller Node
|
||||
===============
|
||||
|
||||
A controller node is a machine that typically runs the following core OpenStack
|
||||
services:
|
||||
|
||||
- Keystone: for identity and service management
|
||||
- Cinder scheduler: for volumes management
|
||||
- Glance controller: for image management
|
||||
- Neutron controller: for network management
|
||||
- Nova controller: for global compute resources management with services
|
||||
such as nova-scheduler, nova-conductor and nova-network.
|
||||
Please, read `the official OpenStack definition of a Controller Node
|
||||
<https://docs.openstack.org/nova/latest/install/overview.html#controller>`_.
|
||||
|
||||
In many configurations, Watcher will reside on a controller node even if it
|
||||
can potentially be hosted on a dedicated machine.
|
||||
@@ -134,7 +127,7 @@ Compute node
|
||||
============
|
||||
|
||||
Please, read `the official OpenStack definition of a Compute Node
|
||||
<http://docs.openstack.org/ops-guide/arch-compute-nodes.html>`_.
|
||||
<https://docs.openstack.org/nova/latest/install/overview.html#compute>`_.
|
||||
|
||||
.. _customer_definition:
|
||||
|
||||
@@ -167,7 +160,7 @@ Host Aggregate
|
||||
==============
|
||||
|
||||
Please, read `the official OpenStack definition of a Host Aggregate
|
||||
<http://docs.openstack.org/developer/nova/aggregates.html>`_.
|
||||
<https://docs.openstack.org/nova/latest/user/aggregates.html>`_.
|
||||
|
||||
.. _instance_definition:
|
||||
|
||||
@@ -206,18 +199,18 @@ the Watcher system can act on.
|
||||
Here are some examples of
|
||||
:ref:`Managed resource types <managed_resource_definition>`:
|
||||
|
||||
- `Nova Host Aggregates <http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Nova::HostAggregate>`_
|
||||
- `Nova Servers <http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Nova::Server>`_
|
||||
- `Cinder Volumes <http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Cinder::Volume>`_
|
||||
- `Neutron Routers <http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Router>`_
|
||||
- `Neutron Networks <http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Net>`_
|
||||
- `Neutron load-balancers <http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::LoadBalancer>`_
|
||||
- `Sahara Hadoop Cluster <http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Sahara::Cluster>`_
|
||||
- `Nova Host Aggregates <https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Nova::HostAggregate>`_
|
||||
- `Nova Servers <https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Nova::Server>`_
|
||||
- `Cinder Volumes <https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Cinder::Volume>`_
|
||||
- `Neutron Routers <https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Neutron::Router>`_
|
||||
- `Neutron Networks <https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Neutron::Net>`_
|
||||
- `Neutron load-balancers <https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Neutron::LoadBalancer>`_
|
||||
- `Sahara Hadoop Cluster <https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Sahara::Cluster>`_
|
||||
- ...
|
||||
|
||||
It can be any of the `the official list of available resource types defined in
|
||||
It can be any of `the official list of available resource types defined in
|
||||
OpenStack for HEAT
|
||||
<http://docs.openstack.org/developer/heat/template_guide/openstack.html>`_.
|
||||
<https://docs.openstack.org/heat/latest/template_guide/openstack.html>`_.
|
||||
|
||||
.. _efficacy_indicator_definition:
|
||||
|
||||
|
||||
@@ -7,7 +7,9 @@ ONGOING --> FAILED: Something failed while executing\nthe Action Plan in the Wat
|
||||
ONGOING --> SUCCEEDED: The Watcher Applier executed\nthe Action Plan successfully
|
||||
FAILED --> DELETED : Administrator removes\nAction Plan
|
||||
SUCCEEDED --> DELETED : Administrator removes\nAction Plan
|
||||
ONGOING --> CANCELLED : Administrator cancels\nAction Plan
|
||||
ONGOING --> CANCELLING : Administrator cancels\nAction Plan
|
||||
CANCELLING --> CANCELLED : The Watcher Applier cancelled\nthe Action Plan successfully
|
||||
CANCELLING --> FAILED : Something failed while cancelling\nthe Action Plan in the Watcher Applier
|
||||
RECOMMENDED --> CANCELLED : Administrator cancels\nAction Plan
|
||||
RECOMMENDED --> SUPERSEDED : The Watcher Decision Engine supersedes\nAction Plan
|
||||
PENDING --> CANCELLED : Administrator cancels\nAction Plan
|
||||
|
||||
@@ -75,7 +75,7 @@ table(action_plans) {
|
||||
foreign_key("strategy_id : Integer")
|
||||
uuid : String[36]
|
||||
state : String[20], nullable
|
||||
global_efficacy : JSONEncodedDict, nullable
|
||||
global_efficacy : JSONEncodedList, nullable
|
||||
|
||||
created_at : DateTime
|
||||
updated_at : DateTime
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 76 KiB |
@@ -339,6 +339,34 @@
|
||||
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.8,0,0,-0.8,4.8,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="EmptyTriangleInL"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="EmptyTriangleInL-6"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7091-2"
|
||||
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.8,0,0,-0.8,4.8,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="EmptyTriangleInL"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="EmptyTriangleInL-12"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7091-70"
|
||||
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.8,0,0,-0.8,4.8,0)" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:document-units="mm"
|
||||
@@ -348,13 +376,13 @@
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="261.24633"
|
||||
inkscape:cx="665.19215"
|
||||
inkscape:cy="108.90512"
|
||||
inkscape:current-layer="g5356"
|
||||
inkscape:current-layer="g4866-2-3"
|
||||
id="namedview4950"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1215"
|
||||
inkscape:window-height="776"
|
||||
inkscape:window-width="1211"
|
||||
inkscape:window-height="698"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1">
|
||||
@@ -381,6 +409,12 @@
|
||||
<g
|
||||
id="g5356"
|
||||
transform="translate(-15.096057,-107.16694)">
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3284-4-2-3-77-5-9"
|
||||
d="m 813.66791,753.1462 0,-92.21768"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#EmptyTriangleInL-6)" />
|
||||
<rect
|
||||
y="377.8927"
|
||||
x="96.920677"
|
||||
@@ -875,8 +909,8 @@
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5110-9"
|
||||
d="m 472.18905,726.66568 221.85496,0"
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
|
||||
d="m 472.18905,726.66568 331.45651,0"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:1.22230256px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
@@ -919,8 +953,8 @@
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3284-4-2-3-4-6"
|
||||
d="m 540.57926,651.7922 179.16488,0"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.99999999, 1.99999999;stroke-dashoffset:0;marker-start:url(#TriangleInL);display:inline" />
|
||||
d="m 543.75943,651.7922 280.63651,0"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:1.25154257;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.50308524, 2.50308524;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleInL)" />
|
||||
<rect
|
||||
y="262.01205"
|
||||
x="451.89563"
|
||||
@@ -1402,6 +1436,48 @@
|
||||
id="path5110-9-6"
|
||||
d="m 192.18905,726.66568 221.85496,0"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<g
|
||||
id="g4866-2-3"
|
||||
style="display:inline"
|
||||
transform="matrix(1.7775787,0,0,1.7775787,991.15946,596.08131)">
|
||||
<rect
|
||||
style="display:inline;fill:#ffffff;stroke:#000000;stroke-width:0.562563;stroke-opacity:1"
|
||||
id="rect4267-4-7-7-6"
|
||||
width="49.81258"
|
||||
height="24.243191"
|
||||
x="-116.67716"
|
||||
y="88.977051" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:11.73851585px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none"
|
||||
x="-91.899979"
|
||||
y="104.01585"
|
||||
id="text5037-4-6-9-7"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-91.899979"
|
||||
y="104.01585"
|
||||
style="font-size:11.2512598px;text-align:center;text-anchor:middle"
|
||||
id="tspan5184-3-5-5">cinder</tspan></text>
|
||||
</g>
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3284-4-2-3-4-9-3"
|
||||
d="m 824.37881,651.58554 0,102.98987"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.99999999, 1.99999999;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" />
|
||||
<circle
|
||||
r="2.6672709"
|
||||
cy="693.98395"
|
||||
cx="823.72699"
|
||||
id="path13407-89-5"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3284-4-2-3-7-9"
|
||||
d="m 804.16781,752.35205 0,-26.2061"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#EmptyTriangleInL-12)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 64 KiB |
@@ -39,12 +39,12 @@
|
||||
Replace WATCHER_PASS with the password you chose for the watcher user in the Identity service.
|
||||
|
||||
* Watcher interacts with other OpenStack projects via project clients, in order to instantiate these
|
||||
clients, Watcher requests new session from Identity service. In the `[watcher_client_auth]` section,
|
||||
clients, Watcher requests new session from Identity service. In the `[watcher_clients_auth]` section,
|
||||
configure the identity service access to interact with other OpenStack project clients.
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[watcher_client_auth]
|
||||
[watcher_clients_auth]
|
||||
...
|
||||
auth_type = password
|
||||
auth_url = http://controller:35357
|
||||
@@ -56,6 +56,16 @@
|
||||
|
||||
Replace WATCHER_PASS with the password you chose for the watcher user in the Identity service.
|
||||
|
||||
* In the `[api]` section, configure host option.
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[api]
|
||||
...
|
||||
host = controller
|
||||
|
||||
Replace controller with the IP address of the management network interface on your controller node, typically 10.0.0.11 for the first node in the example architecture.
|
||||
|
||||
* In the `[oslo_messaging_notifications]` section, configure the messaging driver.
|
||||
|
||||
.. code-block:: ini
|
||||
@@ -68,4 +78,4 @@
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
su -s /bin/sh -c "watcher-db-manage" watcher
|
||||
su -s /bin/sh -c "watcher-db-manage --config-file /etc/watcher/watcher.conf upgrade"
|
||||
|
||||
@@ -36,4 +36,4 @@ https://docs.openstack.org/watcher/latest/glossary.html
|
||||
|
||||
This chapter assumes a working setup of OpenStack following the
|
||||
`OpenStack Installation Tutorial
|
||||
<https://docs.openstack.org/project-install-guide/ocata/>`_.
|
||||
<https://docs.openstack.org/pike/install/>`_.
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
.. _install-obs:
|
||||
|
||||
|
||||
Install and configure for openSUSE and SUSE Linux Enterprise
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This section describes how to install and configure the Infrastructure
|
||||
Optimization service for openSUSE Leap 42.1 and
|
||||
SUSE Linux Enterprise Server 12 SP1.
|
||||
|
||||
.. include:: common_prerequisites.rst
|
||||
|
||||
Install and configure components
|
||||
--------------------------------
|
||||
|
||||
#. Install the packages:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# zypper --quiet --non-interactive install
|
||||
|
||||
.. include:: common_configure.rst
|
||||
|
||||
|
||||
Finalize installation
|
||||
---------------------
|
||||
|
||||
Start the Infrastructure Optimization services and configure them to start when
|
||||
the system boots:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# systemctl enable openstack-watcher-api.service
|
||||
|
||||
# systemctl start openstack-watcher-api.service
|
||||
@@ -15,6 +15,5 @@ Note that installation and configuration vary by distribution.
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
install-obs.rst
|
||||
install-rdo.rst
|
||||
install-ubuntu.rst
|
||||
|
||||
@@ -6,4 +6,4 @@ Next steps
|
||||
Your OpenStack environment now includes the watcher service.
|
||||
|
||||
To add additional services, see
|
||||
https://docs.openstack.org/project-install-guide/ocata/.
|
||||
https://docs.openstack.org/pike/install/.
|
||||
|
||||
@@ -5,7 +5,7 @@ Basic Offline Server Consolidation
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**display name**: ``basic``
|
||||
**display name**: ``Basic offline consolidation``
|
||||
|
||||
**goal**: ``server_consolidation``
|
||||
|
||||
@@ -26,7 +26,7 @@ metric service name plugins comment
|
||||
``cpu_util`` ceilometer_ none
|
||||
============================ ============ ======= =======
|
||||
|
||||
.. _ceilometer: http://docs.openstack.org/admin-guide/telemetry-measurements.html#openstack-compute
|
||||
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
|
||||
|
||||
Cluster data model
|
||||
******************
|
||||
|
||||
@@ -5,7 +5,7 @@ Outlet Temperature Based Strategy
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**display name**: ``outlet_temperature``
|
||||
**display name**: ``Outlet temperature based strategy``
|
||||
|
||||
**goal**: ``thermal_optimization``
|
||||
|
||||
@@ -33,7 +33,7 @@ metric service name plugins comment
|
||||
``hardware.ipmi.node.outlet_temperature`` ceilometer_ IPMI
|
||||
========================================= ============ ======= =======
|
||||
|
||||
.. _ceilometer: http://docs.openstack.org/admin-guide/telemetry-measurements.html#ipmi-based-meters
|
||||
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#ipmi-based-meters
|
||||
|
||||
Cluster data model
|
||||
******************
|
||||
|
||||
100
doc/source/strategies/saving_energy.rst
Normal file
100
doc/source/strategies/saving_energy.rst
Normal file
@@ -0,0 +1,100 @@
|
||||
======================
|
||||
Saving Energy Strategy
|
||||
======================
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**display name**: ``Saving Energy Strategy``
|
||||
|
||||
**goal**: ``saving_energy``
|
||||
|
||||
.. watcher-term:: watcher.decision_engine.strategy.strategies.saving_energy
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
This feature will use Ironic to do the power on/off actions, therefore
|
||||
this feature requires that the ironic component is configured.
|
||||
And the compute node should be managed by Ironic.
|
||||
|
||||
Ironic installation: https://docs.openstack.org/ironic/latest/install/index.html
|
||||
|
||||
Cluster data model
|
||||
******************
|
||||
|
||||
Default Watcher's Compute cluster data model:
|
||||
|
||||
.. watcher-term:: watcher.decision_engine.model.collector.nova.NovaClusterDataModelCollector
|
||||
|
||||
Actions
|
||||
*******
|
||||
|
||||
.. list-table::
|
||||
:widths: 30 30
|
||||
:header-rows: 1
|
||||
|
||||
* - action
|
||||
- description
|
||||
* - ``change_node_power_state``
|
||||
- .. watcher-term:: watcher.applier.actions.change_node_power_state.ChangeNodePowerState
|
||||
|
||||
Planner
|
||||
*******
|
||||
|
||||
Default Watcher's planner:
|
||||
|
||||
.. watcher-term:: watcher.decision_engine.planner.weight.WeightPlanner
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Strategy parameter is:
|
||||
|
||||
====================== ====== ======= ======================================
|
||||
parameter type default description
|
||||
Value
|
||||
====================== ====== ======= ======================================
|
||||
``free_used_percent`` Number 10.0 a rational number, which describes the
|
||||
the quotient of
|
||||
min_free_hosts_num/nodes_with_VMs_num
|
||||
``min_free_hosts_num`` Int 1 an int number describes minimum free
|
||||
compute nodes
|
||||
====================== ====== ======= ======================================
|
||||
|
||||
|
||||
Efficacy Indicator
|
||||
------------------
|
||||
|
||||
Energy saving strategy efficacy indicator is unclassified.
|
||||
https://github.com/openstack/watcher/blob/master/watcher/decision_engine/goal/goals.py#L215-L218
|
||||
|
||||
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
|
||||
|
||||
How to use it ?
|
||||
---------------
|
||||
step1: Add compute nodes info into ironic node management
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
$ ironic node-create -d pxe_ipmitool -i ipmi_address=10.43.200.184 \
|
||||
ipmi_username=root -i ipmi_password=nomoresecret -e compute_node_id=3
|
||||
|
||||
step 2: Create audit to do optimization
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
$ openstack optimize audittemplate create \
|
||||
at1 saving_energy --strategy saving_energy
|
||||
|
||||
$ openstack optimize audit create -a at1
|
||||
|
||||
External Links
|
||||
--------------
|
||||
|
||||
*Spec URL*
|
||||
http://specs.openstack.org/openstack/watcher-specs/specs/pike/implemented/energy-saving-strategy.html
|
||||
@@ -33,7 +33,7 @@ power ceilometer_ kwapi_ one point every 60s
|
||||
======================= ============ ======= =======
|
||||
|
||||
|
||||
.. _ceilometer: http://docs.openstack.org/admin-guide/telemetry-measurements.html#openstack-compute
|
||||
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
|
||||
.. _monasca: https://github.com/openstack/monasca-agent/blob/master/docs/Libvirt.md
|
||||
.. _kwapi: https://kwapi.readthedocs.io/en/latest/index.html
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Uniform Airflow Migration Strategy
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**display name**: ``uniform_airflow``
|
||||
**display name**: ``Uniform airflow migration strategy``
|
||||
|
||||
**goal**: ``airflow_optimization``
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ VM Workload Consolidation Strategy
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**display name**: ``vm_workload_consolidation``
|
||||
**display name**: ``VM Workload Consolidation Strategy``
|
||||
|
||||
**goal**: ``vm_consolidation``
|
||||
|
||||
@@ -22,7 +22,7 @@ The *vm_workload_consolidation* strategy requires the following metrics:
|
||||
============================ ============ ======= =======
|
||||
metric service name plugins comment
|
||||
============================ ============ ======= =======
|
||||
``memory`` ceilometer_ none
|
||||
``memory`` ceilometer_ none
|
||||
``disk.root.size`` ceilometer_ none
|
||||
============================ ============ ======= =======
|
||||
|
||||
@@ -32,11 +32,11 @@ the strategy if available:
|
||||
============================ ============ ======= =======
|
||||
metric service name plugins comment
|
||||
============================ ============ ======= =======
|
||||
``memory.usage`` ceilometer_ none
|
||||
``memory.resident`` ceilometer_ none
|
||||
``cpu_util`` ceilometer_ none
|
||||
============================ ============ ======= =======
|
||||
|
||||
.. _ceilometer: http://docs.openstack.org/admin-guide/telemetry-measurements.html#openstack-compute
|
||||
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
|
||||
|
||||
Cluster data model
|
||||
******************
|
||||
|
||||
@@ -5,7 +5,7 @@ Watcher Overload standard deviation algorithm
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**display name**: ``workload_stabilization``
|
||||
**display name**: ``Workload stabilization``
|
||||
|
||||
**goal**: ``workload_balancing``
|
||||
|
||||
@@ -28,7 +28,7 @@ metric service name plugins comment
|
||||
``memory.resident`` ceilometer_ none
|
||||
============================ ============ ======= =======
|
||||
|
||||
.. _ceilometer: http://docs.openstack.org/admin-guide/telemetry-measurements.html#openstack-compute
|
||||
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
|
||||
.. _SNMP: http://docs.openstack.org/admin-guide/telemetry-measurements.html
|
||||
|
||||
Cluster data model
|
||||
@@ -100,7 +100,7 @@ parameter type default Value description
|
||||
into which the samples are
|
||||
grouped for aggregation.
|
||||
Watcher uses only the last
|
||||
period of all recieved ones.
|
||||
period of all received ones.
|
||||
==================== ====== ===================== =============================
|
||||
|
||||
.. |metrics| replace:: ["cpu_util", "memory.resident"]
|
||||
|
||||
@@ -5,7 +5,7 @@ Workload Balance Migration Strategy
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
**display name**: ``workload_balance``
|
||||
**display name**: ``Workload Balance Migration Strategy``
|
||||
|
||||
**goal**: ``workload_balancing``
|
||||
|
||||
@@ -25,9 +25,10 @@ The *workload_balance* strategy requires the following metrics:
|
||||
metric service name plugins comment
|
||||
======================= ============ ======= =======
|
||||
``cpu_util`` ceilometer_ none
|
||||
``memory.resident`` ceilometer_ none
|
||||
======================= ============ ======= =======
|
||||
|
||||
.. _ceilometer: http://docs.openstack.org/admin-guide/telemetry-measurements.html#openstack-compute
|
||||
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
|
||||
|
||||
|
||||
Cluster data model
|
||||
@@ -66,6 +67,9 @@ Strategy parameters are:
|
||||
============== ====== ============= ====================================
|
||||
parameter type default Value description
|
||||
============== ====== ============= ====================================
|
||||
``metrics`` String 'cpu_util' Workload balance base on cpu or ram
|
||||
utilization. choice: ['cpu_util',
|
||||
'memory.resident']
|
||||
``threshold`` Number 25.0 Workload threshold for migration
|
||||
``period`` Number 300 Aggregate time period of ceilometer
|
||||
============== ====== ============= ====================================
|
||||
@@ -90,7 +94,7 @@ How to use it ?
|
||||
at1 workload_balancing --strategy workload_balance
|
||||
|
||||
$ openstack optimize audit create -a at1 -p threshold=26.0 \
|
||||
-p period=310
|
||||
-p period=310 -p metrics=cpu_util
|
||||
|
||||
External Links
|
||||
--------------
|
||||
|
||||
@@ -39,10 +39,10 @@ named ``watcher``, or by using the `OpenStack CLI`_ ``openstack``.
|
||||
If you want to deploy Watcher in Horizon, please refer to the `Watcher Horizon
|
||||
plugin installation guide`_.
|
||||
|
||||
.. _`installation guide`: http://docs.openstack.org/developer/python-watcherclient
|
||||
.. _`Watcher Horizon plugin installation guide`: http://docs.openstack.org/developer/watcher-dashboard/deploy/installation.html
|
||||
.. _`OpenStack CLI`: http://docs.openstack.org/developer/python-openstackclient/man/openstack.html
|
||||
.. _`Watcher CLI`: http://docs.openstack.org/developer/python-watcherclient/index.html
|
||||
.. _`installation guide`: https://docs.openstack.org/python-watcherclient/latest
|
||||
.. _`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
|
||||
.. _`Watcher CLI`: https://docs.openstack.org/python-watcherclient/latest/cli/index.html
|
||||
|
||||
Seeing what the Watcher CLI can do ?
|
||||
------------------------------------
|
||||
|
||||
15
playbooks/legacy/watcher-tempest-base-multinode/post.yaml
Normal file
15
playbooks/legacy/watcher-tempest-base-multinode/post.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
- hosts: primary
|
||||
tasks:
|
||||
|
||||
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
|
||||
synchronize:
|
||||
src: '{{ ansible_user_dir }}/workspace/'
|
||||
dest: '{{ zuul.executor.log_root }}'
|
||||
mode: pull
|
||||
copy_links: true
|
||||
verify_host: true
|
||||
rsync_opts:
|
||||
- --include=/logs/**
|
||||
- --include=*/
|
||||
- --exclude=*
|
||||
- --prune-empty-dirs
|
||||
67
playbooks/legacy/watcher-tempest-base-multinode/run.yaml
Normal file
67
playbooks/legacy/watcher-tempest-base-multinode/run.yaml
Normal file
@@ -0,0 +1,67 @@
|
||||
- hosts: primary
|
||||
name: Legacy Watcher tempest base multinode
|
||||
tasks:
|
||||
|
||||
- name: Ensure legacy workspace directory
|
||||
file:
|
||||
path: '{{ ansible_user_dir }}/workspace'
|
||||
state: directory
|
||||
|
||||
- shell:
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
cat > clonemap.yaml << EOF
|
||||
clonemap:
|
||||
- name: openstack-infra/devstack-gate
|
||||
dest: devstack-gate
|
||||
EOF
|
||||
/usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
|
||||
git://git.openstack.org \
|
||||
openstack-infra/devstack-gate
|
||||
executable: /bin/bash
|
||||
chdir: '{{ ansible_user_dir }}/workspace'
|
||||
environment: '{{ zuul | zuul_legacy_vars }}'
|
||||
|
||||
- shell:
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
cat << 'EOF' >>"/tmp/dg-local.conf"
|
||||
[[local|localrc]]
|
||||
TEMPEST_PLUGINS='/opt/stack/new/watcher-tempest-plugin'
|
||||
enable_plugin ceilometer git://git.openstack.org/openstack/ceilometer
|
||||
# Enable watcher devstack plugin.
|
||||
enable_plugin watcher git://git.openstack.org/openstack/watcher
|
||||
|
||||
EOF
|
||||
executable: /bin/bash
|
||||
chdir: '{{ ansible_user_dir }}/workspace'
|
||||
environment: '{{ zuul | zuul_legacy_vars }}'
|
||||
|
||||
- shell:
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
|
||||
export DEVSTACK_SUBNODE_CONFIG=" "
|
||||
export PYTHONUNBUFFERED=true
|
||||
export DEVSTACK_GATE_TEMPEST=1
|
||||
export DEVSTACK_GATE_NEUTRON=1
|
||||
export DEVSTACK_GATE_TOPOLOGY="multinode"
|
||||
export PROJECTS="openstack/watcher $PROJECTS"
|
||||
export PROJECTS="openstack/python-watcherclient $PROJECTS"
|
||||
export PROJECTS="openstack/watcher-tempest-plugin $PROJECTS"
|
||||
|
||||
export DEVSTACK_GATE_TEMPEST_REGEX="watcher_tempest_plugin"
|
||||
|
||||
export BRANCH_OVERRIDE=default
|
||||
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
|
||||
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
|
||||
fi
|
||||
|
||||
cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
|
||||
./safe-devstack-vm-gate-wrap.sh
|
||||
executable: /bin/bash
|
||||
chdir: '{{ ansible_user_dir }}/workspace'
|
||||
environment: '{{ zuul | zuul_legacy_vars }}'
|
||||
80
playbooks/legacy/watcherclient-tempest-functional/post.yaml
Normal file
80
playbooks/legacy/watcherclient-tempest-functional/post.yaml
Normal file
@@ -0,0 +1,80 @@
|
||||
- hosts: primary
|
||||
tasks:
|
||||
|
||||
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
|
||||
synchronize:
|
||||
src: '{{ ansible_user_dir }}/workspace/'
|
||||
dest: '{{ zuul.executor.log_root }}'
|
||||
mode: pull
|
||||
copy_links: true
|
||||
verify_host: true
|
||||
rsync_opts:
|
||||
- --include=**/*nose_results.html
|
||||
- --include=*/
|
||||
- --exclude=*
|
||||
- --prune-empty-dirs
|
||||
|
||||
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
|
||||
synchronize:
|
||||
src: '{{ ansible_user_dir }}/workspace/'
|
||||
dest: '{{ zuul.executor.log_root }}'
|
||||
mode: pull
|
||||
copy_links: true
|
||||
verify_host: true
|
||||
rsync_opts:
|
||||
- --include=**/*testr_results.html.gz
|
||||
- --include=*/
|
||||
- --exclude=*
|
||||
- --prune-empty-dirs
|
||||
|
||||
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
|
||||
synchronize:
|
||||
src: '{{ ansible_user_dir }}/workspace/'
|
||||
dest: '{{ zuul.executor.log_root }}'
|
||||
mode: pull
|
||||
copy_links: true
|
||||
verify_host: true
|
||||
rsync_opts:
|
||||
- --include=/.testrepository/tmp*
|
||||
- --include=*/
|
||||
- --exclude=*
|
||||
- --prune-empty-dirs
|
||||
|
||||
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
|
||||
synchronize:
|
||||
src: '{{ ansible_user_dir }}/workspace/'
|
||||
dest: '{{ zuul.executor.log_root }}'
|
||||
mode: pull
|
||||
copy_links: true
|
||||
verify_host: true
|
||||
rsync_opts:
|
||||
- --include=**/*testrepository.subunit.gz
|
||||
- --include=*/
|
||||
- --exclude=*
|
||||
- --prune-empty-dirs
|
||||
|
||||
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
|
||||
synchronize:
|
||||
src: '{{ ansible_user_dir }}/workspace/'
|
||||
dest: '{{ zuul.executor.log_root }}/tox'
|
||||
mode: pull
|
||||
copy_links: true
|
||||
verify_host: true
|
||||
rsync_opts:
|
||||
- --include=/.tox/*/log/*
|
||||
- --include=*/
|
||||
- --exclude=*
|
||||
- --prune-empty-dirs
|
||||
|
||||
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
|
||||
synchronize:
|
||||
src: '{{ ansible_user_dir }}/workspace/'
|
||||
dest: '{{ zuul.executor.log_root }}'
|
||||
mode: pull
|
||||
copy_links: true
|
||||
verify_host: true
|
||||
rsync_opts:
|
||||
- --include=/logs/**
|
||||
- --include=*/
|
||||
- --exclude=*
|
||||
- --prune-empty-dirs
|
||||
64
playbooks/legacy/watcherclient-tempest-functional/run.yaml
Normal file
64
playbooks/legacy/watcherclient-tempest-functional/run.yaml
Normal file
@@ -0,0 +1,64 @@
|
||||
- hosts: all
|
||||
name: Legacy watcherclient-dsvm-functional
|
||||
tasks:
|
||||
|
||||
- name: Ensure legacy workspace directory
|
||||
file:
|
||||
path: '{{ ansible_user_dir }}/workspace'
|
||||
state: directory
|
||||
|
||||
- shell:
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
cat > clonemap.yaml << EOF
|
||||
clonemap:
|
||||
- name: openstack-infra/devstack-gate
|
||||
dest: devstack-gate
|
||||
EOF
|
||||
/usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
|
||||
git://git.openstack.org \
|
||||
openstack-infra/devstack-gate
|
||||
executable: /bin/bash
|
||||
chdir: '{{ ansible_user_dir }}/workspace'
|
||||
environment: '{{ zuul | zuul_legacy_vars }}'
|
||||
|
||||
- shell:
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
cat << 'EOF' >>"/tmp/dg-local.conf"
|
||||
[[local|localrc]]
|
||||
enable_plugin watcher git://git.openstack.org/openstack/watcher
|
||||
|
||||
EOF
|
||||
executable: /bin/bash
|
||||
chdir: '{{ ansible_user_dir }}/workspace'
|
||||
environment: '{{ zuul | zuul_legacy_vars }}'
|
||||
|
||||
- shell:
|
||||
cmd: |
|
||||
set -e
|
||||
set -x
|
||||
ENABLED_SERVICES=tempest
|
||||
ENABLED_SERVICES+=,watcher-api,watcher-decision-engine,watcher-applier
|
||||
export ENABLED_SERVICES
|
||||
|
||||
export PYTHONUNBUFFERED=true
|
||||
export BRANCH_OVERRIDE=default
|
||||
export PROJECTS="openstack/watcher $PROJECTS"
|
||||
export DEVSTACK_PROJECT_FROM_GIT=python-watcherclient
|
||||
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
|
||||
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
|
||||
fi
|
||||
function post_test_hook {
|
||||
# Configure and run functional tests
|
||||
$BASE/new/python-watcherclient/watcherclient/tests/functional/hooks/post_test_hook.sh
|
||||
}
|
||||
export -f post_test_hook
|
||||
|
||||
cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
|
||||
./safe-devstack-vm-gate-wrap.sh
|
||||
executable: /bin/bash
|
||||
chdir: '{{ ansible_user_dir }}/workspace'
|
||||
environment: '{{ zuul | zuul_legacy_vars }}'
|
||||
@@ -27,16 +27,16 @@ Structure
|
||||
Useful links
|
||||
------------
|
||||
|
||||
* How to install: http://docs.openstack.org/developer/rally/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/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,3 @@
|
||||
---
|
||||
features:
|
||||
- Add notifications related to Action object.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
features:
|
||||
- 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).
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
features:
|
||||
- Added binding between apscheduler job and Watcher decision engine service.
|
||||
It will allow to provide HA support in the future.
|
||||
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,8 @@
|
||||
---
|
||||
features:
|
||||
- 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.
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
features:
|
||||
- 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.
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
features:
|
||||
- Add description property for dynamic action. Admin can see detail information
|
||||
of any specify action.
|
||||
4
releasenotes/notes/gnocchi-watcher-43c25d391fbd3e9c.yaml
Normal file
4
releasenotes/notes/gnocchi-watcher-43c25d391fbd3e9c.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
features:
|
||||
- Added gnocchi support as data source for metrics. Administrator can change
|
||||
data source for each strategy using config file.
|
||||
@@ -0,0 +1,3 @@
|
||||
---
|
||||
features:
|
||||
- Added using of JSONSchema instead of voluptuous to validate Actions.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
features:
|
||||
- Added strategy to identify and migrate a Noisy Neighbor - a low priority VM
|
||||
that negatively affects performance of a high priority VM by over utilizing
|
||||
Last Level Cache.
|
||||
@@ -0,0 +1,3 @@
|
||||
---
|
||||
features:
|
||||
- Add notifications related to Service object.
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
features:
|
||||
- |
|
||||
Added volume migrate action
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
features:
|
||||
- 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.
|
||||
@@ -22,7 +22,8 @@
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
import sys, os
|
||||
import os
|
||||
import sys
|
||||
from watcher import version as watcher_version
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
@@ -56,14 +57,11 @@ master_doc = 'index'
|
||||
project = u'watcher'
|
||||
copyright = u'2016, Watcher developers'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# Release notes are version independent
|
||||
# The short X.Y version.
|
||||
version = watcher_version.version_info.release_string()
|
||||
version = ''
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = watcher_version.version_info.version_string()
|
||||
release = ''
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -21,6 +21,7 @@ Contents:
|
||||
:maxdepth: 1
|
||||
|
||||
unreleased
|
||||
pike
|
||||
ocata
|
||||
newton
|
||||
|
||||
|
||||
207
releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
Normal file
207
releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
Normal file
@@ -0,0 +1,207 @@
|
||||
# Andi Chandler <andi@gowling.com>, 2016. #zanata
|
||||
# Andi Chandler <andi@gowling.com>, 2017. #zanata
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: watcher 1.4.1.dev113\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-10-23 04:03+0000\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"PO-Revision-Date: 2017-10-21 06:22+0000\n"
|
||||
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
|
||||
"Language-Team: English (United Kingdom)\n"
|
||||
"Language: en-GB\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 "0.33.0"
|
||||
msgstr "0.33.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 "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 standardize 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 standardize 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 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 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 decision 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 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 policies to handle user rights to access Watcher API."
|
||||
msgstr "Added policies to handle user rights to access Watcher API."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Contents:"
|
||||
msgstr "Contents:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current Series Release Notes"
|
||||
msgstr "Current Series Release Notes"
|
||||
6
releasenotes/source/pike.rst
Normal file
6
releasenotes/source/pike.rst
Normal file
@@ -0,0 +1,6 @@
|
||||
===================================
|
||||
Pike Series Release Notes
|
||||
===================================
|
||||
|
||||
.. release-notes::
|
||||
:branch: stable/pike
|
||||
@@ -2,48 +2,48 @@
|
||||
# of appearance. Changing the order has an impact on the overall integration
|
||||
# process, which may cause wedges in the gate later.
|
||||
|
||||
apscheduler # MIT License
|
||||
enum34;python_version=='2.7' or python_version=='2.6' or python_version=='3.3' # BSD
|
||||
jsonpatch>=1.1 # BSD
|
||||
keystoneauth1>=3.0.1 # Apache-2.0
|
||||
jsonschema!=2.5.0,<3.0.0,>=2.0.0 # MIT
|
||||
keystonemiddleware>=4.12.0 # Apache-2.0
|
||||
lxml!=3.7.0,>=2.3 # BSD
|
||||
apscheduler>=3.0.5 # MIT License
|
||||
enum34>=1.0.4;python_version=='2.7' or python_version=='2.6' or python_version=='3.3' # BSD
|
||||
jsonpatch!=1.20,>=1.16 # BSD
|
||||
keystoneauth1>=3.3.0 # Apache-2.0
|
||||
jsonschema<3.0.0,>=2.6.0 # MIT
|
||||
keystonemiddleware>=4.17.0 # Apache-2.0
|
||||
lxml!=3.7.0,>=3.4.1 # BSD
|
||||
croniter>=0.3.4 # MIT License
|
||||
oslo.concurrency>=3.8.0 # Apache-2.0
|
||||
oslo.cache>=1.5.0 # Apache-2.0
|
||||
oslo.config!=4.3.0,!=4.4.0,>=4.0.0 # Apache-2.0
|
||||
oslo.context>=2.14.0 # Apache-2.0
|
||||
oslo.db>=4.24.0 # Apache-2.0
|
||||
oslo.i18n!=3.15.2,>=2.1.0 # Apache-2.0
|
||||
oslo.log>=3.22.0 # Apache-2.0
|
||||
oslo.messaging!=5.25.0,>=5.24.2 # Apache-2.0
|
||||
oslo.concurrency>=3.20.0 # Apache-2.0
|
||||
oslo.cache>=1.26.0 # Apache-2.0
|
||||
oslo.config>=5.1.0 # Apache-2.0
|
||||
oslo.context>=2.19.2 # Apache-2.0
|
||||
oslo.db>=4.27.0 # Apache-2.0
|
||||
oslo.i18n>=3.15.3 # Apache-2.0
|
||||
oslo.log>=3.30.0 # Apache-2.0
|
||||
oslo.messaging>=5.29.0 # Apache-2.0
|
||||
oslo.policy>=1.23.0 # Apache-2.0
|
||||
oslo.reports>=0.6.0 # Apache-2.0
|
||||
oslo.serialization!=2.19.1,>=1.10.0 # Apache-2.0
|
||||
oslo.service>=1.10.0 # Apache-2.0
|
||||
oslo.utils>=3.20.0 # Apache-2.0
|
||||
oslo.versionedobjects>=1.17.0 # Apache-2.0
|
||||
oslo.reports>=1.18.0 # Apache-2.0
|
||||
oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
|
||||
oslo.service>=1.24.0 # Apache-2.0
|
||||
oslo.utils>=3.31.0 # Apache-2.0
|
||||
oslo.versionedobjects>=1.28.0 # Apache-2.0
|
||||
PasteDeploy>=1.5.0 # MIT
|
||||
pbr!=2.1.0,>=2.0.0 # Apache-2.0
|
||||
pecan!=1.0.2,!=1.0.3,!=1.0.4,!=1.2,>=1.0.0 # BSD
|
||||
PrettyTable<0.8,>=0.7.1 # BSD
|
||||
voluptuous>=0.8.9 # BSD License
|
||||
gnocchiclient>=2.7.0 # Apache-2.0
|
||||
gnocchiclient>=3.3.1 # Apache-2.0
|
||||
python-ceilometerclient>=2.5.0 # Apache-2.0
|
||||
python-cinderclient>=3.0.0 # Apache-2.0
|
||||
python-glanceclient>=2.7.0 # Apache-2.0
|
||||
python-cinderclient>=3.2.0 # Apache-2.0
|
||||
python-glanceclient>=2.8.0 # Apache-2.0
|
||||
python-keystoneclient>=3.8.0 # Apache-2.0
|
||||
python-monascaclient>=1.1.0 # Apache-2.0
|
||||
python-monascaclient>=1.7.0 # Apache-2.0
|
||||
python-neutronclient>=6.3.0 # Apache-2.0
|
||||
python-novaclient>=9.0.0 # Apache-2.0
|
||||
python-openstackclient!=3.10.0,>=3.3.0 # Apache-2.0
|
||||
python-novaclient>=9.1.0 # Apache-2.0
|
||||
python-openstackclient>=3.12.0 # Apache-2.0
|
||||
python-ironicclient>=1.14.0 # Apache-2.0
|
||||
six>=1.9.0 # MIT
|
||||
six>=1.10.0 # MIT
|
||||
SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT
|
||||
stevedore>=1.20.0 # Apache-2.0
|
||||
taskflow>=2.7.0 # Apache-2.0
|
||||
WebOb>=1.7.1 # MIT
|
||||
WSME>=0.8 # MIT
|
||||
networkx>=1.10 # BSD
|
||||
WSME>=0.8.0 # MIT
|
||||
networkx<2.0,>=1.10 # BSD
|
||||
|
||||
|
||||
10
setup.cfg
10
setup.cfg
@@ -21,7 +21,6 @@ classifier =
|
||||
[files]
|
||||
packages =
|
||||
watcher
|
||||
watcher_tempest_plugin
|
||||
data_files =
|
||||
etc/ = etc/*
|
||||
|
||||
@@ -40,9 +39,6 @@ console_scripts =
|
||||
watcher-applier = watcher.cmd.applier:main
|
||||
watcher-sync = watcher.cmd.sync:main
|
||||
|
||||
tempest.test_plugins =
|
||||
watcher_tests = watcher_tempest_plugin.plugin:WatcherTempestPlugin
|
||||
|
||||
watcher.database.migration_backend =
|
||||
sqlalchemy = watcher.db.sqlalchemy.migration
|
||||
|
||||
@@ -54,6 +50,7 @@ watcher_goals =
|
||||
workload_balancing = watcher.decision_engine.goal.goals:WorkloadBalancing
|
||||
airflow_optimization = watcher.decision_engine.goal.goals:AirflowOptimization
|
||||
noisy_neighbor = watcher.decision_engine.goal.goals:NoisyNeighborOptimization
|
||||
saving_energy = watcher.decision_engine.goal.goals:SavingEnergy
|
||||
|
||||
watcher_scoring_engines =
|
||||
dummy_scorer = watcher.decision_engine.scoring.dummy_scorer:DummyScorer
|
||||
@@ -65,8 +62,10 @@ watcher_strategies =
|
||||
dummy = watcher.decision_engine.strategy.strategies.dummy_strategy:DummyStrategy
|
||||
dummy_with_scorer = watcher.decision_engine.strategy.strategies.dummy_with_scorer:DummyWithScorer
|
||||
dummy_with_resize = watcher.decision_engine.strategy.strategies.dummy_with_resize:DummyWithResize
|
||||
actuator = watcher.decision_engine.strategy.strategies.actuation:Actuator
|
||||
basic = watcher.decision_engine.strategy.strategies.basic_consolidation:BasicConsolidation
|
||||
outlet_temperature = watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl
|
||||
saving_energy = watcher.decision_engine.strategy.strategies.saving_energy:SavingEnergy
|
||||
vm_workload_consolidation = watcher.decision_engine.strategy.strategies.vm_workload_consolidation:VMWorkloadConsolidation
|
||||
workload_stabilization = watcher.decision_engine.strategy.strategies.workload_stabilization:WorkloadStabilization
|
||||
workload_balance = watcher.decision_engine.strategy.strategies.workload_balance:WorkloadBalance
|
||||
@@ -80,6 +79,7 @@ watcher_actions =
|
||||
change_nova_service_state = watcher.applier.actions.change_nova_service_state:ChangeNovaServiceState
|
||||
resize = watcher.applier.actions.resize:Resize
|
||||
change_node_power_state = watcher.applier.actions.change_node_power_state:ChangeNodePowerState
|
||||
volume_migrate = watcher.applier.actions.volume_migration:VolumeMigrate
|
||||
|
||||
watcher_workflow_engines =
|
||||
taskflow = watcher.applier.workflow_engine.default:DefaultWorkFlowEngine
|
||||
@@ -94,13 +94,11 @@ watcher_cluster_data_model_collectors =
|
||||
|
||||
|
||||
[pbr]
|
||||
warnerrors = true
|
||||
autodoc_index_modules = true
|
||||
autodoc_exclude_modules =
|
||||
watcher.db.sqlalchemy.alembic.env
|
||||
watcher.db.sqlalchemy.alembic.versions.*
|
||||
watcher.tests.*
|
||||
watcher_tempest_plugin.*
|
||||
watcher.doc
|
||||
|
||||
|
||||
|
||||
@@ -3,25 +3,24 @@
|
||||
# process, which may cause wedges in the gate later.
|
||||
|
||||
coverage!=4.4,>=4.0 # Apache-2.0
|
||||
doc8 # Apache-2.0
|
||||
doc8>=0.6.0 # Apache-2.0
|
||||
freezegun>=0.3.6 # Apache-2.0
|
||||
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
|
||||
mock>=2.0 # BSD
|
||||
mock>=2.0.0 # BSD
|
||||
oslotest>=1.10.0 # Apache-2.0
|
||||
os-testr>=0.8.0 # Apache-2.0
|
||||
python-subunit>=0.0.18 # Apache-2.0/BSD
|
||||
os-testr>=1.0.0 # Apache-2.0
|
||||
testrepository>=0.0.18 # Apache-2.0/BSD
|
||||
testscenarios>=0.4 # Apache-2.0/BSD
|
||||
testtools>=1.4.0 # MIT
|
||||
testtools>=2.2.0 # MIT
|
||||
|
||||
# Doc requirements
|
||||
openstackdocstheme>=1.11.0 # Apache-2.0
|
||||
openstackdocstheme>=1.17.0 # Apache-2.0
|
||||
sphinx>=1.6.2 # BSD
|
||||
sphinxcontrib-pecanwsme>=0.8 # Apache-2.0
|
||||
sphinxcontrib-pecanwsme>=0.8.0 # Apache-2.0
|
||||
|
||||
|
||||
# releasenotes
|
||||
reno!=2.3.1,>=1.8.0 # Apache-2.0
|
||||
reno>=2.5.0 # Apache-2.0
|
||||
|
||||
# bandit
|
||||
bandit>=1.1.0 # Apache-2.0
|
||||
|
||||
3
tox.ini
3
tox.ini
@@ -14,7 +14,7 @@ deps = -r{toxinidir}/test-requirements.txt
|
||||
commands =
|
||||
rm -f .testrepository/times.dbm
|
||||
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
|
||||
|
||||
[testenv:pep8]
|
||||
@@ -47,6 +47,7 @@ commands =
|
||||
oslo-config-generator --config-file etc/watcher/oslo-config-generator/watcher.conf
|
||||
|
||||
[flake8]
|
||||
filename = *.py,app.wsgi
|
||||
show-source=True
|
||||
ignore= H105,E123,E226,N320,H202
|
||||
builtins= _
|
||||
|
||||
@@ -37,4 +37,3 @@ LOG.debug("Configuration:")
|
||||
CONF.log_opt_values(LOG, log.DEBUG)
|
||||
|
||||
application = app.VersionSelectorApplication()
|
||||
|
||||
|
||||
@@ -118,6 +118,9 @@ class Action(base.APIBase):
|
||||
action_type = wtypes.text
|
||||
"""Action type"""
|
||||
|
||||
description = wtypes.text
|
||||
"""Action description"""
|
||||
|
||||
input_parameters = types.jsontype
|
||||
"""One or more key/value pairs """
|
||||
|
||||
@@ -141,6 +144,7 @@ class Action(base.APIBase):
|
||||
setattr(self, field, kwargs.get(field, wtypes.Unset))
|
||||
|
||||
self.fields.append('action_plan_id')
|
||||
self.fields.append('description')
|
||||
setattr(self, 'action_plan_uuid', kwargs.get('action_plan_id',
|
||||
wtypes.Unset))
|
||||
|
||||
@@ -162,6 +166,14 @@ class Action(base.APIBase):
|
||||
@classmethod
|
||||
def convert_with_links(cls, action, expand=True):
|
||||
action = Action(**action.as_dict())
|
||||
try:
|
||||
obj_action_desc = objects.ActionDescription.get_by_type(
|
||||
pecan.request.context, action.action_type)
|
||||
description = obj_action_desc.description
|
||||
except exception.ActionDescriptionNotFound:
|
||||
description = ""
|
||||
setattr(action, 'description', description)
|
||||
|
||||
return cls._convert_with_links(action, pecan.request.host_url, expand)
|
||||
|
||||
@classmethod
|
||||
|
||||
@@ -52,6 +52,8 @@ from watcher import objects
|
||||
|
||||
class AuditPostType(wtypes.Base):
|
||||
|
||||
name = wtypes.wsattr(wtypes.text, mandatory=False)
|
||||
|
||||
audit_template_uuid = wtypes.wsattr(types.uuid, mandatory=False)
|
||||
|
||||
goal = wtypes.wsattr(wtypes.text, mandatory=False)
|
||||
@@ -111,7 +113,25 @@ class AuditPostType(wtypes.Base):
|
||||
setattr(self, k, at_attr)
|
||||
except AttributeError:
|
||||
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())
|
||||
|
||||
return Audit(
|
||||
name=self.name,
|
||||
audit_type=self.audit_type,
|
||||
parameters=self.parameters,
|
||||
goal_id=self.goal,
|
||||
@@ -233,6 +253,9 @@ class Audit(base.APIBase):
|
||||
uuid = types.uuid
|
||||
"""Unique UUID for this audit"""
|
||||
|
||||
name = wtypes.text
|
||||
"""Name of this audit"""
|
||||
|
||||
audit_type = wtypes.text
|
||||
"""Type of this audit"""
|
||||
|
||||
@@ -301,7 +324,7 @@ class Audit(base.APIBase):
|
||||
@staticmethod
|
||||
def _convert_with_links(audit, url, expand=True):
|
||||
if not expand:
|
||||
audit.unset_fields_except(['uuid', 'audit_type', 'state',
|
||||
audit.unset_fields_except(['uuid', 'name', 'audit_type', 'state',
|
||||
'goal_uuid', 'interval', 'scope',
|
||||
'strategy_uuid', 'goal_name',
|
||||
'strategy_name', 'auto_trigger',
|
||||
@@ -324,6 +347,7 @@ class Audit(base.APIBase):
|
||||
@classmethod
|
||||
def sample(cls, expand=True):
|
||||
sample = cls(uuid='27e3153e-d5bf-4b7e-b517-fb518e17f34c',
|
||||
name='My Audit',
|
||||
audit_type='ONESHOT',
|
||||
state='PENDING',
|
||||
created_at=datetime.datetime.utcnow(),
|
||||
@@ -483,17 +507,17 @@ class AuditsController(rest.RestController):
|
||||
resource_url,
|
||||
goal=goal)
|
||||
|
||||
@wsme_pecan.wsexpose(Audit, types.uuid)
|
||||
def get_one(self, audit_uuid):
|
||||
@wsme_pecan.wsexpose(Audit, wtypes.text)
|
||||
def get_one(self, audit):
|
||||
"""Retrieve information about the given audit.
|
||||
|
||||
:param audit_uuid: UUID of a audit.
|
||||
:param audit_uuid: UUID or name of an audit.
|
||||
"""
|
||||
if self.from_audits:
|
||||
raise exception.OperationNotPermitted
|
||||
|
||||
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')
|
||||
|
||||
return Audit.convert_with_links(rpc_audit)
|
||||
@@ -551,11 +575,11 @@ class AuditsController(rest.RestController):
|
||||
return Audit.convert_with_links(new_audit)
|
||||
|
||||
@wsme.validate(types.uuid, [AuditPatchType])
|
||||
@wsme_pecan.wsexpose(Audit, types.uuid, body=[AuditPatchType])
|
||||
def patch(self, audit_uuid, patch):
|
||||
@wsme_pecan.wsexpose(Audit, wtypes.text, body=[AuditPatchType])
|
||||
def patch(self, audit, patch):
|
||||
"""Update an existing audit.
|
||||
|
||||
:param audit_uuid: UUID of a audit.
|
||||
:param auditd: UUID or name of a audit.
|
||||
:param patch: a json PATCH document to apply to this audit.
|
||||
"""
|
||||
if self.from_audits:
|
||||
@@ -563,7 +587,7 @@ class AuditsController(rest.RestController):
|
||||
|
||||
context = pecan.request.context
|
||||
audit_to_update = api_utils.get_resource(
|
||||
'Audit', audit_uuid, eager=True)
|
||||
'Audit', audit, eager=True)
|
||||
policy.enforce(context, 'audit:update', audit_to_update,
|
||||
action='audit:update')
|
||||
|
||||
@@ -600,15 +624,15 @@ class AuditsController(rest.RestController):
|
||||
audit_to_update.save()
|
||||
return Audit.convert_with_links(audit_to_update)
|
||||
|
||||
@wsme_pecan.wsexpose(None, types.uuid, status_code=204)
|
||||
def delete(self, audit_uuid):
|
||||
"""Delete a audit.
|
||||
@wsme_pecan.wsexpose(None, wtypes.text, status_code=204)
|
||||
def delete(self, audit):
|
||||
"""Delete an audit.
|
||||
|
||||
:param audit_uuid: UUID of a audit.
|
||||
:param audit: UUID or name of an audit.
|
||||
"""
|
||||
context = pecan.request.context
|
||||
audit_to_delete = api_utils.get_resource(
|
||||
'Audit', audit_uuid, eager=True)
|
||||
'Audit', audit, eager=True)
|
||||
policy.enforce(context, 'audit:update', audit_to_delete,
|
||||
action='audit:update')
|
||||
|
||||
|
||||
@@ -51,6 +51,8 @@ import wsme
|
||||
from wsme import types as wtypes
|
||||
import wsmeext.pecan as wsme_pecan
|
||||
|
||||
from oslo_log import log
|
||||
|
||||
from watcher._i18n import _
|
||||
from watcher.api.controllers import base
|
||||
from watcher.api.controllers import link
|
||||
@@ -61,9 +63,11 @@ from watcher.common import context as context_utils
|
||||
from watcher.common import exception
|
||||
from watcher.common import policy
|
||||
from watcher.common import utils as common_utils
|
||||
from watcher.decision_engine.scope import default
|
||||
from watcher.decision_engine.loading import default as default_loading
|
||||
from watcher import objects
|
||||
|
||||
LOG = log.getLogger(__name__)
|
||||
|
||||
|
||||
class AuditTemplatePostType(wtypes.Base):
|
||||
_ctx = context_utils.make_context()
|
||||
@@ -94,6 +98,27 @@ class AuditTemplatePostType(wtypes.Base):
|
||||
scope=self.scope,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _build_schema():
|
||||
SCHEMA = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": AuditTemplatePostType._get_schemas(),
|
||||
"additionalProperties": False
|
||||
}
|
||||
}
|
||||
return SCHEMA
|
||||
|
||||
@staticmethod
|
||||
def _get_schemas():
|
||||
collectors = default_loading.ClusterDataModelCollectorLoader(
|
||||
).list_available()
|
||||
schemas = {k: c.SCHEMA for k, c
|
||||
in collectors.items() if hasattr(c, "SCHEMA")}
|
||||
return schemas
|
||||
|
||||
@staticmethod
|
||||
def validate(audit_template):
|
||||
available_goals = objects.Goal.list(AuditTemplatePostType._ctx)
|
||||
@@ -106,23 +131,25 @@ class AuditTemplatePostType(wtypes.Base):
|
||||
else:
|
||||
raise exception.InvalidGoal(goal=audit_template.goal)
|
||||
|
||||
common_utils.Draft4Validator(
|
||||
default.DefaultScope.DEFAULT_SCHEMA).validate(audit_template.scope)
|
||||
if audit_template.scope:
|
||||
common_utils.Draft4Validator(
|
||||
AuditTemplatePostType._build_schema()
|
||||
).validate(audit_template.scope)
|
||||
|
||||
include_host_aggregates = False
|
||||
exclude_host_aggregates = False
|
||||
for rule in audit_template.scope:
|
||||
if 'host_aggregates' in rule:
|
||||
include_host_aggregates = True
|
||||
elif 'exclude' in rule:
|
||||
for resource in rule['exclude']:
|
||||
if 'host_aggregates' in resource:
|
||||
exclude_host_aggregates = True
|
||||
if include_host_aggregates and exclude_host_aggregates:
|
||||
raise exception.Invalid(
|
||||
message=_(
|
||||
"host_aggregates can't be "
|
||||
"included and excluded together"))
|
||||
include_host_aggregates = False
|
||||
exclude_host_aggregates = False
|
||||
for rule in audit_template.scope[0]['compute']:
|
||||
if 'host_aggregates' in rule:
|
||||
include_host_aggregates = True
|
||||
elif 'exclude' in rule:
|
||||
for resource in rule['exclude']:
|
||||
if 'host_aggregates' in resource:
|
||||
exclude_host_aggregates = True
|
||||
if include_host_aggregates and exclude_host_aggregates:
|
||||
raise exception.Invalid(
|
||||
message=_(
|
||||
"host_aggregates can't be "
|
||||
"included and excluded together"))
|
||||
|
||||
if audit_template.strategy:
|
||||
available_strategies = objects.Strategy.list(
|
||||
@@ -448,7 +475,7 @@ class AuditTemplatesController(rest.RestController):
|
||||
sort_key, sort_dir, expand=False,
|
||||
resource_url=None):
|
||||
api_utils.validate_search_filters(
|
||||
filters, list(objects.audit_template.AuditTemplate.fields.keys()) +
|
||||
filters, list(objects.audit_template.AuditTemplate.fields) +
|
||||
["goal_uuid", "goal_name", "strategy_uuid", "strategy_name"])
|
||||
limit = api_utils.validate_limit(limit)
|
||||
api_utils.validate_sort_dir(sort_dir)
|
||||
|
||||
@@ -170,7 +170,7 @@ class GoalsController(rest.RestController):
|
||||
limit = api_utils.validate_limit(limit)
|
||||
api_utils.validate_sort_dir(sort_dir)
|
||||
|
||||
sort_db_key = (sort_key if sort_key in objects.Goal.fields.keys()
|
||||
sort_db_key = (sort_key if sort_key in objects.Goal.fields
|
||||
else None)
|
||||
|
||||
marker_obj = None
|
||||
|
||||
@@ -104,7 +104,7 @@ class Service(base.APIBase):
|
||||
def __init__(self, **kwargs):
|
||||
super(Service, self).__init__()
|
||||
|
||||
fields = list(objects.Service.fields.keys()) + ['status']
|
||||
fields = list(objects.Service.fields) + ['status']
|
||||
self.fields = []
|
||||
for field in fields:
|
||||
self.fields.append(field)
|
||||
@@ -194,7 +194,7 @@ class ServicesController(rest.RestController):
|
||||
limit = api_utils.validate_limit(limit)
|
||||
api_utils.validate_sort_dir(sort_dir)
|
||||
|
||||
sort_db_key = (sort_key if sort_key in objects.Service.fields.keys()
|
||||
sort_db_key = (sort_key if sort_key in objects.Service.fields
|
||||
else None)
|
||||
|
||||
marker_obj = None
|
||||
|
||||
@@ -210,12 +210,12 @@ class StrategiesController(rest.RestController):
|
||||
def _get_strategies_collection(self, filters, marker, limit, sort_key,
|
||||
sort_dir, expand=False, resource_url=None):
|
||||
api_utils.validate_search_filters(
|
||||
filters, list(objects.strategy.Strategy.fields.keys()) +
|
||||
filters, list(objects.strategy.Strategy.fields) +
|
||||
["goal_uuid", "goal_name"])
|
||||
limit = api_utils.validate_limit(limit)
|
||||
api_utils.validate_sort_dir(sort_dir)
|
||||
|
||||
sort_db_key = (sort_key if sort_key in objects.Strategy.fields.keys()
|
||||
sort_db_key = (sort_key if sort_key in objects.Strategy.fields
|
||||
else None)
|
||||
|
||||
marker_obj = None
|
||||
|
||||
@@ -57,7 +57,7 @@ def validate_sort_dir(sort_dir):
|
||||
def validate_search_filters(filters, allowed_fields):
|
||||
# Very lightweight validation for now
|
||||
# todo: improve this (e.g. https://www.parse.com/docs/rest/guide/#queries)
|
||||
for filter_name in filters.keys():
|
||||
for filter_name in filters:
|
||||
if filter_name not in allowed_fields:
|
||||
raise wsme.exc.ClientSideError(
|
||||
_("Invalid filter: %s") % filter_name)
|
||||
|
||||
@@ -52,8 +52,8 @@ class AuthTokenMiddleware(auth_token.AuthProtocol):
|
||||
# The information whether the API call is being performed against the
|
||||
# public API is required for some other components. Saving it to the
|
||||
# WSGI environment is reasonable thereby.
|
||||
env['is_public_api'] = any(map(lambda pattern: re.match(pattern, path),
|
||||
self.public_api_routes))
|
||||
env['is_public_api'] = any(re.match(pattern, path)
|
||||
for pattern in self.public_api_routes)
|
||||
|
||||
if env['is_public_api']:
|
||||
return self._app(env, start_response)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user