blob: 83356c0b14f555b08adfef0be1263a48f33504c2 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2016 RIFT.IO Inc
#
# 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 os
import unittest
import xmlrunner
import rw_peas
import gi
gi.require_version("RwcalYang", "1.0")
gi.require_version("RwMon", "1.0")
gi.require_version("RwmonYang", "1.0")
gi.require_version("RwTypes", "1.0")
from gi.repository import (
RwmonYang,
RwcalYang,
RwTypes,
)
class TestNullDataSource(unittest.TestCase):
def setUp(self):
plugin = rw_peas.PeasPlugin("rwmon_mock", 'RwMon-1.0')
self.plugin = plugin.get_interface("Monitoring")
self.account = RwcalYang.CloudAccount()
self.vim_id = "test-vim-id"
def test_null_data_source(self):
"""
By default, the NFVI metrics plugin mock installs a 'null'
implementation that simply returns empty NFVI structures.
"""
status, metrics = self.plugin.nfvi_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics, RwmonYang.NfviMetrics())
status, metrics = self.plugin.nfvi_vcpu_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics, RwmonYang.NfviMetrics_Vcpu())
status, metrics = self.plugin.nfvi_memory_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics, RwmonYang.NfviMetrics_Memory())
status, metrics = self.plugin.nfvi_storage_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics, RwmonYang.NfviMetrics_Storage())
status, result = self.plugin.nfvi_metrics_available(self.account)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertTrue(result)
class TestMockDataSource(unittest.TestCase):
def setUp(self):
plugin = rw_peas.PeasPlugin("rwmon_mock", 'RwMon-1.0')
self.plugin = plugin.get_interface("Monitoring")
self.plugin.set_impl(MockDataSource())
self.account = RwcalYang.CloudAccount()
self.vim_id = "test-vim-id"
def test_mock_data_source(self):
"""
This test installs a mock data source implementation in the plugin,
which returns known values. This test simply checks the expected values
are indeed returned.
"""
expected_vcpu_metrics = RwmonYang.NfviMetrics_Vcpu()
expected_vcpu_metrics.utilization = 50.0
expected_vcpu_metrics.total = 100
status, metrics = self.plugin.nfvi_vcpu_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics.total, expected_vcpu_metrics.total)
self.assertEqual(metrics.utilization, expected_vcpu_metrics.utilization)
expected_memory_metrics = RwmonYang.NfviMetrics_Memory()
expected_memory_metrics.used = 90
expected_memory_metrics.total = 100
expected_memory_metrics.utilization = 90/100
status, metrics = self.plugin.nfvi_memory_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics.used, expected_memory_metrics.used)
self.assertEqual(metrics.total, expected_memory_metrics.total)
self.assertEqual(metrics.utilization, expected_memory_metrics.utilization)
expected_storage_metrics = RwmonYang.NfviMetrics_Storage()
expected_storage_metrics.used = 300
expected_storage_metrics.total = 500
expected_storage_metrics.utilization = 300/500
status, metrics = self.plugin.nfvi_storage_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics.used, expected_storage_metrics.used)
self.assertEqual(metrics.total, expected_storage_metrics.total)
self.assertEqual(metrics.utilization, expected_storage_metrics.utilization)
status, metrics = self.plugin.nfvi_metrics(self.account, self.vim_id)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertEqual(metrics.vcpu.total, expected_vcpu_metrics.total)
self.assertEqual(metrics.vcpu.utilization, expected_vcpu_metrics.utilization)
self.assertEqual(metrics.storage.used, expected_storage_metrics.used)
self.assertEqual(metrics.storage.total, expected_storage_metrics.total)
self.assertEqual(metrics.storage.utilization, expected_storage_metrics.utilization)
self.assertEqual(metrics.memory.used, expected_memory_metrics.used)
self.assertEqual(metrics.memory.total, expected_memory_metrics.total)
self.assertEqual(metrics.memory.utilization, expected_memory_metrics.utilization)
status, result = self.plugin.nfvi_metrics_available(self.account)
self.assertEqual(status, RwTypes.RwStatus.SUCCESS)
self.assertTrue(result)
class TestMockAlarms(unittest.TestCase):
def setUp(self):
plugin = rw_peas.PeasPlugin("rwmon_mock", 'RwMon-1.0')
self.mock = MockAlarmInterface()
self.plugin = plugin.get_interface("Monitoring")
self.plugin.set_impl(self.mock)
self.account = RwcalYang.CloudAccount()
self.alarm = RwmonYang.Alarm(name='test-alarm')
self.vim_id = 'test-vim-id'
def test(self):
"""
This test uses a simple, mock implementation of the alarm interface to
check that create, update, delete, and list work correctly.
"""
# In the beginning, there were no alarms
_, alarms = self.plugin.do_alarm_list(self.account)
self.assertEqual(0, len(alarms))
# Create two alarms
self.plugin.do_alarm_create(self.account, self.vim_id, RwmonYang.Alarm())
self.plugin.do_alarm_create(self.account, self.vim_id, RwmonYang.Alarm())
_, alarms = self.plugin.do_alarm_list(self.account)
self.assertEqual(2, len(alarms))
# The alarms should have no names
alarms.sort(key=lambda a: a.alarm_id)
self.assertEqual('test-alarm-id-1', alarms[0].alarm_id)
self.assertEqual('test-alarm-id-2', alarms[1].alarm_id)
self.assertTrue(all(a.name is None for a in alarms))
# Give names to the alarms
alarms[0].name = 'test-alarm'
alarms[1].name = 'test-alarm'
self.plugin.do_alarm_update(self.account, alarms[0])
self.plugin.do_alarm_update(self.account, alarms[1])
self.assertTrue(all(a.name == 'test-alarm' for a in alarms))
# Delete the alarms
self.plugin.do_alarm_delete(self.account, alarms[0].alarm_id)
self.plugin.do_alarm_delete(self.account, alarms[1].alarm_id)
_, alarms = self.plugin.do_alarm_list(self.account)
self.assertEqual(0, len(alarms))
class MockAlarmInterface(object):
"""
This class is mock impementation for the alarm interface on the monitoring
plugin.
"""
def __init__(self):
self.count = 0
self.alarms = dict()
def alarm_create(self, account, vim_id, alarm):
self.count += 1
alarm_id = 'test-alarm-id-{}'.format(self.count)
alarm.alarm_id = alarm_id
self.alarms[alarm_id] = alarm
def alarm_update(self, account, alarm):
assert alarm.alarm_id is not None
self.alarms[alarm.alarm_id] = alarm
def alarm_delete(self, account, alarm_id):
del self.alarms[alarm_id]
def alarm_list(self, account):
return list(self.alarms.values())
class MockDataSource(object):
"""
This class implements the data source interface used by the monitoring
plugin and provides mock data for testing.
"""
def nfvi_metrics(self, account, vm_id):
metrics = RwmonYang.NfviMetrics()
metrics.vcpu = self.nfvi_vcpu_metrics(account, vm_id)
metrics.memory = self.nfvi_memory_metrics(account, vm_id)
metrics.storage = self.nfvi_storage_metrics(account, vm_id)
return metrics
def nfvi_vcpu_metrics(self, account, vm_id):
metrics = RwmonYang.NfviMetrics_Vcpu()
metrics.total = 100
metrics.utilization = 50.0
return metrics
def nfvi_memory_metrics(self, account, vm_id):
metrics = RwmonYang.NfviMetrics_Memory()
metrics.used = 90
metrics.total = 100
metrics.utilization = 90/100
return metrics
def nfvi_storage_metrics(self, account, vm_id):
metrics = RwmonYang.NfviMetrics_Storage()
metrics.used = 300
metrics.total = 500
metrics.utilization = 300/500
return metrics
def nfvi_metrics_available(self, account):
return True
def main():
runner = xmlrunner.XMLTestRunner(output=os.environ["RIFT_MODULE_TEST"])
unittest.main(testRunner=runner)
if __name__ == '__main__':
main()
# vim: sw=4