Fixed missing attribute in the data model

Querying compute.node.* with Ceilometer requires some additional
information in the cluster data model in order to build the
resource_id. This patchset add the attribute hostname and change
the query.

Change-Id: Ifcefcd70a6d0f5967ab4f638ce077e38ef214f64
Closes-Bug: #1521559
This commit is contained in:
Jean-Emile DARTOIS
2015-12-01 12:21:47 +01:00
parent ee82531314
commit da4c9125f7
8 changed files with 44 additions and 19 deletions

View File

@@ -15,11 +15,12 @@
# limitations under the License. # limitations under the License.
class NamedElement(object): class ComputeResource(object):
def __init__(self): def __init__(self):
self._uuid = "" self._uuid = ""
self._human_id = "" self._human_id = ""
self._hostname = ""
@property @property
def uuid(self): def uuid(self):
@@ -29,6 +30,14 @@ class NamedElement(object):
def uuid(self, u): def uuid(self, u):
self._uuid = u self._uuid = u
@property
def hostname(self):
return self._hostname
@hostname.setter
def hostname(self, h):
self._hostname = h
@property @property
def human_id(self): def human_id(self):
return self._human_id return self._human_id

View File

@@ -13,13 +13,15 @@
# implied. # implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from watcher.decision_engine.model.compute_resource import ComputeResource
from watcher.decision_engine.model.hypervisor_state import HypervisorState from watcher.decision_engine.model.hypervisor_state import HypervisorState
from watcher.decision_engine.model.named_element import NamedElement
from watcher.decision_engine.model.power_state import PowerState from watcher.decision_engine.model.power_state import PowerState
class Hypervisor(NamedElement): class Hypervisor(ComputeResource):
def __init__(self): def __init__(self):
super(Hypervisor, self).__init__()
self._state = HypervisorState.ONLINE self._state = HypervisorState.ONLINE
self._status = HypervisorState.ENABLED self._status = HypervisorState.ENABLED
self._power_state = PowerState.g0 self._power_state = PowerState.g0

View File

@@ -13,12 +13,13 @@
# implied. # implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from watcher.decision_engine.model.named_element import NamedElement from watcher.decision_engine.model.compute_resource import ComputeResource
from watcher.decision_engine.model.vm_state import VMState from watcher.decision_engine.model.vm_state import VMState
class VM(NamedElement): class VM(ComputeResource):
def __init__(self): def __init__(self):
super(VM, self).__init__()
self._state = VMState.ACTIVE.value self._state = VMState.ACTIVE.value
@property @property

View File

@@ -257,8 +257,10 @@ class BasicConsolidation(BaseStrategy):
:param model: :param model:
:return: :return:
""" """
resource_id = "{0}_{1}".format(hypervisor.uuid,
hypervisor.hostname)
cpu_avg_vm = self.ceilometer. \ cpu_avg_vm = self.ceilometer. \
statistic_aggregation(resource_id=hypervisor.uuid, statistic_aggregation(resource_id=resource_id,
meter_name='compute.node.cpu.percent', meter_name='compute.node.cpu.percent',
period="7200", period="7200",
aggregate='avg' aggregate='avg'
@@ -266,7 +268,7 @@ class BasicConsolidation(BaseStrategy):
if cpu_avg_vm is None: if cpu_avg_vm is None:
LOG.error( LOG.error(
"No values returned for {0} compute.node.cpu.percent".format( "No values returned for {0} compute.node.cpu.percent".format(
hypervisor.uuid)) resource_id))
cpu_avg_vm = 100 cpu_avg_vm = 100
cpu_capacity = model.get_resource_from_id( cpu_capacity = model.get_resource_from_id(

View File

@@ -54,6 +54,7 @@ class NovaClusterModelCollector(BaseClusterModelCollector):
# create hypervisor in cluster_model_collector # create hypervisor in cluster_model_collector
hypervisor = Hypervisor() hypervisor = Hypervisor()
hypervisor.uuid = service.host hypervisor.uuid = service.host
hypervisor.hostname = h.hypervisor_hostname
# set capacity # set capacity
mem.set_capacity(hypervisor, h.memory_mb) mem.set_capacity(hypervisor, h.memory_mb)
disk.set_capacity(hypervisor, h.free_disk_gb) disk.set_capacity(hypervisor, h.free_disk_gb)

View File

@@ -58,8 +58,11 @@ class FakerModelCollector(BaseClusterModelCollector):
for i in range(0, count_node): for i in range(0, count_node):
node_uuid = "Node_{0}".format(i) node_uuid = "Node_{0}".format(i)
hypervisor = Hypervisor() hypervisor = Hypervisor()
hypervisor.uuid = node_uuid hypervisor.uuid = node_uuid
hypervisor.hostname = "host_{0}".format(i)
mem.set_capacity(hypervisor, 132) mem.set_capacity(hypervisor, 132)
disk.set_capacity(hypervisor, 250) disk.set_capacity(hypervisor, 250)
num_cores.set_capacity(hypervisor, 40) num_cores.set_capacity(hypervisor, 40)
@@ -111,6 +114,7 @@ class FakerModelCollector(BaseClusterModelCollector):
node_uuid = "Node_{0}".format(i) node_uuid = "Node_{0}".format(i)
node = Hypervisor() node = Hypervisor()
node.uuid = node_uuid node.uuid = node_uuid
node.hostname = "hostname_{0}".format(i)
mem.set_capacity(node, 132) mem.set_capacity(node, 132)
disk.set_capacity(node, 250) disk.set_capacity(node, 250)
@@ -182,6 +186,7 @@ class FakerModelCollector(BaseClusterModelCollector):
node_uuid = "Node_{0}".format(i) node_uuid = "Node_{0}".format(i)
node = Hypervisor() node = Hypervisor()
node.uuid = node_uuid node.uuid = node_uuid
node.hostname = "hostname_{0}".format(i)
mem.set_capacity(node, 132) mem.set_capacity(node, 132)
disk.set_capacity(node, 250) disk.set_capacity(node, 250)
num_cores.set_capacity(node, 40) num_cores.set_capacity(node, 40)
@@ -219,6 +224,8 @@ class FakerModelCollector(BaseClusterModelCollector):
node_uuid = "Node_{0}".format(i) node_uuid = "Node_{0}".format(i)
node = Hypervisor() node = Hypervisor()
node.uuid = node_uuid node.uuid = node_uuid
node.hostname = "hostname_{0}".format(i)
mem.set_capacity(node, 132) mem.set_capacity(node, 132)
disk.set_capacity(node, 250) disk.set_capacity(node, 250)
num_cores.set_capacity(node, 40) num_cores.set_capacity(node, 40)
@@ -281,6 +288,7 @@ class FakerModelCollector(BaseClusterModelCollector):
node_uuid = "Node_{0}".format(i) node_uuid = "Node_{0}".format(i)
node = Hypervisor() node = Hypervisor()
node.uuid = node_uuid node.uuid = node_uuid
node.hostname = "hostname_{0}".format(i)
mem.set_capacity(node, 132) mem.set_capacity(node, 132)
disk.set_capacity(node, 250) disk.set_capacity(node, 250)
@@ -328,6 +336,7 @@ class FakerModelCollector(BaseClusterModelCollector):
node_uuid = "Node_{0}".format(i) node_uuid = "Node_{0}".format(i)
node = Hypervisor() node = Hypervisor()
node.uuid = node_uuid node.uuid = node_uuid
node.hostname = "hostname_{0}".format(i)
mem.set_capacity(node, 1) mem.set_capacity(node, 1)
disk.set_capacity(node, 1) disk.set_capacity(node, 1)
@@ -359,6 +368,7 @@ class FakerModelCollector(BaseClusterModelCollector):
node_uuid = "Node_" + str(i) node_uuid = "Node_" + str(i)
node = Hypervisor() node = Hypervisor()
node.uuid = node_uuid node.uuid = node_uuid
node.hostname = "hostname_{0}".format(i)
mem.set_capacity(node, 4) mem.set_capacity(node, 4)
disk.set_capacity(node, 4) disk.set_capacity(node, 4)

View File

@@ -49,20 +49,20 @@ class FakerMetricsCollector(object):
# Normalize # Normalize
mock = {} mock = {}
# node 0 # node 0
mock['Node_0'] = 7 mock['Node_0_hostname_0'] = 7
mock['Node_1'] = 7 mock['Node_1_hostname_1'] = 7
# node 1 # node 1
mock['Node_2'] = 80 mock['Node_2_hostname_2'] = 80
# node 2 # node 2
mock['Node_3'] = 5 mock['Node_3_hostname_3'] = 5
mock['Node_4'] = 5 mock['Node_4_hostname_4'] = 5
mock['Node_5'] = 10 mock['Node_5_hostname_5'] = 10
# node 3 # node 3
mock['Node_6'] = 8 mock['Node_6_hostname_6'] = 8
mock['Node_19'] = 10 mock['Node_19_hostname_19'] = 10
# node 4 # node 4
mock['VM_7'] = 4 mock['VM_7_hostname_7'] = 4
if uuid not in mock.keys(): if uuid not in mock.keys():
# mock[uuid] = random.randint(1, 4) # mock[uuid] = random.randint(1, 4)

View File

@@ -16,17 +16,17 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
from watcher.decision_engine.model.named_element import NamedElement from watcher.decision_engine.model.compute_resource import ComputeResource
from watcher.tests import base from watcher.tests import base
class TestNamedElement(base.BaseTestCase): class TestNamedElement(base.BaseTestCase):
def test_namedelement(self): def test_namedelement(self):
id = NamedElement() id = ComputeResource()
id.uuid = "BLABLABLA" id.uuid = "BLABLABLA"
self.assertEqual(id.uuid, "BLABLABLA") self.assertEqual(id.uuid, "BLABLABLA")
def test_set_get_human_id(self): def test_set_get_human_id(self):
id = NamedElement() id = ComputeResource()
id.human_id = "BLABLABLA" id.human_id = "BLABLABLA"
self.assertEqual(id.human_id, "BLABLABLA") self.assertEqual(id.human_id, "BLABLABLA")