Remove obsolete Resource element
Partially Implements: blueprint graph-based-cluster-model Change-Id: I2765d1c7a864d6658c847dcd988314fc8f11049c
This commit is contained in:
@@ -108,12 +108,15 @@ import copy
|
||||
import threading
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log
|
||||
import six
|
||||
|
||||
from watcher.common import clients
|
||||
from watcher.common.loader import loadable
|
||||
from watcher.decision_engine.model import model_root
|
||||
|
||||
LOG = log.getLogger(__name__)
|
||||
|
||||
|
||||
@six.add_metaclass(abc.ABCMeta)
|
||||
class BaseClusterDataModelCollector(loadable.LoadableSingleton):
|
||||
@@ -169,6 +172,8 @@ class BaseClusterDataModelCollector(loadable.LoadableSingleton):
|
||||
]
|
||||
|
||||
def get_latest_cluster_data_model(self):
|
||||
LOG.debug("Creating copy")
|
||||
LOG.debug(self.cluster_data_model.to_xml())
|
||||
return copy.deepcopy(self.cluster_data_model)
|
||||
|
||||
def synchronize(self):
|
||||
|
||||
@@ -132,7 +132,6 @@ class ModelBuilder(object):
|
||||
compute_service = self.nova_helper.get_service(node.service["id"])
|
||||
node_attributes = {
|
||||
"id": node.id,
|
||||
"human_id": None, # TODO(v-francoise): get rid of it
|
||||
"uuid": compute_service.host,
|
||||
"hostname": node.hypervisor_hostname,
|
||||
"memory": node.memory_mb,
|
||||
|
||||
@@ -16,10 +16,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.model.element import disk_info
|
||||
from watcher.decision_engine.model.element import instance
|
||||
from watcher.decision_engine.model.element import node
|
||||
from watcher.decision_engine.model.element import resource
|
||||
|
||||
ServiceState = node.ServiceState
|
||||
ComputeNode = node.ComputeNode
|
||||
@@ -27,12 +25,4 @@ ComputeNode = node.ComputeNode
|
||||
InstanceState = instance.InstanceState
|
||||
Instance = instance.Instance
|
||||
|
||||
DiskInfo = disk_info.DiskInfo
|
||||
|
||||
ResourceType = resource.ResourceType
|
||||
Resource = resource.Resource
|
||||
|
||||
|
||||
__all__ = [
|
||||
'ServiceState', 'ComputeNode', 'InstanceState', 'Instance',
|
||||
'DiskInfo', 'ResourceType', 'Resource']
|
||||
__all__ = ['ServiceState', 'ComputeNode', 'InstanceState', 'Instance']
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.model.element import base
|
||||
|
||||
|
||||
class DiskInfo(base.Element):
|
||||
|
||||
def __init__(self):
|
||||
self.name = ""
|
||||
self.major = 0
|
||||
self.minor = 0
|
||||
self.size = 0
|
||||
self.scheduler = ""
|
||||
|
||||
def accept(self, visitor):
|
||||
raise NotImplementedError()
|
||||
|
||||
def set_size(self, size):
|
||||
"""DiskInfo
|
||||
|
||||
:param size: Size in bytes
|
||||
"""
|
||||
self.size = size
|
||||
|
||||
def get_size(self):
|
||||
return self.size
|
||||
|
||||
def set_scheduler(self, scheduler):
|
||||
"""DiskInfo
|
||||
|
||||
I/O Scheduler noop cfq deadline
|
||||
:param scheduler:
|
||||
:return:
|
||||
"""
|
||||
self.scheduler = scheduler
|
||||
|
||||
def set_device_name(self, name):
|
||||
"""Device name
|
||||
|
||||
:param name:
|
||||
"""
|
||||
self.name = name
|
||||
|
||||
def get_device_name(self):
|
||||
return self.name
|
||||
@@ -1,64 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import enum
|
||||
|
||||
from watcher.common import exception
|
||||
|
||||
|
||||
class ResourceType(enum.Enum):
|
||||
cpu_cores = 'vcpus'
|
||||
vcpus = 'vcpus'
|
||||
memory = 'memory'
|
||||
disk = 'disk'
|
||||
disk_capacity = 'disk_capacity'
|
||||
|
||||
|
||||
class Resource(object):
|
||||
def __init__(self, name, capacity=None):
|
||||
"""Resource
|
||||
|
||||
:param name: ResourceType
|
||||
:param capacity: max
|
||||
:return:
|
||||
"""
|
||||
self._name = name
|
||||
self.capacity = capacity
|
||||
self.mapping = {}
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, n):
|
||||
self._name = n
|
||||
|
||||
def set_capacity(self, element, value):
|
||||
self.mapping[element.uuid] = value
|
||||
|
||||
def unset_capacity(self, element):
|
||||
del self.mapping[element.uuid]
|
||||
|
||||
def get_capacity_by_uuid(self, uuid):
|
||||
try:
|
||||
return self.mapping[str(uuid)]
|
||||
except KeyError:
|
||||
raise exception.CapacityNotDefined(
|
||||
capacity=self.name.value, resource=str(uuid))
|
||||
|
||||
def get_capacity(self, element):
|
||||
return self.get_capacity_by_uuid(element.uuid)
|
||||
@@ -172,22 +172,6 @@ class ModelRoot(nx.DiGraph, base.Model):
|
||||
return {inst.uuid: inst for inst in self.nodes()
|
||||
if isinstance(inst, element.Instance)}
|
||||
|
||||
@lockutils.synchronized("model_root")
|
||||
def get_resource_by_uuid(self, resource_id):
|
||||
# TODO(v-francoise): deprecate this method
|
||||
# This is a trick to keep the compatibility with the old model root
|
||||
class Resource(object):
|
||||
def __init__(self, resource_id):
|
||||
if isinstance(resource_id, element.ResourceType):
|
||||
resource_id = resource_id.value
|
||||
self.resource_id = resource_id
|
||||
|
||||
def get_capacity(self, element):
|
||||
# We ignore element because value already contains the value
|
||||
return getattr(element, self.resource_id)
|
||||
|
||||
return Resource(resource_id)
|
||||
|
||||
@lockutils.synchronized("model_root")
|
||||
def get_node_instances(self, node):
|
||||
self.assert_node(node)
|
||||
|
||||
@@ -64,23 +64,19 @@ class NovaNotification(base.NotificationEndpoint):
|
||||
instance_data = data['nova_object.data']
|
||||
instance_flavor_data = instance_data['flavor']['nova_object.data']
|
||||
|
||||
instance.update({
|
||||
'state': instance_data['state'],
|
||||
'hostname': instance_data['host_name'],
|
||||
'human_id': instance_data['display_name'],
|
||||
})
|
||||
|
||||
memory_mb = instance_flavor_data['memory_mb']
|
||||
num_cores = instance_flavor_data['vcpus']
|
||||
disk_gb = instance_flavor_data['root_gb']
|
||||
|
||||
self.update_capacity(element.ResourceType.memory, instance, memory_mb)
|
||||
self.update_capacity(
|
||||
element.ResourceType.vcpus, instance, num_cores)
|
||||
self.update_capacity(
|
||||
element.ResourceType.disk, instance, disk_gb)
|
||||
self.update_capacity(
|
||||
element.ResourceType.disk_capacity, instance, disk_gb)
|
||||
instance.update({
|
||||
'state': instance_data['state'],
|
||||
'hostname': instance_data['host_name'],
|
||||
'human_id': instance_data['display_name'],
|
||||
'memory': memory_mb,
|
||||
'vcpus': num_cores,
|
||||
'disk': disk_gb,
|
||||
'disk_capacity': disk_gb,
|
||||
})
|
||||
|
||||
try:
|
||||
node = self.get_or_create_node(instance_data['host'])
|
||||
@@ -91,27 +87,20 @@ class NovaNotification(base.NotificationEndpoint):
|
||||
|
||||
self.update_instance_mapping(instance, node)
|
||||
|
||||
def update_capacity(self, resource_id, obj, value):
|
||||
setattr(obj, resource_id.value, value)
|
||||
|
||||
def legacy_update_instance(self, instance, data):
|
||||
instance.update({
|
||||
'state': data['state'],
|
||||
'hostname': data['hostname'],
|
||||
'human_id': data['display_name'],
|
||||
})
|
||||
|
||||
memory_mb = data['memory_mb']
|
||||
num_cores = data['vcpus']
|
||||
disk_gb = data['root_gb']
|
||||
|
||||
self.update_capacity(element.ResourceType.memory, instance, memory_mb)
|
||||
self.update_capacity(
|
||||
element.ResourceType.vcpus, instance, num_cores)
|
||||
self.update_capacity(
|
||||
element.ResourceType.disk, instance, disk_gb)
|
||||
self.update_capacity(
|
||||
element.ResourceType.disk_capacity, instance, disk_gb)
|
||||
instance.update({
|
||||
'state': data['state'],
|
||||
'hostname': data['hostname'],
|
||||
'human_id': data['display_name'],
|
||||
'memory': memory_mb,
|
||||
'vcpus': num_cores,
|
||||
'disk': disk_gb,
|
||||
'disk_capacity': disk_gb,
|
||||
})
|
||||
|
||||
try:
|
||||
node = self.get_or_create_node(data['host'])
|
||||
@@ -147,16 +136,12 @@ class NovaNotification(base.NotificationEndpoint):
|
||||
uuid=node_hostname,
|
||||
hostname=_node.hypervisor_hostname,
|
||||
state=_node.state,
|
||||
status=_node.status)
|
||||
|
||||
self.update_capacity(
|
||||
element.ResourceType.memory, node, _node.memory_mb)
|
||||
self.update_capacity(
|
||||
element.ResourceType.vcpus, node, _node.vcpus)
|
||||
self.update_capacity(
|
||||
element.ResourceType.disk, node, _node.free_disk_gb)
|
||||
self.update_capacity(
|
||||
element.ResourceType.disk_capacity, node, _node.local_gb)
|
||||
status=_node.status,
|
||||
memory=_node.memory_mb,
|
||||
vcpus=_node.vcpus,
|
||||
disk=_node.free_disk_gb,
|
||||
disk_capacity=_node.local_gb,
|
||||
)
|
||||
return node
|
||||
except Exception as exc:
|
||||
LOG.exception(exc)
|
||||
@@ -176,6 +161,7 @@ class NovaNotification(base.NotificationEndpoint):
|
||||
node = self.create_compute_node(uuid)
|
||||
LOG.debug("New compute node created: %s", uuid)
|
||||
self.cluster_data_model.add_node(node)
|
||||
LOG.debug("New compute node mapped: %s", uuid)
|
||||
return node
|
||||
|
||||
def update_instance_mapping(self, instance, node):
|
||||
|
||||
Reference in New Issue
Block a user