Commit Graph

136 Commits

Author SHA1 Message Date
licanwei
4b83bf33e2 remove id field from CDM
There are 3 related fields(id, uuid and hostname) in ComputeNode[1].
according to [2], after nova api 2.53, the id of the hypervisor as a UUID.
and service.host is equal to hypervisor name for compute node.
so we can remove id and only keep uuid then set uuid to node.id

[1]:https://github.com/openstack/watcher/blob/master/watcher/decision_engine/model/collector/nova.py#L306
[2]:https://developer.openstack.org/api-ref/compute/?expanded=list-hypervisors-details-detail#list-hypervisors-details

Change-Id: Ie1d1ad56808270d936ec25186061f7f12cc49fdc
Closes-Bug: #1835192
Depends-on: I752fbfa560313e28e87d83e46431c283b4db4f23
Depends-on: I0975500f359de92b6d6fdea2e01614cf0ba73f05
2019-07-23 10:28:47 +08:00
licanwei
3d741d05aa Improve Compute Data Model
The fields(vcpus, memory and disk_capacity) in the Watcher ComputeNode
do not take allocation ratios used for overcommit into account so there
may be disparity between this and the used count.
This patch added some new fields to solve this problem.

Partially Implements: blueprint improve-compute-data-model

Change-Id: Id33496f368fb23cb8e744c7e8451e1cd1397866b
2019-07-22 10:22:35 +08:00
Dantali0n
cadc000f32 Add call_retry for ModelBuilder for error recovery
Add call_retry method for ModelBuilder classes along with configuration
options. This allows ModelBuilder classes to reattempt any failed calls
to external services such as Nova or Ironic.

Change-Id: Ided697adebed957e5ff13b4c6b5b06c816f81c4a
2019-07-19 16:09:18 +02:00
Zuul
1af7ac107c Merge "Baseclass for ModelBuilder with audit scope" 2019-07-19 13:34:42 +00:00
Zuul
4b8fe2745d Merge "Remove redundant human_id fields when creating and updating datamodel" 2019-07-16 11:11:26 +00:00
Dantali0n
933bc59b39 Baseclass for ModelBuilder with audit scope
This lets all the ModelBuilder classes use one baseclass and forces
ClusterDataModelCollector's to pass the scope.

The scopes are still unused in the case of Ironic and Cinder.

The idea is to do several follow ups to this and in the end have a
similar method to query_retry in the datasources baseclass.

Change-Id: Ibbdedd3087fef5298d7f4c9d3abdba05d1fbb2f0
2019-07-15 22:32:14 +02:00
Zuul
3bc426a590 Merge "remove baremetal nodes when building CDM" 2019-07-12 02:18:25 +00:00
Zuul
a4cbe69d57 Merge "Add get_node_by_name" 2019-07-12 02:18:24 +00:00
chenke
6dd35a0058 Remove redundant human_id fields when creating and updating datamodel
For the reason, please see:
[1]. http://eavesdrop.openstack.org/irclogs/%23openstack-watcher/%23openstack-watcher.2019-06-19.log.html
[2]. http://eavesdrop.openstack.org/meetings/watcher/2019/watcher.2019-06-19-08.00.log.html#l-47

Change-Id: I4284397aa987565f4cfc2697907a879d7d6492e9
Related-Bug: #1833665
2019-07-10 15:21:40 +08:00
licanwei
256104a38a remove baremetal nodes when building CDM
aggregate list and availability_zone list may return ironic type
compute nodes. When building compute data model we should check
the hypervisor_type and remove ironic compute nodes.

Change-Id: Idf404c104c30368baf95ef7d05ad8fc3e7adca38
Related-Bug: #1835183
2019-07-10 14:03:31 +08:00
chenke
dc2c361d04 Add reource_name in action input parameter field
(Partial implement)
Implements: blueprint add-resource-name-in-action-input-parameter-field

Depends-on: I51d879e31dee03652ee9d0d94a7f3168012cc060
Change-Id: I708cf63ff1d9a989604e1d5b834c8b7e5b087892
2019-07-09 18:40:49 +08:00
licanwei
a3c49cf8a4 Add get_node_by_name
We want to set the value of uuid field of Watcher ComputeNode
to hypversion id(as uuid). We need a method to get compute
node by name.

Change-Id: I0975500f359de92b6d6fdea2e01614cf0ba73f05
Related-Bug: #1835192
2019-07-09 07:03:29 +00:00
Zuul
46cc09f00e Merge "Reduce the query time of the instances when call get_instance_list()" 2019-07-09 03:54:20 +00:00
chenke
1e8b17ac46 Reduce the query time of the instances when call get_instance_list()
The problem is that watcher is passing limit=-1 to novaclient when
listing servers which will always make at least two API calls to be
sure it's done paging:

https://github.com/openstack/python-novaclient/blob/13.0.1/novaclient/v2/servers.py#L896

If we can determine before we list servers that there are only a
certain number where the number of servers is less than 1000. For
example: 4, we should just pass the limit=len(servers) to novaclient
and avoid the second call for paging which takes extra time and
yields no results.

Change-Id: I797ad934a0f8496dbcbf65798e28b0443f238137
Closes-Bug: #1834679
2019-07-08 09:58:01 +08:00
Zuul
fd2885932d Merge "Improve logging in building of nova data model" 2019-07-03 14:14:07 +00:00
Dantali0n
052fae4b62 Improve logging in building of nova data model
Improves logging during the building of the nova data model

Change-Id: Ieff571a6ee2d1a2ced9776a8e4800d5d6f2d95eb
2019-07-03 11:25:20 +02:00
Zuul
f335b6dff2 Merge "improve the process of instance_created.end" 2019-06-28 02:29:11 +00:00
Zuul
0915d991b4 Merge "Add name for instance in Watcher datamodel" 2019-06-28 02:20:27 +00:00
chenke
b62965c2bf Add name for instance in Watcher datamodel
Now Watcher's datamodel uses human_id to store the display_name
of the intance. But the value of human_id is not reliable. About
the reason, please see[1].

The solution is to add a 'name' field to save the display_name of
the instance, and ensure that the value of this field is the same
when the datamodel is created and when the datamodel is updated.

About the 'human_id', We will remove it in the future.

References:
[1]. https://bugs.launchpad.net/watcher/+bug/1833665

20190619 Watcher meeting IRC Log:
[1]. http://eavesdrop.openstack.org/irclogs/%23openstack-watcher/%23openstack-watcher.2019-06-19.log.html
[2]. http://eavesdrop.openstack.org/meetings/watcher/2019/watcher.2019-06-19-08.00.log.html#l-47

Change-Id: I6976759629a4feedee09261cc1dac935e050202a
Closes-Bug: #1833665
2019-06-26 22:29:12 +08:00
Zuul
899e534761 Merge "check instance state for instance.update" 2019-06-24 03:54:52 +00:00
licanwei
dd321e9f21 improve the process of instance_created.end
In the process of handling instance_created.end,
there is a KeyError exception output log. This is because
invoking get_instance_by_uuid before creating the instance
in the data model.
During the review of https://review.opendev.org/#/c/663489/,
reviewers think that it's better to remove the KeyError exception.
This patche seperates the process of instance_created.end from
other Nova notifications and removes the call of get_instance_by_uuid.

Change-Id: Ie9e2d4f5b32ee7a5b52bbcd50abfa81dcabab7bb
2019-06-21 16:53:25 +08:00
Zuul
fd04c67ed8 Merge "Map instance to its node" 2019-06-19 02:44:58 +00:00
licanwei
a4d978b893 Define a new InstanceNotMapped exception
In get_node_by_instance_uuid, an exception ComputeNodeNotFound
will be thrown if can't find a node through instance uuid.
But the exception information replaces the node name with
instance uuid, which is misleading, so we define a new exception.

Closes-Bug: #1832156

Change-Id: Ic6c44ae44da7c3b9a1c20e9b24a036063af266ba
2019-06-14 10:51:20 +08:00
Zuul
e4f80b5461 Merge "Optimize hypervisor API calls" 2019-06-14 02:28:51 +00:00
licanwei
7281f6184f Remove dead code
get_node_by_instance_uuid will never return None,
so the OR condition is dead code.

Change-Id: I26c553e1067a3cbeac6c0afe1c4bfdee4d939055
2019-06-13 17:31:49 +08:00
licanwei
79a57f67e6 Map instance to its node
When receiving Nova notification instance.create.end,
map instance to its node after adding instance to datamodel.
Related-Bug: #1832156

Change-Id: I6f39e8d935195c611f668f71590e1d9ff52ced0d
2019-06-13 15:58:28 +08:00
licanwei
f9e267fa42 check instance state for instance.update
In the process of creating an instance, Nova will emit an
instance.update notification with 'building' state.
This will cause a KeyError exception because this instance
isn't in Watcher datamodel.
So we should ignore the notification instance.update with
'building' state.

Closes-Bug: #1832154

Change-Id: I950eec50d2cee38bd22c47a70ae6f88bbf049080
2019-06-10 16:11:46 +08:00
Matt Riedemann
3f76f9cfdb Optimize hypervisor API calls
The nova CDM builder code and notification handling
code had some inefficiencies when it came to looking
up a hypevisor to get details. The general pattern
used before was:

1. get the minimal hypervisor information by hypervisor_hostname
2. make another query to get the hypervisor details by id

In the notifications case, it was actually three calls because
the first is listing hyprvisors to filter client-side by service
host.

This change collapses 1 and 2 above into a single API call
to get the hypervisor by hypervisor_hostname with details
which will include the service (compute) host information
which is what get_compute_node_by_id() was being used for.
Now that nothing is using get_compute_node_by_id it is removed.

There is more work we could do in get_compute_node_by_hostname
if the compute API allowed filtering hypervisors by service
host so a TODO is left for that.

One final thing: the TODO in get_compute_node_by_hostname about
there being more than one hypervisor per compute service host
for vmware vcenter is not accurate - nova's vcenter driver
hasn't supported a host:node 1:M topology like that since the
Liberty release [1]. The only in-tree driver in nova that supports
1:M is the ironic baremetal driver, so the comment is updated.

[1] Ifc17c5049e3ed29c8dd130339207907b00433960

Depends-On: https://review.opendev.org/661785/
Change-Id: I5e0e88d7b2dd1a69117ab03e0e66851c687606da
2019-06-03 12:18:54 -04:00
Zuul
855bfecf2f Merge "formal datasource interface implementation" 2019-05-28 12:15:06 +00:00
Matt Riedemann
fdea38fb06 Optimize NovaClusterDataModelCollector.add_instance_node
This does two things:

1. Rather than make an API call per server on the host,
   get all of the servers in a single API call by
   filtering on the host. The os-hypervisors API results
   to use make this require a bit of refactoring since
   get_compute_node_by_name does not have the service
   entry in it and get_compute_node_by_id does not have the
   servers entry in it. A TODO is added to clean that up
   with a single call to os-hypervisors once we have the
   support in python-novaclient.

2. Pulls get_node_by_uuid() out of the loop.

A test is added for the nova_helper get_instance_list method
since one did not exist before.

The fake compute node mocks in test_nova_cdmc_execute are
also cleaned up since, as noted above, get_compute_node_by_name
and get_compute_node_by_id don't both return all the details.

Change-Id: Ifd9f83c2f399d4c1765b0c520f4d5a62ad0f5fbd
2019-05-27 02:31:32 +03:00
Zuul
1e6ce53273 Merge "Handle no nova CDM in notification code" 2019-05-22 02:57:56 +00:00
Dantali0n
84cb589aa9 formal datasource interface implementation
Changes to the baseclass for datasources so strategies can be made
compatible with every datasource. Baseclass methods clearly describe
expected values and types for both parameters and for method returns.
query_retry has been added as base method since every current
datasource implements it.

Ceilometer is updated to work with the new baseclass. Several methods
which are not part of the baseclass and are not used by any strategies
are removed. The signature of these methods would have to be changed
to fit with the new base class while it would limit strategies to
only work with Ceilometer.

Gnocchi is updated to work with the new baseclass.

Gnocchi and Ceilometer will perform a transformation for the
host_airflow metric as it retrieves 1/10 th of the actual CFM

Monasca is updated to work with the new baseclass.

FakeMetrics for Gnocchi, Monasca and Ceilometer are updated to work
with the new method signatures of the baseclass.

FakeClusterAndMetrics for Ceilometer and Gnocchi are updated to work
with the new method signatures of the baseclass.

The strategies workload_balance, vm_workload_consolidation,
workload_stabilization, basic_consolidation, noisy_neighbour,
outlet_temp_control and uniform_airflow are updated to work with the
new datasource baseclass.

This patch will break compatibility with plugin strategies and
datasources due to the changes in signatures.

Depends-on: I7aa52a9b82f4aa849f2378d4d1c03453e45c0c78
Change-Id: Ie30ca3dbf01062cbb20d3be5d514ec6b5155cd7c
Implements: blueprint formal-datasource-interface
2019-05-21 11:18:08 +02:00
Zuul
124a942301 Merge "Remove dead code from NovaClusterDataModelCollector" 2019-05-20 13:00:16 +00:00
Matt Riedemann
8a206a6ae5 Handle no nova CDM in notification code
As of change Ic4659d1f18af181203439a8bf1b38805ff34c309 the
nova CDM will not be built until an audit is performed.

Instances and services (compute hosts) can be created and
deleted before an audit is performed which will attempt
to use the notification callback function which relies
on the CDM being built already, and if not results in
an AttributeError.

This change side-steps that issue by checking to see that the
nova CDM exists before trying to call the notification
callback function.

An alternative to this is forcefully create the nova CDM when
notifications are received before an audit which is what happend
before change Ic4659d1f18af181203439a8bf1b38805ff34c309.

Change-Id: I16990afb82019821c443c9df26d3e515e52efa69
Closes-Bug: #1828582
2019-05-16 17:45:44 -04:00
licanwei
6d96512188 Update migration notification
_post_live_migration[1] runs on the source host and calls
post_live_migration_at_destination on the dest host which
emits the instance.live_migration_post_dest.end notification:[2]
But it's not the last notification for the live migration operation.
so we should use instance.live_migration_post.end instead of
instance.live_migration_post_dest.end notification.

[1]daa2ac2287/nova/compute/manager.py (L6907)
[2]daa2ac2287/nova/compute/manager.py (L7035)

Change-Id: Id1e2d98f56d5a95d49e32f98d2910660b9f48ce6
2019-05-16 15:48:49 +08:00
Matt Riedemann
4cd8a2f46e Remove dead code from NovaClusterDataModelCollector
The _add_virtual_layer and _add_virtual_servers methods
have not been used since Ic4659d1f18af181203439a8bf1b38805ff34c309
in Stein so this change removes them.

Change-Id: I8c05f29c3c03aa5897cb182bb492948771c42881
2019-05-14 17:40:13 -04:00
Zuul
8ac5e620f4 Merge "Resolve problems with audit scope and add tests" 2019-04-30 09:20:27 +00:00
Dantali0n
d84f8c50f5 Resolve problems with audit scope and add tests
This resolves problems with the audit scope such as the scope being
ignored, the scope not merging due to a type in .append, change update
into .add method when adding single elements to a set and making the
access of dict keys and values as lists work in python 3.7.

All these methods from the model builder now have tests to prevent
regressions.

Co-Authored-By: Canwei Li <li.canwei2@zte.com.cn>

Change-Id: I287763d5e426ff860aefabc4a1f3fe3f51accd76
2019-04-30 07:12:56 +00:00
chenke
d2e1d69d37 Replace git.openstack.org with opendev.org
Change-Id: Ibccf32b71d307d9c80c91035907dc8292722ab31
2019-04-29 09:49:24 +02:00
licanwei
f337c67bfe scope for datamodel
This patch adds a scope to the datamodel, which only gets the VMs
 of the specified nodes, and no longer gets all VMs from nova.

Implements: blueprint scope-for-watcher-datamodel
Change-Id: Ic4659d1f18af181203439a8bf1b38805ff34c309
2019-03-08 14:30:18 +08:00
Yumeng_Bao
af0c90db4d Add audit scoper for baremetal data model
Bare metal cluster data model was introduced in Queens cycle.
Since the model is different from compute data model, we
need add CDM scoper for bare metal cluster data model

Change-Id: Idd041cefb692085d4545252d229ebe8602926b58
Implements: blueprint audit-scoper-for-baremetal-data-model
2018-11-26 12:21:06 +03:00
Zuul
dab3b3c3c0 Merge "Remove redundant docstring" 2018-11-08 08:33:21 +00:00
Tatiana Kholkina
e8c08e2abb Fix accessing to optional cinder pool attributes
Leave storage pool arguments empty if they are not provided
by cinderclient.

Change-Id: I90435146b33465c8eef95a6104e53285f785b014
Closes-Bug: #1800468
2018-11-07 08:31:55 +00:00
Tatiana Kholkina
456ce5a9e0 Remove redundant docstring
The method is quite simple and it doesn't need a dostring.
Also existing docstring was incorrect. The name of the expected
parameter is 'name', not 'node'. And it cannot be an object
of the type node.StorageNode

Change-Id: I94124d327c490d45eae4d2ded218beadfbc33ad7
2018-11-06 16:38:11 +03:00
Zuul
59cae3268e Merge "update datamodel by nova notifications" 2018-11-02 08:50:05 +00:00
Tatiana Kholkina
34523ec285 Fix parameter type for cinder pool
The correct type of parameter 'pool' in method build_storage_pool is
<class 'cinderclient.v2.pools.Pool'>

Change-Id: I986f707e4e740ebec94a46c6ee413f9a70197dad
2018-11-01 10:47:47 +03:00
licanwei
a8eed9fc4c update datamodel by nova notifications
Change-Id: Ib2676d6e69eb07644beae66bde22d308bbb836f1
Implements: blueprint update-datamodel-by-nova-notifications
2018-11-01 03:07:23 +00:00
Alexander Chadin
62b9282b1e Fix oslo_versionedobjects warnings
This patch set fixes warnings regarding invalid UUIDs and
static_root.

Change-Id: Icb0bbca9c05ee97ea9947a31db5e87b7837e42d0
2018-10-23 17:16:50 +03:00
licanwei
b69fc584d8 tenant_id should be project_id in instance element
Change-Id: I4e8d35b5dbf62df2c653defb223aca7ec5032e3e
2018-10-12 16:40:09 +08:00
licanwei
5265b06a9b remove nova legacy notifications
http://lists.openstack.org/pipermail/openstack-dev/2018-August/133071.html

Closes-Bug: #1793048
Change-Id: Id591c8979fd4a6bda674588060eaf51386d937cb
2018-09-30 09:03:00 +08:00