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

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