Compare commits

..

181 Commits
1.4.1 ... 1.6.0

Author SHA1 Message Date
Zuul
c2e16bfa96 Merge "listen to 'compute.instance.resize.confirm.end' event" 2017-12-08 03:11:54 +00:00
Zuul
13644429b7 Merge "Fix migrate action with migration_type 'cold'" 2017-12-07 13:15:28 +00:00
Zuul
b8cc506fbe Merge "Updated from global requirements" 2017-12-07 05:06:45 +00:00
licanwei
c91f6479f0 Server with PAUSE status can also live-migrate
Closes-Bug: #1728477
Change-Id: I39a2672df842b62177fd0c4dbec7b92b398cfb96
2017-12-06 02:02:44 +00:00
Hidekazu Nakamura
92572c5dec Fix migrate action with migration_type 'cold'
Migration action with migration_type 'cold' does not work.
This patch fixes nova_helper to follow Pike release python-novaclient.

Change-Id: I0637cefad68cd4b7077a5d3e6b5db5562e7f2917
Closes-Bug: #1736624
2017-12-06 09:39:30 +09:00
OpenStack Proposal Bot
a8f08065fd Updated from global requirements
Change-Id: I2171946082a8a9daf7e5edc20bfe0c8cb084768f
2017-12-05 16:58:02 +00:00
Zuul
0745d904fc Merge "Notifications Changes Multiple Global Efficacy" 2017-12-01 09:26:17 +00:00
Zuul
bc4a58d2d7 Merge "Make gnocchi as default datasource" 2017-12-01 09:08:57 +00:00
Alexander Chadin
f14795d29f Make gnocchi as default datasource
This patch set follows deprecation steps
and changes default datasource to gnocchi

Closes-Bug: #1735180
Change-Id: I3b7ec47af7707359373a424a6469d28cbf9ce177
2017-12-01 08:21:44 +00:00
Zuul
e0104074b6 Merge "Updated from global requirements" 2017-11-30 14:04:55 +00:00
Zuul
2993dea376 Merge "extend-node-status" 2017-11-29 13:35:54 +00:00
Zuul
17b6019ea9 Merge "Fix Bug Unable to get scoped data model" 2017-11-29 10:06:17 +00:00
OpenStack Proposal Bot
5969e5b52a Updated from global requirements
Change-Id: Idc1a12df6d888880ff7858cff18cc1972920204d
2017-11-29 09:26:19 +00:00
aditi
e55f3793b6 Fix Bug Unable to get scoped data model
This patch removes 'audit_scope' from __init__ of
BaseClusterDataModelCollector class, as it is a singleton class
and cannot be instantiate more than once.

A new method is defined in BaseClusterDataModelCollector in place
of property audit_scope_handler, which takes audit_scope as
argument.

Change-Id: I0664c151d71a711c118d43c180d8b0760b1c81fa
Closes-Bug: #1732849
2017-11-28 10:24:15 +00:00
suzhengwei
901c598dd7 listen to 'compute.instance.resize.confirm.end' event
In one integrated cloud env, there would be many solutions, which would
make the compute resource strongly relocated. Watcher should listen to
all the notifications which represent the compute resource changes, to
update compute CDM. If not, the compute CDM will be stale, Watcher
couldn't work steadily and harmoniously.

Change-Id: I57173f0cce0717aa36c5ff758d972d38013e3ef8
Implements:blueprint listen-all-necessary-notifications
2017-11-27 17:20:49 +08:00
aditi
e41a90d7ad Notifications Changes Multiple Global Efficacy
This patch adds notfication changes after changing the type
of global_efficacy in ActionPlan objects.

Change-Id: I1116cf1d19e4b19e19789f943a631d0400871766
Partially-Implements: blueprint multiple-global-efficacy-indicator
2017-11-27 14:47:02 +05:30
Zuul
051b4fcd06 Merge "Remove setting of version/release from releasenotes" 2017-11-22 12:15:57 +00:00
Zuul
cd045400ed Merge "Can't cancell CONTINUOUS audit" 2017-11-22 06:57:50 +00:00
Zuul
2db668af30 Merge "Add app.wsgi to target of pep8" 2017-11-20 08:35:00 +00:00
Zuul
39b1fcf07f Merge "[Doc] Fix ubuntu version in devstack installation" 2017-11-20 01:09:46 +00:00
chao liu
94babf61da Add app.wsgi to target of pep8
The app.wsgi file should be adjusted to meet pep8 standards and
apply pep8 check to app.wsgi automatically.

Change-Id: I34ec9ce56a329ede76d3d69f6e973d66350d85d1
2017-11-18 09:41:37 +00:00
Hidekazu Nakamura
a5fba7ce28 [Doc] Fix ubuntu version in devstack installation
This patch updates ubuntu version from 14.04 to 16.04
in devstack installation.

Change-Id: Icf096dd8f3fc366567f9cde329987c4f9f02ad48
2017-11-17 13:25:34 +09:00
aditi
24e01b6c98 Remove setting of version/release from releasenotes
Release notes are version independent, so remove version/release
values.
see the discussion [1] and patch [2]
[1] http://lists.openstack.org/pipermail/openstack-dev/2017-November/124480.html
[2] https://review.openstack.org/#/c/520748/

Change-Id: I2c76dc467e1b722531ba71fb589594ae9fcc88d3
2017-11-17 11:33:20 +09:00
OpenStack Proposal Bot
4007f93aac Updated from global requirements
Change-Id: I9be5c9b8b858f5d5d555da5c02337885ecfa901d
2017-11-16 11:31:33 +00:00
OpenStack Proposal Bot
77c9f88fc4 Updated from global requirements
Change-Id: Iccd6926b31e04e4a24fbd6bf68692bd840c66f7f
2017-11-13 22:00:07 +00:00
Zuul
e9b7f067c5 Merge "Migrate to Zuul v3" 2017-11-10 08:27:28 +00:00
Zuul
f8aa02c4a7 Merge "Multiple global efficacy" 2017-11-10 08:21:26 +00:00
Alexander Chadin
3595108e49 Migrate to Zuul v3
This patch does step 1 in the docs: Move Legacy Jobs to Projects.

Partial-Implements: blueprint migrate-to-zuulv3
Change-Id: I0c0713260c2dfa2ba64a5746c342db01c1bc3d75
2017-11-09 11:51:13 +03:00
Hidekazu Nakamura
d536ed248b Fix test runner config issues with os-testr 1.0.0
The os-testr 1.0.0 release had a couple of required config changes due
to it's internal usage of stestr. This commit fixes those by adding a
.stestr.conf (to remove a warning) sets the fixture env variables in
the tox.ini instead of being hidden in .testr.conf and removing the
quotes around posargs to make passing args to ostestr actually work.
Also to keep the expected dev experience stestr is used directly for
places where ostestr was called directly.

Change-Id: I785b0dc1720328b119f0978aa573ad0b89e54c75
Closes-Bug: #1731155
2017-11-09 17:31:39 +09:00
aditi
71730c0eaf Multiple global efficacy
This patch update the global efficacy for server consolidation
strategy, test cases and general format.

Change-Id: I62af1e4be415998669f938b3d587c1ccf4293419
Implements: blueprint multiple-global-efficacy-indicator
2017-11-09 14:51:17 +09:00
Vu Cong Tuan
1b4c5dfc8b Do not use “-y” for package install
According to "code conventions" [1], do not use "-y" option.
Instead, use apt-get install package, yum install package,
or zypper install package.

[1] https://docs.openstack.org/doc-contrib-guide/writing-style/
code-conventions.html

Change-Id: I174c8a0c653e322bbf951d72445b1a43251baa7e
2017-11-08 16:13:30 +07:00
Zuul
4179cfd036 Merge "check task_state in the live_migrate_instance" 2017-11-08 01:50:38 +00:00
Zuul
49550db566 Merge "Change HTTP to HTTPS" 2017-11-08 01:43:26 +00:00
Zuul
e0eba0ee7b Merge "Update doc and add release note about cdm-scoping" 2017-11-07 02:36:38 +00:00
licanwei
165853ee2c check task_state in the live_migrate_instance
If server migration fails, the while loop will not break
until retry to 0,
we can check the task_state to avoid this situation.

Closes-Bug: #1728476
Change-Id: I07e1048eb736263a261456ee78c96fee9db13cb5
2017-11-05 20:04:45 -08:00
XieYingYun
0a7152fa55 Change HTTP to HTTPS
Use https instead of http to ensure the safety without containing our
account/password information

Change-Id: I2e4f120f1d57c6c666d65a9a279eddefd112bf23
2017-11-05 20:20:46 -07:00
OpenStack Proposal Bot
6c29df11ca Updated from global requirements
Change-Id: I691bd81b1b9933211faa336b1ac49aa5a1a7bf17
2017-11-06 02:07:12 +00:00
licanwei
55bd0fd038 Can't cancell CONTINUOUS audit
If scheduler uses db job store, the self.scheduler is None
beacuse execute_audit is class method.
We get [] from self.scheduler.get_jobs()
and can't remove the cancelled audit.

Change-Id: I1768c847465bbefbc9794281328edb07fea83b03
Closes-Bug: #1726345
2017-11-02 21:05:41 -07:00
suzhengwei
907cc2df16 add name for audit, update audit notifications
upgrade notifications

Change-Id: Ia8b7f36a8a2965bc8ec2243a10556592926297b2
Implements:blueprint add-name-for-audit
2017-11-01 10:39:43 +08:00
Hidekazu Nakamura
8dcac1597b Update doc and add release note about cdm-scoping
This patch updates document and add release note for cdm-scoping.

Change-Id: I8e9099aa5caf6bf17ea912e7b1a600af3b6d519d
Partially-Implements: blueprint cdm-scoping
2017-10-31 10:01:52 +09:00
Zuul
a3be1587e3 Merge "Update the useful links for Rally job" 2017-10-30 03:13:09 +00:00
Zuul
aa72f984e4 Merge "add name for audit, changes for watcher api/db" 2017-10-30 02:11:26 +00:00
caoyuan
bcd2040025 Update the useful links for Rally job
Change-Id: I1d6463701f9e3d99c261e8738ba0291c32632947
2017-10-30 00:32:50 +00:00
Zuul
f2c9dc9c32 Merge "update API ref doc for ScoringEngine" 2017-10-27 03:33:55 +00:00
Zuul
6c94c235fc Merge "Fix the strategy path of outlet_temp_control.py" 2017-10-26 02:30:20 +00:00
Zuul
7ed45e3ef1 Merge "Add cdm-scoping" 2017-10-25 13:52:10 +00:00
aditi
8722951022 update API ref doc for ScoringEngine
Change-Id: Icdfff4659d280a30768aebc0e8f161a699ffd793
Closes-Bug: #1726646
2017-10-24 14:16:19 +09:00
caoyuan
568d4e831c Fix the strategy path of outlet_temp_control.py
1. fix the path of outlet_temp_control.py
2. remove the unnecessary noqa

Change-Id: Ieb33776baeaa936faf940d9886ffed8ec30e91b3
2017-10-24 01:29:17 +00:00
Zuul
deefc857ba Merge "Optimize the link address" 2017-10-24 00:25:52 +00:00
Zuul
d33736e7f0 Merge "Imported Translations from Zanata" 2017-10-24 00:21:44 +00:00
Zuul
1b1779cc49 Merge "Fix a typo" 2017-10-24 00:21:43 +00:00
Zuul
d727bc3076 Merge "Unify the oslo_log import usage" 2017-10-24 00:21:43 +00:00
Zuul
875b7e1ca3 Merge "Optimise indentation for db client" 2017-10-24 00:21:42 +00:00
Zuul
c7f8755f9c Merge "Correct the schema format" 2017-10-24 00:20:55 +00:00
zhengwei6082
0472715e0c Optimize the link address
Use https instead of http to ensure the safety without containing our
account/password information

Change-Id: I16bdf6067fba4ea841071100d68edae7750946de
2017-10-23 07:03:41 +00:00
OpenStack Proposal Bot
2482e82548 Imported Translations from Zanata
For more information about this automatic import see:
https://docs.openstack.org/i18n/latest/reviewing-translation-import.html

Change-Id: I73cd252d637f890ed4ba1ea9abe06d5c47917a86
2017-10-23 06:17:23 +00:00
Zuul
e9c420467e Merge "Optimize check_migrated in cinder_helper.py" 2017-10-23 03:53:17 +00:00
Zuul
2d5db7082b Merge "Optimize live_migrate_instance" 2017-10-23 03:53:17 +00:00
caoyuan
4a3a50435a Fix a typo
Update the "peformance" to "performance"

Change-Id: Ief94893db2a3d6d83d865cfe2aa45f524309ff8d
2017-10-21 14:54:16 +08:00
caoyuan
05b57fee7a Unify the oslo_log import usage
In watcher project, some py file use "from oslo_log import log as logging"
for import, but more use "from oslo_log import log"
like https://github.com/openstack/watcher/blob/master/watcher/decision_engine/strategy/strategies/dummy_strategy.py#L19
this patch to unify it.

Change-Id: I9c667bb202bebc7942d1af5ce438375285c2e2ba
2017-10-21 06:32:59 +00:00
caoyuan
3729e39552 Optimise indentation for db client
Optimise indentation for db client, just like the others:
https://github.com/openstack/watcher/blob/master/watcher/conf/nova_client.py#L22

Change-Id: Icfbd4f26ce048fe3c3db430d95795fb0e58b7161
2017-10-21 13:55:47 +08:00
caoyuan
91911c8284 Correct the schema format
refer to https://github.com/openstack/watcher/blob/master/watcher/applier/actions/migration.py#L46

Change-Id: I2da8585ce978034fc9a79c2a0cf7bfb6eed487e2
2017-10-21 13:03:01 +08:00
suzhengwei
d7d56cbd79 add name for audit, changes for watcher api/db
Change-Id: Ibe04f5375d741d15999fde6faf767f15311c6351
Implements:blueprint add-name-for-audit
2017-10-20 14:17:20 +08:00
caoyuan
84fb7423f1 Update the nova api_version default value to 2.53
the api_version has been update, so the doc should change the default
value

refer to https://github.com/openstack/watcher/blob/master/watcher/conf/nova_client.py#L26

Change-Id: I9717294d43203315d0593a4fee8c2ff2caf6f0d0
2017-10-17 14:40:59 +08:00
caoyuan
ee5b01d33b Correct the instance migration link
1. Update the instance migration link
2. remove the unnecessary install-guide link

configure and install Ceilometer by
https://docs.openstack.org/ceilometer/latest is enough
remove the other link.

Change-Id: I2bf408de1023750a3d1f2c9e25293649d99ac428
2017-10-17 10:07:55 +08:00
Zuul
b35feb5432 Merge "optimize update_audit_state" 2017-10-17 01:19:31 +00:00
licanwei
d722b62b97 Optimize check_migrated in cinder_helper.py
There are more than one 'migrating' status in the volume migration.
Others include starting, completing and so on.
So we should check the final status 'success' and 'error'.

Change-Id: I8ee9330aa32ec4516f2bf9e046ea68a72bc8a53d
2017-10-16 00:55:55 -07:00
licanwei
bf713ac7e1 Optimize live_migrate_instance
https://github.com/openstack/python-novaclient/blob/
master/novaclient/v2/servers.py#L468
From nova api version 2.25(Mitaka release), the default value of
block_migration is None which is mapped to 'auto'.
So we can remove 'block_migration' from live_migrate_instance.

Change-Id: I75a581d3146824b1146e2acf5a7fbe4f8368a4e8
2017-10-15 20:22:13 -07:00
Jenkins
8343f4bf46 Merge "Add documentation about saving energy strategy" 2017-10-13 06:51:13 +00:00
Jenkins
cd3f792eef Merge "Invoke version_string in watcher/version.py directly" 2017-10-13 04:51:43 +00:00
Jenkins
7f7f7a9fd2 Merge "Add saving energy strategy description" 2017-10-13 04:50:00 +00:00
Jenkins
d5b778b730 Merge "Fix _build_instance_node for building Compute CDM" 2017-10-13 04:05:56 +00:00
Jenkins
62a902df7c Merge "Fix the telemetry-measurements hyperlink for strategies" 2017-10-13 02:52:06 +00:00
Jenkins
5b6f65630d Merge "Update OpenStack Installation Tutorial to pike" 2017-10-13 02:23:52 +00:00
OpenStack Proposal Bot
e5031ef04a Updated from global requirements
Change-Id: I973ef2867d95fe4f70a43c9015f7571188dc13cd
2017-10-12 22:07:21 +00:00
Jenkins
ab2408ea67 Merge "writing convention: do not use “-y” for package install" 2017-10-12 07:04:58 +00:00
Yumeng_Bao
4c0d2ab4b2 Add saving energy strategy description
Change-Id: Id99d48bd2ca2a2539366d8dc1f7627d7eb472a10
2017-10-12 11:39:02 +08:00
Yumeng_Bao
cf8d7bb2f4 Add documentation about saving energy strategy
Change-Id: I9746239c83ea7bff364ad6939e4174748be2d299
Closes-Bug: #1713402
2017-10-11 14:24:30 +08:00
Jenkins
b3d60cb13d Merge "Optimize the import format by pep8" 2017-10-10 14:33:45 +00:00
Jenkins
ffdc3b554d Merge "Remove explicitly enable neutron" 2017-10-10 13:21:35 +00:00
Jenkins
9933d61065 Merge "Fix Action 'change_node_power_state' FAILED" 2017-10-10 13:19:15 +00:00
Jenkins
b4bc1599e6 Merge "Fix TypeError in function chunkify" 2017-10-10 13:17:26 +00:00
Jenkins
280188a762 Merge "Remove installation guide for openSUSE and SLES" 2017-10-10 13:14:41 +00:00
Jenkins
3942f44e56 Merge "Notification Cancel Action Plan" 2017-10-10 13:12:02 +00:00
Jenkins
6208caba0c Merge "Fix action plan state change when action failed" 2017-10-10 12:06:07 +00:00
Jenkins
f3b3e82313 Merge "Remove the unnecessary word" 2017-10-10 11:02:37 +00:00
zhuzeyu
be69ebd8bd Invoke version_string in watcher/version.py directly
There is already define version_string in version.py
So we don't need generate version in other files, just call it.

Change-Id: I7d8294860523eedad92e213ad00569829e120c39
2017-10-10 11:00:26 +00:00
Hidekazu Nakamura
7d33bf8813 Fix _build_instance_node for building Compute CDM
As of Nova API microversion 2.47, response of GET /servers/detail has flavor
which contains a subset of the actual flavor information used to create the
server instance, represented as a nested dictionary.

Since current watcher nova default api version is 2.53(Pike), This patch
follows the API response change.

Change-Id: Ia575950f0702afa1d093f03ca8ddedd3c410b7de
Closes-Bug: #1722462
2017-10-10 17:21:05 +09:00
zhengwei6082
b3fa8a0f86 writing convention: do not use “-y” for package install
Adhering to coding conventions. Refer to ``Code conventions`` at
https://docs.openstack.org/contributor-guide/ for details.

Change-Id: Ic8b166e17ab0d1cbbf2bb6b831f5e53cae6797ba
2017-10-10 06:13:52 +00:00
caoyuan
9d3cc28d2d Update OpenStack Installation Tutorial to pike
Since the pike is release, OpenStack Installation Tutorial should
update to pike

Change-Id: I565f721cb2acbc692c790707ef6b0d167d6a7b09
2017-10-10 10:37:45 +08:00
aditi
eed2e128b0 Remove explicitly enable neutron
This patch removes, explicitly enabled neutron from local.conf
as devstack now default uses neutron

Change-Id: Icf6bd944dd2262ff23cbcceb762a9ba80f471dbb
2017-10-10 01:59:46 +00:00
caoyuan
7091fe435f Fix the telemetry-measurements hyperlink for strategies
Change-Id: Ie38950967665bdc81eb75f54bc1b3b0a4630fe65
2017-10-09 10:41:54 +08:00
licanwei
7f9b562bbd optimize update_audit_state
save state only if the state is different with audit.state

Change-Id: Ida5156f2e63be55e8dd7de452965270c007ab4ab
2017-10-07 00:59:42 -07:00
caoyuan
f445fc451e Optimize the import format by pep8
Change-Id: Ic96759df51f5572fb6047df4b38bb411ecba8e20
2017-10-05 22:34:13 +08:00
Jenkins
fa7749ac8f Merge "Use Property setters" 2017-10-05 04:21:05 +00:00
Zuul
e6c06c1bdf Merge "Add exception log when migrate action failed" 2017-10-03 17:06:20 +00:00
caoyuan
f461b8c567 Remove the unnecessary word
Change-Id: I7f76f89ae17ffdacde421509dda29b7b7d3f5a4a
2017-10-03 21:06:27 +08:00
LiXiangyu
c717be12a6 Fix TypeError in function chunkify
This patch fixes TypeError of range() in function chunkify, as
range() integer step argument expected, but got str.

Change-Id: I2acde859e014baa4c4c59caa6f4ea938c7c4c3bf
2017-10-02 12:25:20 +00:00
Hidekazu Nakamura
5814914aef Fix action plan state change when action failed
Since default workflow engine action container do_execute method
does not raise exception when action failed, workflow engine action
container execute method never raise exception and
action plan state becomes always SUCCEEDED.

This patch fixes default workflow engine action container do_execute
method to raise exception when action does not return True.

Change-Id: I7eeef69dbdfb5d40e3cf0b1004cbfe199a16bf7b
Closes-Bug: #1719793
2017-10-02 07:09:17 +00:00
Hidekazu Nakamura
fb3c2355a6 Remove installation guide for openSUSE and SLES
Since packages for openSUSE and SLES are not provided,
this patch removes installation guide for openSUSE and SLES.

Change-Id: Ic15d8c4b262e935c7acaef41e18960d0b259d5c9
Closes-Bug: #1715032
2017-10-02 13:52:29 +09:00
aditi
d4e6e82dd2 Notification Cancel Action Plan
This patch adds Notifications for cancel action plan
operation.

Change-Id: I5a89a80729349e3db43ca35ff9fbe8579e86b3b1
Implements: blueprint notifications-actionplan-cancel
2017-09-29 14:44:30 +09:00
Hidekazu Nakamura
816765374d Fix migrate action failure
disk_over_commit flag was removed in Nova API microversion 2.25(Mitaka).

Since current watcher nova default api version is 2.53(Pike),
this patch removes disk_over_commit flag.

Change-Id: Ib141505b9e8cb41997b29c1762e387b1f84f5143
Closes-Bug: #1720054
2017-09-28 14:06:07 +09:00
Hidekazu Nakamura
35e502f666 Add exception log when migrate action failed
As of now we can not know what was happend when migrate action
failed critically.
This patch adds exception log when migrate action failed critically.

Change-Id: I54d0bc54ee1df6f13754771775c58255f53f5008
2017-09-28 11:56:29 +09:00
Jenkins
ee36bb8180 Merge "[Doc] Fix host option" 2017-09-28 02:06:09 +00:00
Hidekazu Nakamura
51b3a15c90 Add cdm-scoping
This patch implements cdm-scoping.
Scoping yaml file is the following:

- compute:
  - availability_zones:
    - name: nova
  - host_aggregates:
    - id: 1
    - name: agg
  - exclude:
    - compute_nodes:
      - name: w012

Change-Id: I44e00218e90c5b08b397b2a9d7fed7c195f6dc55
Partially-Implements: blueprint cdm-scoping
2017-09-27 17:39:24 +09:00
Jenkins
0213bee63b Merge "Fix Watcher DB schema creation" 2017-09-27 08:36:31 +00:00
Alexander Chadin
f516a9c3b9 [Doc] Fix host option
Change-Id: I599856d2d02396f02f91ac4a607520ff60d7b033
2017-09-27 08:10:44 +00:00
aditi
8e89d5489c Use Property setters
At various places in watcher code, we are using property getters
to set property, in this way the property setters defined are
never used, this patch fixes to use property setters to set
property.

Change-Id: Idb274887f383523cea39277b166ec9b46ebcda85
2017-09-27 10:43:43 +09:00
Jenkins
773b20a05f Merge "cleanup test-requirements" 2017-09-26 00:09:48 +00:00
Jenkins
03d6580819 Merge "Update the description for controller node" 2017-09-25 11:08:48 +00:00
Jenkins
afa73238c4 Merge "Update the "IAAS" to "IaaS"" 2017-09-25 10:54:50 +00:00
caoyuan
2467780f9d Update the description for controller node
1. change the controller node description to link
2. correct the link for compute node

Change-Id: Idfdde7f01c38a26dc4962e94431a760a0ed51f82
2017-09-25 03:21:44 +00:00
OpenStack Proposal Bot
25854aabd8 Updated from global requirements
Change-Id: I86b2ed25f98f022597d58335461efc9e0ff61b26
2017-09-24 12:31:19 +00:00
melissaml
e4f4588e69 cleanup test-requirements
python-subunit is not used directly anywhere
and it is dependency of both testrepository
and os-testr
(probably was used by some tox wrapper script before)

Change-Id: I89279430554bc522817c4e2685afef0d95c641dd
2017-09-24 04:40:32 +08:00
caoyuan
1465aa0c5f Update the "IAAS" to "IaaS"
Infrastructure-as-a-Service should short for IaaS

Change-Id: I845fed0c4a1f073dbdea1e8f0e9cdc1655aa3622
2017-09-21 16:38:30 +08:00
caoyuan
e6e0b3dbaa Correct the link for watcher cli
Change-Id: Ic844804278af3abdf5bbb05ea5ef9a1c630da628
2017-09-20 22:17:18 +08:00
Jenkins
d8274e062e Merge "Update the documentation link for doc migration" 2017-09-19 00:06:20 +00:00
lingyongxu
28b9766693 Update the documentation link for doc migration
This patch is proposed according to the Direction 10 of doc
migration(https://etherpad.openstack.org/p/doc-migration-tracking).

Change-Id: I4eb594115e350e28f9136f7003692a1ec0abfcf6
2017-09-18 09:19:33 +00:00
suzhengwei
74bc31e562 extend-node-status
add 'disabled_reason' filed into 'ComputeNode' resource, to distinguish
which nodes are disabled by Watcher and which are not by Watcher.

Implements:blueprint extend-node-status

Change-Id: I7175f14870834a4582e45309529d7e8d9fbb2e6f
2017-09-18 14:27:58 +08:00
OpenStack Proposal Bot
998e86f6c7 Updated from global requirements
Change-Id: I464b3573c2dbab3d97efbec0280298b0331a3cef
2017-09-16 23:26:49 +00:00
Alexander Chadin
a5e7fd90c2 Fix Watcher DB schema creation
This patch set replaces create_schema with upgrade to fix
apscheduler creation issue. It also fixes pep8 warnings to
d09a5945e4a0_add_action_description_table.py

Change-Id: Ica842d585ee3a9cd67e45eb1d7bb1916573d7c9c
2017-09-15 15:30:38 +03:00
Jenkins
a99a9ae69e Merge "Utils: fix usage of strtime" 2017-09-14 07:28:24 +00:00
licanwei
6e6e5907ee Fix Action 'change_node_power_state' FAILED
The return value of ironic_client.node.set_power_state is None, so it's
useless to return the result.
We should check the node state until it's changed or timeout.

Change-Id: I31f75a2c4a721ce4481e6ae7fb83d154a443dad9
Closes-Bug: #1713655
2017-09-13 23:59:35 -07:00
Jenkins
c887499b4d Merge "Fix incorrect config section name of configure doc" 2017-09-14 02:47:17 +00:00
Jenkins
58e4bf2727 Merge "Remove redundant right parenthesis" 2017-09-14 02:44:43 +00:00
OpenStack Proposal Bot
1df395d31d Updated from global requirements
Change-Id: I52665af336d0a0c765d034368a554005505cf30a
2017-09-14 00:11:17 +00:00
Jenkins
f811c8af48 Merge "Remove the unused rootwrap config" 2017-09-13 15:50:59 +00:00
Jenkins
e447393f18 Merge "iso8601.is8601.Utc No Longer Exists" 2017-09-13 13:13:59 +00:00
gaozx
a25be6498c Fix incorrect config section name of configure doc
Change-Id: I3d1e602f3a4beace516c56979b3b21b5683c1b0a
2017-09-13 16:38:50 +08:00
Jenkins
8e372ee153 Merge "Update the documentation link for doc migration" 2017-09-13 07:41:06 +00:00
aditi
7bc984b84a Fix Gate Failure
This Patch fixes gate failure, encountered in recent version
of oslo_messaging.

Change-Id: I6d8ab882a7c157dcf4f78c805a4ce2d9b1fa3f14
Closes-Bug: #1716476
2017-09-12 16:30:22 +09:00
gaozx
eeee32ad36 Remove redundant right parenthesis
Change-Id: Ibdb295d8d5ff8e49b0bebdb71c9c856f49c3881e
2017-09-11 09:48:42 +08:00
chenghuiyu
3a7fc7a8e5 Utils: fix usage of strtime
As oslo_utils.timeutils.strtime() is deprecated in
version '1.6', and will be removed in a future version.

For more informations:
https://docs.openstack.org/oslo.utils/latest/reference/timeutils.html

Change-Id: I1aca257fbe8b08c3478c5da9639835033b19144a
Partial-Bug: #1715325
2017-09-07 16:56:01 +08:00
zhengwei6082
63697d5a6e Update the documentation link for doc migration
This patch is proposed according to the direction 10 of doc
migration(https://etherpad.openstack.org/p/doc-migration-tracking).

Change-Id: Idf2f369fb68c19efa54a06731bb33dc6fa949790
2017-09-07 09:56:40 +08:00
Sampath Priyankara
887fa746ae iso8601.is8601.Utc No Longer Exists
iso8601.UTC is correct datetime UTC field object.
iso8601 >= 0.1.12 includes only iso8601.UTC for python3
while both UTC and Utc() for python2. Less then 0.1.12
included both UTC and Utc() for both python2/3.

Change-Id: I0f8796fba6725eea013b3f8d9ad33c10a402c524
Closes-Bug: #1715486
2017-09-07 10:42:05 +09:00
Jenkins
e74095da1f Merge "Remove unused efficacy indicators" 2017-09-06 09:50:55 +00:00
zhurong
65c7cd0e02 Remove the unused rootwrap config
Watcher doesn't use rootwrap, but have the rootwrap config.
So remove the unused rootwrap config.

Change-Id: Icc32fc958ca8deb08d7b0e5404cbbe19b3ae98c7
2017-09-06 14:46:09 +08:00
Hidekazu Nakamura
5df54ea3fb Remove unused efficacy indicators
AverageCpuLoad and MigrationEfficacy efficacy indicators are not used.
This patch removes unused indicators.

Change-Id: I2b21defd442c135d26f8fd45f6faf9f67c770bde
2017-09-06 12:05:25 +09:00
Yaguo Zhou
51dba60e01 Replace DbMigrationError with DBMigrationError
because DbMigrationError is deprecated

Change-Id: I75ef338d2e22924997804632d26ae3588c4f719b
2017-09-05 23:31:05 +08:00
Jenkins
a9f33467fb Merge "Replace default gnocchi endpoint type" 2017-09-05 10:48:43 +00:00
Jenkins
4640d88adf Merge "Fix DEFAULT_SCHEMA to validate host_aggreates" 2017-09-05 08:45:35 +00:00
zhengwei6082
154aca3948 Replace default gnocchi endpoint type
The default gnocchi endpoint type is publicURL in gnocchiclient.
This patch replaces default gnocchi endpoint type from
internalURL to publicURL
see https://github.com/openstack/keystoneauth/blob/master/keystoneauth1/adapter.py#L347-L351

Change-Id: I0ba2bde46de3025964affe23ef16cce9e5b4670f
2017-09-05 02:11:42 +00:00
Jenkins
fa7afc89ab Merge "Updated from global requirements" 2017-09-04 08:30:54 +00:00
Jenkins
790548fff0 Merge "Modify display_name in strategy documentation" 2017-09-04 08:28:21 +00:00
Hidekazu Nakamura
a2fa13c8ff Fix gnocchiclient creation
Gnocchiclient uses keystoneauth1.adapter so that adapter_options
need to be given.
This patch fixes gnocchiclient creation.

Change-Id: I6b5d8ee775929f4b3fd30be3321b378d19085547
Closes-Bug: #1714871
2017-09-04 14:52:11 +09:00
Hidekazu Nakamura
4c3c84dee9 Fix DEFAULT_SCHEMA to validate host_aggreates
Audit scope JSON schema should restrict key of host_aggregates
to "id" or "name", but that is not working now.
This patch fixes DEFAULT_SCHEMA to validate host_aggregates.

Change-Id: Iea42da41d61435780e247736599a56c026f47914
Closes-Bug: #1714448
2017-09-04 09:50:49 +09:00
OpenStack Proposal Bot
8f585c3def Updated from global requirements
Change-Id: If2d709b80f1783a5b14c9eda4d15da13c9ba5234
2017-09-02 12:15:38 +00:00
Jenkins
c9a43d8da4 Merge "Update default Nova API version to 2.53(Pike)" 2017-09-02 09:00:07 +00:00
Jenkins
2ea7d61ac8 Merge "Restrict existing strategies to their default scope" 2017-09-02 09:00:02 +00:00
Yumeng_Bao
bbfd6711fc Modify display_name in strategy documentation
Display_name in documentation of each strategy should be like[1].
[1]:https://github.com/openstack/watcher/blob/master/watcher/decision_engine/strategy/strategies/workload_balance.py#L143

Change-Id: I31b16dbb81d824e0189fcf96ea7f6e57a289e59a
2017-09-01 14:48:23 +08:00
shangxiaobj
162aaa75ee [Trivialfix]Fix typos in watcher
Fix the typos in watcher.

Change-Id: I3ab77e2a1f862d3790065de4a6ff6c3ef42f226d
2017-08-31 20:47:57 -07:00
suzhengwei
4cb2b45e3a Restrict existing strategies to their default scope
Diffrent stratege has diffrent default scope, restrict them to their
default scope will avoid usage problems.
1)workload_balancing/thermal_optimization/airflow_optimization goals
  react on enabled nodes, so restrict default scope to compute nodes
  with up state and enabled status.
2)server_consolidation goal react on enabled or disabled nodes, So
  restrict default scope to compute nodes with up state and
  enabled/disabled status.

Change-Id: I7437dee699ee2d3dd227a047196d4d8db811b81e
Closes-Bug: #1714002
2017-09-01 11:21:35 +08:00
Jenkins
50935af15f Merge "Fix to use . to source script files" 2017-09-01 01:31:39 +00:00
Hidekazu Nakamura
cf92ece936 Update default Nova API version to 2.53(Pike)
Services are now identified by uuid instead of database id to ensure
uniqueness across cells.
GET /os-services returns a uuid in the id field of the response
from API microversion 2.53(maximum in Pike)

This patch set updates default Nova API version to 2.53.

Change-Id: Ib9fefb794eda3c9e75c6a2f5cfdb0e682b8955f3
Closes-Bug: #1709544
2017-08-30 14:39:31 +09:00
zhengwei6082
b7c4a0467c Fix to use . to source script files
Adhering to coding conventions. Refer to ``Code conventions`` at
https://docs.openstack.org/contributor-guide/ for details.

Change-Id: I54b93214c0e718465a0ea4ebe063061ef7d6e4b2
2017-08-29 18:01:09 +08:00
Jenkins
c12f132699 Merge "Remove unnecessary dict.keys() method calls (api)" 2017-08-29 06:30:49 +00:00
melissaml
0329dafec9 Fix to use "." to source script files
Adhering to coding conventions. Refer to ``Code conventions`` at
https://docs.openstack.org/contributor-guide/ for details.

Change-Id: I23ff70c9caefc870b3cc9d61cd8c18b534f2ffaf
2017-08-29 02:32:28 +08:00
zhengwei6082
e73ead4807 Update the documentation link for doc migration
Change-Id: If429e5023a252d9b86b227488f73cac863b3c658
2017-08-25 16:58:31 +08:00
Jenkins
cb90f60cc1 Merge "Updated from global requirements" 2017-08-25 06:23:39 +00:00
Jenkins
d7994a2466 Merge "Fix KeyError exception" 2017-08-24 12:40:32 +00:00
OpenStack Proposal Bot
62822fa933 Updated from global requirements
Change-Id: I31aaf37bf1ea73c26d9578abe167b43a24bb6c96
2017-08-24 11:51:24 +00:00
Jenkins
3f0ff1ed7e Merge "Updated from global requirements" 2017-08-24 10:09:43 +00:00
Jenkins
8e3b5c90a6 Merge "Remove watcher_tempest_plugin" 2017-08-24 10:09:24 +00:00
OpenStack Proposal Bot
1c5e254124 Updated from global requirements
Change-Id: I48a42877f8157873f4ea376c72d170d978d5e090
2017-08-24 06:03:14 +00:00
Viktor Varga
39e200e5eb Remove unnecessary dict.keys() method calls (api)
Since iter(dict) is equivalent to iter(dict.keys()), it is unnecessary
to call the keys() method of a dict, the dictionary itself is enough
to be referenced. The shorter form is also considered to be more
Pythonic.

This patch removes the unnecessary dict.keys() method calls in api.
This is a part of a larger patch series that removes dict.keys()
method calls.

TrivialFix

Change-Id: I29000f1f05b90d70109fa01393e97e1ebf450c63
2017-08-23 12:51:54 +02:00
Jenkins
2650b89fe5 Merge "Update the documention for doc migration" 2017-08-22 10:10:33 +00:00
zhengwei6082
d5bcd37478 Update the documention for doc migration
Change-Id: I22dc18e6f2f7471f5c804d4d19c631f81a6e196b
2017-08-22 09:06:06 +00:00
Alexander Chadin
0c4b439c5e Remove watcher_tempest_plugin
In accordance with Queens global goal[1], this patch set
removes watcher tempest plugin from watcher repository since
it is stored as independent repository[2]. Jenkins job
gate-watcher-dsvm-multinode-ubuntu-xenial-nv has been modified,
it uses watcher-tempest-plugin repo now.

[1]: https://governance.openstack.org/tc/goals/queens/split-tempest-plugins.html
[2]: http://git.openstack.org/cgit/openstack/watcher-tempest-plugin/

Change-Id: I4d1207fbd73ee2519a6d40342f5fd3c5d3ee8bc7
2017-08-21 17:41:56 +03:00
OpenStack Proposal Bot
0e43504e44 Updated from global requirements
Change-Id: Idd00808c17ecbca5925f91ea2f1257d097af7892
2017-08-18 11:45:04 +00:00
licanwei
322843b21c Fix KeyError exception
During the strategy sync process,
if goal_id can't be found in the goals table,
will throw a KeyError exception.

Change-Id: I62800ac5c69f4f5c7820908f2e777094a51a5541
Closes-Bug: #1711086
2017-08-17 04:25:53 -07:00
Jenkins
1b413f5536 Merge "Remove pbr warnerrors" 2017-08-17 03:07:46 +00:00
Alexander Chadin
f76a628d1f Remove pbr warnerrors
This change removes the now unused "warnerrors" setting,
which is replaced by "warning-is-error" in sphinx
releases >= 1.5 [1].

[1] http://lists.openstack.org/pipermail/openstack-dev/2017-March/113085.html

Change-Id: I32f078169668be08737e47cd15edbdfba42904dc
2017-08-16 11:54:24 +03:00
Jenkins
3e6ea71cbc Merge "Adjust the action state judgment logic" 2017-08-15 09:10:53 +00:00
Jenkins
e5c3df0c2f Merge "workload balance base on cpu or ram util" 2017-08-15 08:37:58 +00:00
Jenkins
6005d6ebdd Merge "Fix gnocchi repository URL in local.conf.controller" 2017-08-14 09:14:54 +00:00
licanwei
965af1b6fd Adjust the action state judgment logic
Only when True is returned, the action state is set to SUCCEEDED
some actions(such as migrate) will return None if exception raised

Change-Id: I52e7a1ffb68f54594f2b00d9843e8e0a4c985667
2017-08-14 02:12:35 -07:00
Jenkins
daf428ad69 Merge "Removed unnecessary setUp calls in tests" 2017-08-11 09:15:01 +00:00
OpenStack Release Bot
ab64dab646 Update reno for stable/pike
Change-Id: I1c1c855b80ad10e343d1c34e17ed11d8255e9fea
2017-08-11 01:09:58 +00:00
suzhengwei
5c86a54d20 workload balance base on cpu or ram util
By the input parameter "metrics", it makes decision to migrate a VM
base on cpu or memory utilization.

Change-Id: I35cce3495c8dacad64ea6c6ee71082a85e9e0a83
2017-08-09 07:04:10 +00:00
Hidekazu Nakamura
5cc4716a95 Fix gnocchi repository URL in local.conf.controller
This patch set updates gnocchi repository URL in local.conf.controller
bacause it moved from under openstack to their own repository.

Change-Id: I53c6efcb40b26f83bc1867564b9067ae5f50938d
2017-08-04 09:23:02 +09:00
Gábor Antal
b532355232 Removed unnecessary setUp calls in tests
TrivialFix

Change-Id: I057d03466b058a42be8ec57dbc42cbd67b75cc3c
2017-08-01 10:50:34 +02:00
231 changed files with 2673 additions and 4164 deletions

1
.gitignore vendored
View File

@@ -24,6 +24,7 @@ pip-log.txt
.coverage*
.tox
nosetests.xml
.stestr/
.testrepository
.venv
.idea

View File

@@ -2,4 +2,3 @@
host=review.openstack.org
port=29418
project=openstack/watcher.git
defaultbranch=stable/pike

4
.stestr.conf Normal file
View File

@@ -0,0 +1,4 @@
[DEFAULT]
test_path=${OS_TEST_PATH:-./watcher/tests}
top_dir=./

39
.zuul.yaml Normal file
View 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

View File

@@ -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,6 +35,7 @@ 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

View File

@@ -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)

View File

@@ -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}

View 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"
}

View 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"
}

View 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"
}

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View 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"
}

View 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"
}

View 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"
}

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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"
}
},

View File

@@ -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",

View File

@@ -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",

View File

@@ -2,6 +2,7 @@
"priority": "INFO",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -2,6 +2,7 @@
"priority": "INFO",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -2,6 +2,7 @@
"priority": "INFO",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -2,6 +2,7 @@
"priority": "ERROR",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -2,6 +2,7 @@
"priority": "INFO",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -2,6 +2,7 @@
"priority": "INFO",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -2,6 +2,7 @@
"priority": "ERROR",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -2,6 +2,7 @@
"priority": "INFO",
"payload": {
"watcher_object.data": {
"name": "my_audit",
"audit_type": "ONESHOT",
"parameters": {
"para2": "hello",

View File

@@ -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",

View File

@@ -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"]

View File

@@ -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:

View File

@@ -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.

View File

@@ -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.']

View File

@@ -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.

View File

@@ -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

View File

@@ -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::

View File

@@ -4,7 +4,7 @@
https://creativecommons.org/licenses/by/3.0/
.. _watcher_developement_environment:
.. _watcher_development_environment:
=========================================
Set up a development environment manually
@@ -69,8 +69,8 @@ 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
@@ -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/

View File

@@ -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

View File

@@ -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 []

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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 --config-file /etc/watcher/watcher.conf create_schema"
su -s /bin/sh -c "watcher-db-manage --config-file /etc/watcher/watcher.conf upgrade"

View File

@@ -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/>`_.

View File

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

View File

@@ -15,6 +15,5 @@ Note that installation and configuration vary by distribution.
.. toctree::
:maxdepth: 2
install-obs.rst
install-rdo.rst
install-ubuntu.rst

View File

@@ -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/.

View File

@@ -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
******************

View File

@@ -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
******************

View 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

View File

@@ -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

View File

@@ -5,7 +5,7 @@ Uniform Airflow Migration Strategy
Synopsis
--------
**display name**: ``uniform_airflow``
**display name**: ``Uniform airflow migration strategy``
**goal**: ``airflow_optimization``

View File

@@ -5,7 +5,7 @@ VM Workload Consolidation Strategy
Synopsis
--------
**display name**: ``vm_workload_consolidation``
**display name**: ``VM Workload Consolidation Strategy``
**goal**: ``vm_consolidation``
@@ -36,7 +36,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
******************

View File

@@ -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"]

View File

@@ -5,7 +5,7 @@ Workload Balance Migration Strategy
Synopsis
--------
**display name**: ``workload_balance``
**display name**: ``Workload Balance Migration Strategy``
**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
Cluster data model

View File

@@ -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 ?
------------------------------------

View 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

View 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 }}'

View 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

View 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 }}'

View File

@@ -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/

View 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.

View File

@@ -1,5 +1,5 @@
---
features:
- Added strategy to identify and migrate a Noisy Neighbor - a low priority VM
that negatively affects peformance of a high priority VM by over utilizing
that negatively affects performance of a high priority VM by over utilizing
Last Level Cache.

View File

@@ -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.

View File

@@ -21,6 +21,7 @@ Contents:
:maxdepth: 1
unreleased
pike
ocata
newton

View 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"

View File

@@ -0,0 +1,6 @@
===================================
Pike Series Release Notes
===================================
.. release-notes::
:branch: stable/pike

View File

@@ -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.1.0 # 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.1.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.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

View File

@@ -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
@@ -103,7 +99,6 @@ autodoc_exclude_modules =
watcher.db.sqlalchemy.alembic.env
watcher.db.sqlalchemy.alembic.versions.*
watcher.tests.*
watcher_tempest_plugin.*
watcher.doc

View File

@@ -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.16.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

View File

@@ -7,14 +7,14 @@ skipsdist = True
usedevelop = True
whitelist_externals = find
rm
install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/pike} {opts} {packages}
install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
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= _

View File

@@ -37,4 +37,3 @@ LOG.debug("Configuration:")
CONF.log_opt_values(LOG, log.DEBUG)
application = app.VersionSelectorApplication()

View File

@@ -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')

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -42,7 +42,7 @@ class APISchedulingService(scheduling.BackgroundSchedulerService):
services = objects.service.Service.list(context)
for service in services:
result = self.get_service_status(context, service.id)
if service.id not in self.services_status.keys():
if service.id not in self.services_status:
self.services_status[service.id] = result
continue
if self.services_status[service.id] != result:

View File

@@ -54,6 +54,7 @@ class DefaultActionPlanHandler(base.BaseActionPlanHandler):
applier.execute(self.action_plan_uuid)
action_plan.state = objects.action_plan.State.SUCCEEDED
action_plan.save()
notifications.action_plan.send_action_notification(
self.ctx, action_plan,
action=fields.NotificationAction.EXECUTION,
@@ -63,17 +64,32 @@ class DefaultActionPlanHandler(base.BaseActionPlanHandler):
LOG.exception(e)
action_plan.state = objects.action_plan.State.CANCELLED
self._update_action_from_pending_to_cancelled()
action_plan.save()
notifications.action_plan.send_cancel_notification(
self.ctx, action_plan,
action=fields.NotificationAction.CANCEL,
phase=fields.NotificationPhase.END)
except Exception as e:
LOG.exception(e)
action_plan.state = objects.action_plan.State.FAILED
notifications.action_plan.send_action_notification(
self.ctx, action_plan,
action=fields.NotificationAction.EXECUTION,
priority=fields.NotificationPriority.ERROR,
phase=fields.NotificationPhase.ERROR)
finally:
action_plan.save()
action_plan = objects.ActionPlan.get_by_uuid(
self.ctx, self.action_plan_uuid, eager=True)
if action_plan.state == objects.action_plan.State.CANCELLING:
action_plan.state = objects.action_plan.State.FAILED
action_plan.save()
notifications.action_plan.send_cancel_notification(
self.ctx, action_plan,
action=fields.NotificationAction.CANCEL,
priority=fields.NotificationPriority.ERROR,
phase=fields.NotificationPhase.ERROR)
else:
action_plan.state = objects.action_plan.State.FAILED
action_plan.save()
notifications.action_plan.send_action_notification(
self.ctx, action_plan,
action=fields.NotificationAction.EXECUTION,
priority=fields.NotificationPriority.ERROR,
phase=fields.NotificationPhase.ERROR)
def _update_action_from_pending_to_cancelled(self):
filters = {'action_plan_uuid': self.action_plan_uuid,

View File

@@ -18,6 +18,7 @@
#
import enum
import time
from watcher._i18n import _
from watcher.applier.actions import base
@@ -87,25 +88,39 @@ class ChangeNodePowerState(base.BaseAction):
target_state = NodeState.POWERON.value
return self._node_manage_power(target_state)
def _node_manage_power(self, state):
def _node_manage_power(self, state, retry=60):
if state is None:
raise exception.IllegalArgumentException(
message=_("The target state is not defined"))
result = False
ironic_client = self.osc.ironic()
nova_client = self.osc.nova()
current_state = ironic_client.node.get(self.node_uuid).power_state
# power state: 'power on' or 'power off', if current node state
# is the same as state, just return True
if state in current_state:
return True
if state == NodeState.POWEROFF.value:
node_info = ironic_client.node.get(self.node_uuid).to_dict()
compute_node_id = node_info['extra']['compute_node_id']
compute_node = nova_client.hypervisors.get(compute_node_id)
compute_node = compute_node.to_dict()
if (compute_node['running_vms'] == 0):
result = ironic_client.node.set_power_state(
ironic_client.node.set_power_state(
self.node_uuid, state)
else:
result = ironic_client.node.set_power_state(self.node_uuid, state)
return result
ironic_client.node.set_power_state(self.node_uuid, state)
ironic_node = ironic_client.node.get(self.node_uuid)
while ironic_node.power_state == current_state and retry:
time.sleep(10)
retry -= 1
ironic_node = ironic_client.node.get(self.node_uuid)
if retry > 0:
return True
else:
return False
def pre_condition(self):
pass

View File

@@ -36,15 +36,20 @@ class ChangeNovaServiceState(base.BaseAction):
schema = Schema({
'resource_id': str,
'state': str,
'disabled_reason': str,
})
The `resource_id` references a nova-compute service name (list of available
nova-compute services is returned by this command: ``nova service-list
--binary nova-compute``).
The `state` value should either be `ONLINE` or `OFFLINE`.
The `disabled_reason` references the reason why Watcher disables this
nova-compute service. The value should be with `watcher_` prefix, such as
`watcher_disabled`, `watcher_maintaining`.
"""
STATE = 'state'
REASON = 'disabled_reason'
@property
def schema(self):
@@ -61,6 +66,10 @@ class ChangeNovaServiceState(base.BaseAction):
element.ServiceState.OFFLINE.value,
element.ServiceState.ENABLED.value,
element.ServiceState.DISABLED.value]
},
'disabled_reason': {
'type': 'string',
"minlength": 1
}
},
'required': ['resource_id', 'state'],
@@ -75,6 +84,10 @@ class ChangeNovaServiceState(base.BaseAction):
def state(self):
return self.input_parameters.get(self.STATE)
@property
def reason(self):
return self.input_parameters.get(self.REASON)
def execute(self):
target_state = None
if self.state == element.ServiceState.DISABLED.value:
@@ -100,7 +113,7 @@ class ChangeNovaServiceState(base.BaseAction):
if state is True:
return nova.enable_service_nova_compute(self.host)
else:
return nova.disable_service_nova_compute(self.host)
return nova.disable_service_nova_compute(self.host, self.reason)
def pre_condition(self):
pass

View File

@@ -112,19 +112,11 @@ class Migrate(base.BaseAction):
result = nova.live_migrate_instance(instance_id=self.instance_uuid,
dest_hostname=destination)
except nova_helper.nvexceptions.ClientException as e:
if e.code == 400:
LOG.debug("Live migration of instance %s failed. "
"Trying to live migrate using block migration."
% self.instance_uuid)
result = nova.live_migrate_instance(
instance_id=self.instance_uuid,
dest_hostname=destination,
block_migration=True)
else:
LOG.debug("Nova client exception occurred while live "
"migrating instance %s.Exception: %s" %
(self.instance_uuid, e))
except Exception:
LOG.debug("Nova client exception occurred while live "
"migrating instance %s.Exception: %s" %
(self.instance_uuid, e))
except Exception as e:
LOG.exception(e)
LOG.critical("Unexpected error occurred. Migration failed for "
"instance %s. Leaving instance on previous "
"host.", self.instance_uuid)

View File

@@ -45,7 +45,7 @@ class VolumeMigrate(base.BaseAction):
'migration_type': str, # choices -> "swap", "cold"
'destination_node': str,
'destination_type': str,
)}
})
The `resource_id` is the UUID of cinder volume to migrate.
The `destination_node` is the destination block storage pool name.

View File

@@ -57,6 +57,7 @@ class BaseWorkFlowEngine(loadable.Loadable):
self._applier_manager = applier_manager
self._action_factory = factory.ActionFactory()
self._osc = None
self._is_notified = False
@classmethod
def get_config_opts(cls):
@@ -92,6 +93,17 @@ class BaseWorkFlowEngine(loadable.Loadable):
db_action.save()
return db_action
def notify_cancel_start(self, action_plan_uuid):
action_plan = objects.ActionPlan.get_by_uuid(self.context,
action_plan_uuid,
eager=True)
if not self._is_notified:
self._is_notified = True
notifications.action_plan.send_cancel_notification(
self._context, action_plan,
action=fields.NotificationAction.CANCEL,
phase=fields.NotificationPhase.START)
@abc.abstractmethod
def execute(self, actions):
raise NotImplementedError()
@@ -157,6 +169,7 @@ class BaseTaskFlowActionContainer(flow_task.Task):
fields.NotificationPhase.START)
except exception.ActionPlanCancelled as e:
LOG.exception(e)
self.engine.notify_cancel_start(action_plan.uuid)
raise
except Exception as e:
LOG.exception(e)
@@ -218,6 +231,7 @@ class BaseTaskFlowActionContainer(flow_task.Task):
# taskflow will call revert for the action,
# we will redirect it to abort.
except eventlet.greenlet.GreenletExit:
self.engine.notify_cancel_start(action_plan_object.uuid)
raise exception.ActionPlanCancelled(uuid=action_plan_object.uuid)
except Exception as e:
@@ -241,7 +255,7 @@ class BaseTaskFlowActionContainer(flow_task.Task):
action_plan = objects.ActionPlan.get_by_id(
self.engine.context, self._db_action.action_plan_id, eager=True)
# NOTE: check if revert cause by cancel action plan or
# some other exception occured during action plan execution
# some other exception occurred during action plan execution
# if due to some other exception keep the flow intact.
if action_plan.state not in CANCEL_STATE:
self.do_revert()
@@ -249,15 +263,42 @@ class BaseTaskFlowActionContainer(flow_task.Task):
action_object = objects.Action.get_by_uuid(
self.engine.context, self._db_action.uuid, eager=True)
if action_object.state == objects.action.State.ONGOING:
action_object.state = objects.action.State.CANCELLING
try:
if action_object.state == objects.action.State.ONGOING:
action_object.state = objects.action.State.CANCELLING
action_object.save()
notifications.action.send_cancel_notification(
self.engine.context, action_object,
fields.NotificationAction.CANCEL,
fields.NotificationPhase.START)
action_object = self.abort()
notifications.action.send_cancel_notification(
self.engine.context, action_object,
fields.NotificationAction.CANCEL,
fields.NotificationPhase.END)
if action_object.state == objects.action.State.PENDING:
notifications.action.send_cancel_notification(
self.engine.context, action_object,
fields.NotificationAction.CANCEL,
fields.NotificationPhase.START)
action_object.state = objects.action.State.CANCELLED
action_object.save()
notifications.action.send_cancel_notification(
self.engine.context, action_object,
fields.NotificationAction.CANCEL,
fields.NotificationPhase.END)
except Exception as e:
LOG.exception(e)
action_object.state = objects.action.State.FAILED
action_object.save()
self.abort()
elif action_object.state == objects.action.State.PENDING:
action_object.state = objects.action.State.CANCELLED
action_object.save()
else:
pass
notifications.action.send_cancel_notification(
self.engine.context, action_object,
fields.NotificationAction.CANCEL,
fields.NotificationPhase.ERROR,
priority=fields.NotificationPriority.ERROR)
def abort(self, *args, **kwargs):
self.do_abort(*args, **kwargs)
return self.do_abort(*args, **kwargs)

View File

@@ -34,7 +34,7 @@ class DefaultWorkFlowEngine(base.BaseWorkFlowEngine):
"""Taskflow as a workflow engine for Watcher
Full documentation on taskflow at
http://docs.openstack.org/developer/taskflow/
https://docs.openstack.org/taskflow/latest
"""
def decider(self, history):
@@ -45,7 +45,7 @@ class DefaultWorkFlowEngine(base.BaseWorkFlowEngine):
# (or whether the execution of v should be ignored,
# and therefore not executed). It is expected to take as single
# keyword argument history which will be the execution results of
# all u decideable links that have v as a target. It is expected
# all u decidable links that have v as a target. It is expected
# to return a single boolean
# (True to allow v execution or False to not).
return True
@@ -127,8 +127,10 @@ class TaskFlowActionContainer(base.BaseTaskFlowActionContainer):
return self.engine.notify(self._db_action,
objects.action.State.SUCCEEDED)
else:
return self.engine.notify(self._db_action,
objects.action.State.FAILED)
self.engine.notify(self._db_action,
objects.action.State.FAILED)
raise exception.ActionExecutionFailure(
action_id=self._db_action.uuid)
def do_post_execute(self):
LOG.debug("Post-condition action: %s", self.name)

View File

@@ -20,13 +20,13 @@
import sys
from oslo_config import cfg
from oslo_log import log as logging
from oslo_log import log
from watcher.api import scheduling
from watcher.common import service
from watcher import conf
LOG = logging.getLogger(__name__)
LOG = log.getLogger(__name__)
CONF = conf.CONF

View File

@@ -20,14 +20,14 @@
import os
import sys
from oslo_log import log as logging
from oslo_log import log
from watcher.applier import manager
from watcher.applier import sync
from watcher.common import service as watcher_service
from watcher import conf
LOG = logging.getLogger(__name__)
LOG = log.getLogger(__name__)
CONF = conf.CONF

View File

@@ -20,7 +20,7 @@
import os
import sys
from oslo_log import log as logging
from oslo_log import log
from watcher.common import service as watcher_service
from watcher import conf
@@ -29,7 +29,7 @@ from watcher.decision_engine import manager
from watcher.decision_engine import scheduling
from watcher.decision_engine import sync
LOG = logging.getLogger(__name__)
LOG = log.getLogger(__name__)
CONF = conf.CONF

View File

@@ -20,13 +20,13 @@
import sys
from oslo_log import log as logging
from oslo_log import log
from watcher.common import service as service
from watcher import conf
from watcher.decision_engine import sync
LOG = logging.getLogger(__name__)
LOG = log.getLogger(__name__)
CONF = conf.CONF

View File

@@ -165,7 +165,8 @@ class CinderHelper(object):
def check_migrated(self, volume, retry_interval=10):
volume = self.get_volume(volume)
while getattr(volume, 'migration_status') == 'migrating':
final_status = ('success', 'error')
while getattr(volume, 'migration_status') not in final_status:
volume = self.get_volume(volume.id)
LOG.debug('Waiting the migration of {0}'.format(volume))
time.sleep(retry_interval)

View File

@@ -110,8 +110,12 @@ class OpenStackClients(object):
'api_version')
gnocchiclient_interface = self._get_client_option('gnocchi',
'endpoint_type')
adapter_options = {
"interface": gnocchiclient_interface
}
self._gnocchi = gnclient.Client(gnocchiclient_version,
interface=gnocchiclient_interface,
adapter_options=adapter_options,
session=self.session)
return self._gnocchi

View File

@@ -11,13 +11,11 @@
# under the License.
from oslo_context import context
from oslo_log import log as logging
from oslo_log import log
from oslo_utils import timeutils
import six
from watcher.common import utils
LOG = logging.getLogger(__name__)
LOG = log.getLogger(__name__)
class RequestContext(context.RequestContext):
@@ -102,7 +100,7 @@ class RequestContext(context.RequestContext):
'domain_name': getattr(self, 'domain_name', None),
'auth_token_info': getattr(self, 'auth_token_info', None),
'is_admin': getattr(self, 'is_admin', None),
'timestamp': utils.strtime(self.timestamp) if hasattr(
'timestamp': self.timestamp.isoformat() if hasattr(
self, 'timestamp') else None,
'request_id': getattr(self, 'request_id', None),
})

View File

@@ -26,14 +26,14 @@ import functools
import sys
from keystoneclient import exceptions as keystone_exceptions
from oslo_log import log as logging
from oslo_log import log
import six
from watcher._i18n import _
from watcher import conf
LOG = logging.getLogger(__name__)
LOG = log.getLogger(__name__)
CONF = conf.CONF
@@ -249,7 +249,7 @@ class AuditNotFound(ResourceNotFound):
class AuditAlreadyExists(Conflict):
msg_fmt = _("An audit with UUID %(uuid)s already exists")
msg_fmt = _("An audit with UUID or name %(audit)s already exists")
class AuditIntervalNotSpecified(Invalid):
@@ -435,6 +435,10 @@ class ActionDescriptionNotFound(ResourceNotFound):
msg_fmt = _("The action description %(action_id)s cannot be found.")
class ActionExecutionFailure(WatcherException):
msg_fmt = _("The action %(action_id)s execution failed.")
# Model
class ComputeResourceNotFound(WatcherException):

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