Documentation on goal and efficacy

In this changeset, I wrote a documentation detailing how one can
implement a new goal plugin. I also mention to define the efficacy
specification for a given goal.

Partially Implements: blueprint efficacy-indicator

Change-Id: Iba267ae312f248b49d4600504f11678cdc225622
This commit is contained in:
Vincent Françoise
2016-05-20 14:28:08 +02:00
parent 442512cd71
commit 45801cf9c5
24 changed files with 1384 additions and 541 deletions

View File

@@ -16,9 +16,11 @@
# limitations under the License.
"""
An :ref:`Action Plan <action_plan_definition>` is a flow of
An :ref:`Action Plan <action_plan_definition>` specifies a flow of
:ref:`Actions <action_definition>` that should be executed in order to satisfy
a given :ref:`Goal <goal_definition>`.
a given :ref:`Goal <goal_definition>`. It also contains an estimated
:ref:`global efficacy <efficacy_definition>` alongside a set of
:ref:`efficacy indicators <efficacy_indicator_definition>`.
An :ref:`Action Plan <action_plan_definition>` is generated by Watcher when an
:ref:`Audit <audit_definition>` is successful which implies that the
@@ -26,16 +28,13 @@ An :ref:`Action Plan <action_plan_definition>` is generated by Watcher when an
which was used has found a :ref:`Solution <solution_definition>` to achieve the
:ref:`Goal <goal_definition>` of this :ref:`Audit <audit_definition>`.
In the default implementation of Watcher, an
:ref:`Action Plan <action_plan_definition>`
is only composed of successive :ref:`Actions <action_definition>`
(i.e., a Workflow of :ref:`Actions <action_definition>` belonging to a unique
branch).
In the default implementation of Watcher, an action plan is composed of
a list of successive :ref:`Actions <action_definition>` (i.e., a Workflow of
:ref:`Actions <action_definition>` belonging to a unique branch).
However, Watcher provides abstract interfaces for many of its components,
allowing other implementations to generate and handle more complex
:ref:`Action Plan(s) <action_plan_definition>`
composed of two types of Action Item(s):
allowing other implementations to generate and handle more complex :ref:`Action
Plan(s) <action_plan_definition>` composed of two types of Action Item(s):
- simple :ref:`Actions <action_definition>`: atomic tasks, which means it
can not be split into smaller tasks or commands from an OpenStack point of
@@ -46,13 +45,14 @@ composed of two types of Action Item(s):
An :ref:`Action Plan <action_plan_definition>` may be described using
standard workflow model description formats such as
`Business Process Model and Notation 2.0 (BPMN 2.0) <http://www.omg.org/spec/BPMN/2.0/>`_
or `Unified Modeling Language (UML) <http://www.uml.org/>`_.
`Business Process Model and Notation 2.0 (BPMN 2.0)
<http://www.omg.org/spec/BPMN/2.0/>`_ or `Unified Modeling Language (UML)
<http://www.uml.org/>`_.
To see the life-cycle and description of
:ref:`Action Plan <action_plan_definition>` states, visit :ref:`the Action Plan state
machine <action_plan_state_machine>`.
""" # noqa
:ref:`Action Plan <action_plan_definition>` states, visit :ref:`the Action Plan
state machine <action_plan_state_machine>`.
"""
import datetime

View File

@@ -15,20 +15,20 @@
# limitations under the License.
"""
An efficacy indicator is a single value
that gives an indication on how the :ref:`solution <solution_definition>`
produced by a given :ref:`strategy <strategy_definition>` performed. These
efficacy indicators are specific to a given :ref:`goal <goal_definition>` and
are usually used to compute the :ref:`gobal efficacy <efficacy_definition>` of
the resulting :ref:`action plan <action_plan_definition>`.
An efficacy indicator is a single value that gives an indication on how the
:ref:`solution <solution_definition>` produced by a given :ref:`strategy
<strategy_definition>` performed. These efficacy indicators are specific to a
given :ref:`goal <goal_definition>` and are usually used to compute the
:ref:`gobal efficacy <efficacy_definition>` of the resulting :ref:`action plan
<action_plan_definition>`.
In Watcher, these efficacy indicators are specified alongside the goal they
relate to. When a strategy (which always relates to a goal) is executed, it
produces a solution containing the efficacy indicators specified by the
goal. This solution, which has been translated by the :ref:`Watcher Planner
<watcher_planner_definition>` into an action plan, will see its
indicators and global efficacy stored and would now be accessible through the
:ref:`Watcher API <watcher_api_definition>`.
produces a solution containing the efficacy indicators specified by the goal.
This solution, which has been translated by the :ref:`Watcher Planner
<watcher_planner_definition>` into an action plan, will see its indicators and
global efficacy stored and would now be accessible through the :ref:`Watcher
API <archi_watcher_api_definition>`.
"""
import numbers

View File

@@ -13,6 +13,7 @@
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_log import log
from watcher.common.messaging.events import event as watcher_event

View File

@@ -14,6 +14,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""
An efficacy specfication is a contract that is associated to each :ref:`Goal
<goal_definition>` that defines the various :ref:`efficacy indicators
<efficacy_indicator_definition>` a strategy achieving the associated goal
should provide within its :ref:`solution <solution_definition>`. Indeed, each
solution proposed by a strategy will be validated against this contract before
calculating its :ref:`global efficacy <efficacy_definition>`.
"""
import abc
import json

View File

@@ -18,10 +18,17 @@
#
"""
A :ref:`Solution <solution_definition>` is a set of
:ref:`Actions <action_definition>` generated by a
:ref:`Strategy <strategy_definition>` (i.e., an algorithm) in order to achieve
the :ref:`Goal <goal_definition>` of an :ref:`Audit <audit_definition>`.
A :ref:`Solution <solution_definition>` is the result of execution of a
:ref:`strategy <strategy_definition>` (i.e., an algorithm).
Each solution is composed of many pieces of information:
- A set of :ref:`actions <action_definition>` generated by the strategy in
order to achieve the :ref:`goal <goal_definition>` of an associated
:ref:`audit <audit_definition>`.
- A set of :ref:`efficacy indicators <efficacy_indicator_definition>` as
defined by the associated goal
- A :ref:`global efficacy <efficacy_definition>` which is computed by the
associated goal using the aforementioned efficacy indicators.
A :ref:`Solution <solution_definition>` is different from an
:ref:`Action Plan <action_plan_definition>` because it contains the

View File

@@ -7,9 +7,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: python-watcher 0.26.1.dev33\n"
"Project-Id-Version: python-watcher 0.26.1.dev88\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2016-05-11 15:31+0200\n"
"POT-Creation-Date: 2016-06-02 10:23+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -48,24 +48,24 @@ msgid ""
"'public_endpoint' option."
msgstr ""
#: watcher/api/controllers/v1/action.py:364
#: watcher/api/controllers/v1/action.py:365
msgid "Cannot create an action directly"
msgstr ""
#: watcher/api/controllers/v1/action.py:388
#: watcher/api/controllers/v1/action.py:389
msgid "Cannot modify an action directly"
msgstr ""
#: watcher/api/controllers/v1/action.py:424
#: watcher/api/controllers/v1/action.py:425
msgid "Cannot delete an action directly"
msgstr ""
#: watcher/api/controllers/v1/action_plan.py:87
#: watcher/api/controllers/v1/action_plan.py:91
#, python-format
msgid "Invalid state: %(state)s"
msgstr ""
#: watcher/api/controllers/v1/action_plan.py:407
#: watcher/api/controllers/v1/action_plan.py:451
#, python-format
msgid "State transition not allowed: (%(initial_state)s -> %(new_state)s)"
msgstr ""
@@ -74,15 +74,15 @@ msgstr ""
msgid "The audit template UUID or name specified is invalid"
msgstr ""
#: watcher/api/controllers/v1/audit_template.py:138
#: watcher/api/controllers/v1/audit_template.py:141
#, python-format
msgid ""
"'%(strategy)s' strategy does relate to the '%(goal)s' goal. Possible "
"choices: %(choices)s"
msgstr ""
#: watcher/api/controllers/v1/audit_template.py:160
msgid "Cannot remove 'goal_uuid' attribute from an audit template"
#: watcher/api/controllers/v1/audit_template.py:169
msgid "Cannot remove 'goal' attribute from an audit template"
msgstr ""
#: watcher/api/controllers/v1/types.py:123
@@ -146,18 +146,19 @@ msgstr ""
msgid "The target state is not defined"
msgstr ""
#: watcher/applier/actions/migration.py:71
#: watcher/applier/actions/migration.py:69
msgid "The parameter resource_id is invalid."
msgstr ""
#: watcher/applier/actions/migration.py:124
#: watcher/applier/actions/migration.py:123
#: watcher/applier/actions/migration.py:137
#, python-format
msgid ""
"Unexpected error occured. Migration failed forinstance %s. Leaving "
"instance on previous host."
msgstr ""
#: watcher/applier/actions/migration.py:140
#: watcher/applier/actions/migration.py:155
#, python-format
msgid "Migration of type %(migration_type)s is not supported."
msgstr ""
@@ -176,22 +177,22 @@ msgstr ""
msgid "Oops! We need disaster recover plan"
msgstr ""
#: watcher/cmd/api.py:42
#, python-format
msgid "serving on 0.0.0.0:%(port)s, view at %(protocol)s://127.0.0.1:%(port)s"
msgstr ""
#: watcher/cmd/api.py:46
#, python-format
msgid "serving on 0.0.0.0:%(port)s, view at http://127.0.0.1:%(port)s"
msgid "serving on %(protocol)s://%(host)s:%(port)s"
msgstr ""
#: watcher/cmd/api.py:50
#, python-format
msgid "serving on http://%(host)s:%(port)s"
msgstr ""
#: watcher/cmd/applier.py:41
#: watcher/cmd/applier.py:38
#, python-format
msgid "Starting Watcher Applier service in PID %s"
msgstr ""
#: watcher/cmd/decisionengine.py:42
#: watcher/cmd/decisionengine.py:39
#, python-format
msgid "Starting Watcher Decision Engine service in PID %s"
msgstr ""
@@ -360,7 +361,7 @@ msgstr ""
msgid "Action %(action)s could not be found"
msgstr ""
#: watcher/common/exception.py:238
#: watcher/common/exception.py:238 watcher/common/exception.py:256
#, python-format
msgid "An action with UUID %(uuid)s already exists"
msgstr ""
@@ -374,87 +375,114 @@ msgstr ""
msgid "Filtering actions on both audit and action-plan is prohibited"
msgstr ""
#: watcher/common/exception.py:256
#: watcher/common/exception.py:252
#, python-format
msgid "Efficacy indicator %(efficacy_indicator)s could not be found"
msgstr ""
#: watcher/common/exception.py:264
#, python-format
msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s"
msgstr ""
#: watcher/common/exception.py:262
#: watcher/common/exception.py:270
#, python-format
msgid "Workflow execution error: %(error)s"
msgstr ""
#: watcher/common/exception.py:266
#: watcher/common/exception.py:274
msgid "Illegal argument"
msgstr ""
#: watcher/common/exception.py:270
#: watcher/common/exception.py:278
msgid "No such metric"
msgstr ""
#: watcher/common/exception.py:274
#: watcher/common/exception.py:282
msgid "No rows were returned"
msgstr ""
#: watcher/common/exception.py:278
#: watcher/common/exception.py:286
#, python-format
msgid "%(client)s connection failed. Reason: %(reason)s"
msgstr ""
#: watcher/common/exception.py:282
#: watcher/common/exception.py:290
msgid "'Keystone API endpoint is missing''"
msgstr ""
#: watcher/common/exception.py:286
#: watcher/common/exception.py:294
msgid "The list of hypervisor(s) in the cluster is empty"
msgstr ""
#: watcher/common/exception.py:290
#: watcher/common/exception.py:298
msgid "The metrics resource collector is not defined"
msgstr ""
#: watcher/common/exception.py:294
#: watcher/common/exception.py:302
msgid "The cluster state is not defined"
msgstr ""
#: watcher/common/exception.py:298
#: watcher/common/exception.py:306
#, python-format
msgid "No strategy could be found to achieve the '%(goal)s' goal."
msgstr ""
#: watcher/common/exception.py:304
#: watcher/common/exception.py:310
#, python-format
msgid "The instance '%(name)s' is not found"
msgid "The value '%(value)s' with spec type '%(spec_type)s' is invalid."
msgstr ""
#: watcher/common/exception.py:308
msgid "The hypervisor is not found"
msgstr ""
#: watcher/common/exception.py:312
#: watcher/common/exception.py:315
#, python-format
msgid "Error loading plugin '%(name)s'"
msgstr ""
#: watcher/common/exception.py:316
#, python-format
msgid "The identifier '%(name)s' is a reserved word"
msgid ""
"Could not compute the global efficacy for the '%(goal)s' goal using the "
"'%(strategy)s' strategy."
msgstr ""
#: watcher/common/exception.py:320
#, python-format
msgid "The %(name)s resource %(id)s is not soft deleted"
msgid "No values returned by %(resource_id)s for %(metric_name)s."
msgstr ""
#: watcher/common/exception.py:324
#, python-format
msgid "No %(metric)s metric for %(host)s found."
msgstr ""
#: watcher/common/exception.py:330
#, python-format
msgid "The instance '%(name)s' is not found"
msgstr ""
#: watcher/common/exception.py:334
msgid "The hypervisor is not found"
msgstr ""
#: watcher/common/exception.py:338
#, python-format
msgid "Error loading plugin '%(name)s'"
msgstr ""
#: watcher/common/exception.py:342
#, python-format
msgid "The identifier '%(name)s' is a reserved word"
msgstr ""
#: watcher/common/exception.py:346
#, python-format
msgid "The %(name)s resource %(id)s is not soft deleted"
msgstr ""
#: watcher/common/exception.py:350
msgid "Limit should be positive"
msgstr ""
#: watcher/common/service.py:40
#: watcher/common/service.py:43
msgid "Seconds between running periodic tasks."
msgstr ""
#: watcher/common/service.py:43
#: watcher/common/service.py:46
msgid ""
"Name of this node. This can be an opaque identifier. It is not "
"necessarily a hostname, FQDN, or IP address. However, the node name must "
@@ -462,7 +490,11 @@ msgid ""
" or IP address."
msgstr ""
#: watcher/common/utils.py:53
#: watcher/common/service.py:226
msgid "Plugins"
msgstr ""
#: watcher/common/utils.py:76
#, python-format
msgid ""
"Failed to remove trailing character. Returning original object.Supplied "
@@ -477,231 +509,266 @@ msgstr ""
msgid "Messaging configuration error"
msgstr ""
#: watcher/db/purge.py:50
#: watcher/db/purge.py:51
msgid "Goals"
msgstr ""
#: watcher/db/purge.py:51
#: watcher/db/purge.py:52
msgid "Strategies"
msgstr ""
#: watcher/db/purge.py:52
#: watcher/db/purge.py:53
msgid "Audit Templates"
msgstr ""
#: watcher/db/purge.py:53
#: watcher/db/purge.py:54
msgid "Audits"
msgstr ""
#: watcher/db/purge.py:54
#: watcher/db/purge.py:55
msgid "Action Plans"
msgstr ""
#: watcher/db/purge.py:55
#: watcher/db/purge.py:56
msgid "Actions"
msgstr ""
#: watcher/db/purge.py:102
#: watcher/db/purge.py:103
msgid "Total"
msgstr ""
#: watcher/db/purge.py:160
#: watcher/db/purge.py:166
msgid "Audit Template"
msgstr ""
#: watcher/db/purge.py:227
#: watcher/db/purge.py:233
#, python-format
msgid ""
"Orphans found:\n"
"%s"
msgstr ""
#: watcher/db/purge.py:306
#: watcher/db/purge.py:312
#, python-format
msgid "There are %(count)d objects set for deletion. Continue? [y/N]"
msgstr ""
#: watcher/db/purge.py:313
#: watcher/db/purge.py:319
#, python-format
msgid ""
"The number of objects (%(num)s) to delete from the database exceeds the "
"maximum number of objects (%(max_number)s) specified."
msgstr ""
#: watcher/db/purge.py:318
#: watcher/db/purge.py:324
msgid "Do you want to delete objects up to the specified maximum number? [y/N]"
msgstr ""
#: watcher/db/purge.py:408
#: watcher/db/purge.py:414
msgid "Deleting..."
msgstr ""
#: watcher/db/purge.py:414
#: watcher/db/purge.py:420
msgid "Starting purge command"
msgstr ""
#: watcher/db/purge.py:424
#: watcher/db/purge.py:430
msgid " (orphans excluded)"
msgstr ""
#: watcher/db/purge.py:425
#: watcher/db/purge.py:431
msgid " (may include orphans)"
msgstr ""
#: watcher/db/purge.py:428 watcher/db/purge.py:429
#: watcher/db/purge.py:434 watcher/db/purge.py:435
#, python-format
msgid "Purge results summary%s:"
msgstr ""
#: watcher/db/purge.py:432
#: watcher/db/purge.py:438
#, python-format
msgid "Here below is a table containing the objects that can be purged%s:"
msgstr ""
#: watcher/db/purge.py:437
#: watcher/db/purge.py:443
msgid "Purge process completed"
msgstr ""
#: watcher/db/sqlalchemy/api.py:443
#: watcher/db/sqlalchemy/api.py:477
msgid "Cannot overwrite UUID for an existing Goal."
msgstr ""
#: watcher/db/sqlalchemy/api.py:509
#: watcher/db/sqlalchemy/api.py:543
msgid "Cannot overwrite UUID for an existing Strategy."
msgstr ""
#: watcher/db/sqlalchemy/api.py:586
#: watcher/db/sqlalchemy/api.py:620
msgid "Cannot overwrite UUID for an existing Audit Template."
msgstr ""
#: watcher/db/sqlalchemy/api.py:683
#: watcher/db/sqlalchemy/api.py:717
msgid "Cannot overwrite UUID for an existing Audit."
msgstr ""
#: watcher/db/sqlalchemy/api.py:778
#: watcher/db/sqlalchemy/api.py:812
msgid "Cannot overwrite UUID for an existing Action."
msgstr ""
#: watcher/db/sqlalchemy/api.py:891
#: watcher/db/sqlalchemy/api.py:925
msgid "Cannot overwrite UUID for an existing Action Plan."
msgstr ""
#: watcher/db/sqlalchemy/api.py:1004
msgid "Cannot overwrite UUID for an existing efficacy indicator."
msgstr ""
#: watcher/db/sqlalchemy/migration.py:73
msgid ""
"Watcher database schema is already under version control; use upgrade() "
"instead"
msgstr ""
#: watcher/decision_engine/sync.py:94
#: watcher/decision_engine/sync.py:106
#, python-format
msgid "Goal %s already exists"
msgstr ""
#: watcher/decision_engine/sync.py:103
#: watcher/decision_engine/sync.py:115
#, python-format
msgid "Strategy %s already exists"
msgstr ""
#: watcher/decision_engine/sync.py:125
#: watcher/decision_engine/sync.py:138
#, python-format
msgid "Goal %s created"
msgstr ""
#: watcher/decision_engine/sync.py:154
#: watcher/decision_engine/sync.py:167
#, python-format
msgid "Strategy %s created"
msgstr ""
#: watcher/decision_engine/sync.py:180
#: watcher/decision_engine/sync.py:193
#, python-format
msgid "Audit Template '%s' synced"
msgstr ""
#: watcher/decision_engine/sync.py:225
#: watcher/decision_engine/sync.py:238
#, python-format
msgid "Audit Template '%(audit_template)s' references a goal that does not exist"
msgstr ""
#: watcher/decision_engine/sync.py:240
#: watcher/decision_engine/sync.py:253
#, python-format
msgid ""
"Audit Template '%(audit_template)s' references a strategy that does not "
"exist"
msgstr ""
#: watcher/decision_engine/sync.py:279
#: watcher/decision_engine/sync.py:310
#, python-format
msgid "Goal %s unchanged"
msgstr ""
#: watcher/decision_engine/sync.py:281
#: watcher/decision_engine/sync.py:312
#, python-format
msgid "Goal %s modified"
msgstr ""
#: watcher/decision_engine/sync.py:295
#: watcher/decision_engine/sync.py:326
#, python-format
msgid "Strategy %s unchanged"
msgstr ""
#: watcher/decision_engine/sync.py:297
#: watcher/decision_engine/sync.py:328
#, python-format
msgid "Strategy %s modified"
msgstr ""
#: watcher/decision_engine/goal/goals.py:34
msgid "Dummy goal"
msgstr ""
#: watcher/decision_engine/goal/goals.py:62
msgid "Unclassified"
msgstr ""
#: watcher/decision_engine/goal/goals.py:82
msgid "Server consolidation"
msgstr ""
#: watcher/decision_engine/goal/goals.py:102
msgid "Thermal optimization"
msgstr ""
#: watcher/decision_engine/goal/goals.py:122
#: watcher/decision_engine/strategy/strategies/workload_stabilization.py:130
msgid "Workload balancing"
msgstr ""
#: watcher/decision_engine/goal/efficacy/indicators.py:80
msgid "Average CPU load as a percentage of the CPU time."
msgstr ""
#: watcher/decision_engine/goal/efficacy/indicators.py:95
msgid ""
"Represents the percentage of released nodes out of the total number of "
"migrations."
msgstr ""
#: watcher/decision_engine/goal/efficacy/indicators.py:111
msgid "The number of compute nodes to be released."
msgstr ""
#: watcher/decision_engine/goal/efficacy/indicators.py:125
msgid "The number of migrations to be performed."
msgstr ""
#: watcher/decision_engine/goal/efficacy/specs.py:107
msgid "Ratio of released compute nodes divided by the number of VM migrations."
msgstr ""
#: watcher/decision_engine/model/model_root.py:33
#: watcher/decision_engine/model/model_root.py:38
msgid "'obj' argument type is not valid"
msgstr ""
#: watcher/decision_engine/planner/default.py:78
#: watcher/decision_engine/planner/default.py:80
msgid "The action plan is empty"
msgstr ""
#: watcher/decision_engine/solution/efficacy.py:41
msgid "An indicator value should be a number"
msgstr ""
#: watcher/decision_engine/strategy/selection/default.py:74
#, python-format
msgid "Could not load any strategy for goal %(goal)s"
msgstr ""
#: watcher/decision_engine/strategy/strategies/base.py:165
msgid "Dummy goal"
msgstr ""
#: watcher/decision_engine/strategy/strategies/base.py:188
msgid "Unclassified"
msgstr ""
#: watcher/decision_engine/strategy/strategies/base.py:204
msgid "Server consolidation"
msgstr ""
#: watcher/decision_engine/strategy/strategies/base.py:220
msgid "Thermal optimization"
msgstr ""
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:119
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:117
msgid "Basic offline consolidation"
msgstr ""
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:296
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:343
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:263
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:305
#, python-format
msgid "No values returned by %(resource_id)s for %(metric_name)s"
msgstr ""
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:456
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:414
msgid "Initializing Sercon Consolidation"
msgstr ""
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:500
#: watcher/decision_engine/strategy/strategies/basic_consolidation.py:456
msgid "The workloads of the compute nodes of the cluster is zero"
msgstr ""
#: watcher/decision_engine/strategy/strategies/dummy_strategy.py:74
#: watcher/decision_engine/strategy/strategies/dummy_strategy.py:78
msgid "Dummy strategy"
msgstr ""
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:102
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:103
msgid "Outlet temperature based strategy"
msgstr ""
@@ -710,16 +777,20 @@ msgstr ""
msgid "%s: no outlet temp data"
msgstr ""
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:181
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:180
#, python-format
msgid "VM not active, skipped: %s"
msgstr ""
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:239
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:186
msgid "VM not found"
msgstr ""
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:235
msgid "No hosts under outlet temp threshold found"
msgstr ""
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:262
#: watcher/decision_engine/strategy/strategies/outlet_temp_control.py:255
msgid "No proper target host could be found"
msgstr ""
@@ -732,20 +803,68 @@ msgstr ""
msgid "Unexpexted resource state type, state=%(state)s, state_type=%(st)s."
msgstr ""
#: watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py:180
#: watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py:178
#, python-format
msgid "Cannot live migrate: vm_uuid=%(vm_uuid)s, state=%(vm_state)s."
msgstr ""
#: watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py:264
#: watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py:262
#, python-format
msgid "No values returned by %(resource_id)s for memory.usage or disk.root.size"
msgstr ""
#: watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py:515
#: watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py:519
msgid "Executing Smart Strategy"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_balance.py:103
msgid "workload balance migration strategy"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_balance.py:152
#, python-format
msgid "VM not found Error: %s"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_balance.py:157
#, python-format
msgid "VM not found from hypervisor: %s"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_balance.py:233
msgid "Can not get cpu_util"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_balance.py:264
msgid "Initializing Workload Balance Strategy"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_balance.py:282
#, python-format
msgid ""
"No hosts current have CPU utilization under %s percent, therefore there "
"are no possible target hosts for any migration"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_balance.py:305
msgid ""
"No proper target host could be found, it might be because of there's no "
"enough CPU/Memory/DISK"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_stabilization.py:173
msgid "get_vm_load started"
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_stabilization.py:251
#, python-format
msgid "Incorrect mapping: could not find associated weight for %s in weight dict."
msgstr ""
#: watcher/decision_engine/strategy/strategies/workload_stabilization.py:371
msgid "Initializing Workload Stabilization"
msgstr ""
#: watcher/objects/base.py:70
#, python-format
msgid "Error setting %(attr)s"
@@ -783,7 +902,7 @@ msgstr ""
msgid "A datetime.datetime is required here"
msgstr ""
#: watcher/objects/utils.py:105
#: watcher/objects/utils.py:114
#, python-format
msgid "An object of class %s is required here"
msgstr ""