class TestDellDeviceMap(BaseTestCase): def afterSetUp(self): super(TestDellDeviceMap, self).afterSetUp() self.adm = ApplyDataMap() self.ddmap = DellDeviceMap() self.device = self.dmd.Devices.createInstance('testDevice') def testWin2003Server(self): results = loads( "((dp1\nS'setHWSerialNumber'\np2\nS'DTG4C91'\np3\nsS'setHWProductKey'\np4\nS'PowerEdge 850'\np5\nsS'setOSProductKey'\np6\nS'Microsoft Windows Server 2003, Enterprise Edition'\np7\ns(dtp8\n." ) # Verify that the modeler plugin processes the data properly. om = self.ddmap.process(self.device, results, log) self.assertEquals(om.setHWSerialNumber, 'DTG4C91') self.assertEquals(om.setHWProductKey.args[0], 'PowerEdge 850') self.assertEquals(om.setHWProductKey.args[1], 'Dell') self.assertEquals(om.setOSProductKey.args[0], 'Microsoft Windows Server 2003, Enterprise Edition') self.assertEquals(om.setOSProductKey.args[1], 'Microsoft') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getHWSerialNumber(), 'DTG4C91') self.assertEquals(self.device.getHWManufacturerName(), 'Dell') self.assertEquals(self.device.getHWProductName(), 'PowerEdge 850') self.assertEquals(self.device.getOSManufacturerName(), 'Microsoft') self.assertEquals(self.device.getOSProductName(), 'Microsoft Windows Server 2003, Enterprise Edition')
class TestDellDeviceMap(BaseTestCase): def afterSetUp(self): super(TestDellDeviceMap, self).afterSetUp() self.adm = ApplyDataMap() self.ddmap = DellDeviceMap() self.device = self.dmd.Devices.createInstance('testDevice') def testWin2003Server(self): results = loads("((dp1\nS'setHWSerialNumber'\np2\nS'DTG4C91'\np3\nsS'setHWProductKey'\np4\nS'PowerEdge 850'\np5\nsS'setOSProductKey'\np6\nS'Microsoft Windows Server 2003, Enterprise Edition'\np7\ns(dtp8\n.") # Verify that the modeler plugin processes the data properly. om = self.ddmap.process(self.device, results, log) self.assertEquals(om.setHWSerialNumber, 'DTG4C91') self.assertEquals(om.setHWProductKey.args[0], 'PowerEdge 850') self.assertEquals(om.setHWProductKey.args[1], 'Dell') self.assertEquals(om.setOSProductKey.args[0], 'Microsoft Windows Server 2003, Enterprise Edition') self.assertEquals(om.setOSProductKey.args[1], 'Microsoft') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getHWSerialNumber(), 'DTG4C91') self.assertEquals(self.device.getHWManufacturerName(), 'Dell') self.assertEquals(self.device.getHWProductName(), 'PowerEdge 850') self.assertEquals(self.device.getOSManufacturerName(), 'Microsoft') self.assertEquals(self.device.getOSProductName(), 'Microsoft Windows Server 2003, Enterprise Edition')
def setApplyDataMapToOpenStackInfrastructureHost(self, datamap): mapper = ApplyDataMap() component = DeviceProxyComponent.component_for_proxy_device(self) if not component: log.error("Unable to apply datamap to proxy component for %s (component not found)" % self) else: mapper._applyDataMap(component, datamap)
def setApplyDataMapToProxyComponent(self, datamap): mapper = ApplyDataMap() component = DeviceProxyComponent.component_for_proxy_device(self) if not component: LOG.error("Unable to apply datamap to proxy component for %s (component not found)" % self) else: mapper._applyDataMap(component, datamap)
def setApplyDataMapToProxyComponent(self, datamap): mapper = ApplyDataMap() component = DeviceProxyComponent.component_for_proxy_device(self) if not component: LOG.error( "Unable to apply datamap to proxy component for %s (component not found)" % self) else: mapper._applyDataMap(component, datamap)
def setApplyDataMapToOpenStackInfrastructureHost(self, datamap): mapper = ApplyDataMap() component = DeviceProxyComponent.component_for_proxy_device(self) if not component: log.error( "Unable to apply datamap to proxy component for %s (component not found)" % self) else: mapper._applyDataMap(component, datamap)
def process(evt, device, dmd, txnCommit): (idfunc, mapper) = MAPPERS.get(evt.eventClassKey, (None, None)) if idfunc: evt.component = idfunc(evt) if mapper: datamaps = mapper(device, dmd, evt) if datamaps: adm = ApplyDataMap(device) for datamap in datamaps: # LOG.debug("Applying %s" % datamap) adm._applyDataMap(device, datamap) return len(datamaps) else: return 0
def remote_applyDataMaps(self, device, datamaps): device = self.getPerformanceMonitor().findDevice(device) applicator = ApplyDataMap(self) changed = False for datamap in datamaps: if applicator._applyDataMap(device, datamap): changed = True return changed
def remote_applyDataMaps(self, device, datamaps): """Patching command datasource to add partial remodeling""" from Products.DataCollector.ApplyDataMap import ApplyDataMap device = self.getPerformanceMonitor().findDevice(device) applicator = ApplyDataMap(self) changed = False for datamap in datamaps: if applicator._applyDataMap(device, datamap): changed = True return changed
def remote_applyDataMaps(self, device, datamaps): device_obj = self.getPerformanceMonitor().findDevice(device) if device_obj is None: log.warn("Device '%s' no longer exists. Discarding pending datamaps." % device) return False applicator = ApplyDataMap(self) changed = False for datamap in datamaps: if applicator._applyDataMap(device_obj, datamap): changed = True return changed
def remote_applyDataMaps(self, device, maps, devclass=None, setLastCollection=False): from Products.DataCollector.ApplyDataMap import ApplyDataMap device = self.getPerformanceMonitor().findDeviceByIdExact(device) adm = ApplyDataMap(self) adm.setDeviceClass(device, devclass) changed = False #with pausedAndOptimizedIndexing(): for map in maps: preadmdata = self.pre_adm_check(map, device) start_time = time.time() if adm._applyDataMap(device, map, commit=False): changed = True end_time = time.time() - start_time changesubject = "device" if changed else "nothing" if hasattr(map, "relname"): log.debug( "Time in _applyDataMap for Device %s with relmap %s objects: %.2f, %s changed.", device.getId(), map.relname, end_time, changesubject) elif hasattr(map, "modname"): log.debug( "Time in _applyDataMap for Device %s with objectmap, size of %d attrs: %.2f, %s changed.", device.getId(), len(map.items()), end_time, changesubject) else: log.debug( "Time in _applyDataMap for Device %s: %.2f . Could not find if relmap or objmap, %s changed.", device.getId(), end_time, changesubject) self.post_adm_process(map, device, preadmdata) if setLastCollection: device.setSnmpLastCollection() return changed
def remote_applyDataMaps(self, device, maps, devclass=None, setLastCollection=False): from Products.DataCollector.ApplyDataMap import ApplyDataMap device = self.getPerformanceMonitor().findDeviceByIdExact(device) adm = ApplyDataMap(self) adm.setDeviceClass(device, devclass) changed = False #with pausedAndOptimizedIndexing(): for map in maps: # make a copy because ApplyDataMap will modify the data map. datamap = copy.deepcopy(map) preadmdata = self.pre_adm_check(datamap, device) start_time = time.time() if adm._applyDataMap(device, datamap, commit=False): changed = True end_time = time.time() - start_time changesubject = "device" if changed else "nothing" if hasattr(datamap, "relname"): log.debug( "Time in _applyDataMap for Device %s with relmap %s objects: %.2f, %s changed.", device.getId(), datamap.relname, end_time, changesubject) elif hasattr(datamap, "modname"): log.debug( "Time in _applyDataMap for Device %s with objectmap, size of %d attrs: %.2f, %s changed.", device.getId(), len(datamap.items()), end_time, changesubject) else: log.debug( "Time in _applyDataMap for Device %s: %.2f . Could not find if relmap or objmap, %s changed.", device.getId(), end_time, changesubject) self.post_adm_process(datamap, device, preadmdata) if setLastCollection: device.setSnmpLastCollection() return changed
class ApplyDataMapTest(BaseTestCase): def afterSetUp(self): super(ApplyDataMapTest, self).afterSetUp() self.adm = ApplyDataMap() def test_applyDataMap_relmap(self): compname = "module/component" relname = "relationship" datamap = RelationshipMap() device = Device(id='test_device') device.dmd = self.dmd self.adm.applyDataMap(device, datamap, datamap.relname, datamap.compname) def test_applyDataMap_relmapException(self): '''test_applyDataMap_exception is mostly the same as test_applyDataMap_relmap - difference #1: compname is commented out - difference #2: with self.assertRaises(AttributeError) is added ''' dmd = self.dmd class datamap(list): #compname = "a/b" relname = "c" class Device(object): def deviceClass(self): return dmd.Devices class dmd: "Used for faking sync()" class _p_jar: @staticmethod def sync(): pass def getObjByPath(self, path): return reduce(getattr, path.split("/"), self) class a: class b: class c: "The relationship to populate" @staticmethod def objectIdsAll(): "returns the list of object ids in this relationship" return [] with self.assertRaises(AttributeError) as theException: self.adm.applyDataMap(Device(), datamap(), datamap.relname, datamap.compname) self.assertEqual(theException.exception.message, "type object 'datamap' has no attribute 'compname'") def testNoChangeAllComponentsLocked(self): device = self.dmd.Devices.createInstance('testDevice') # Create an IP interface device.os.addIpInterface('eth0', False) iface = device.os.interfaces._getOb('eth0') iface.lockFromDeletion() # Apply a RelMap with no interfaces relmap = RelationshipMap("interfaces", "os", "Products.ZenModel.IpInterface") self.assertFalse(self.adm._applyDataMap(device, relmap)) self.assertEquals(1, len(device.os.interfaces))
class ApplyDataMapTest(BaseTestCase): def afterSetUp(self): super(ApplyDataMapTest, self).afterSetUp() self.adm = ApplyDataMap() def test_updateObject_encoding(self): for enc in ('ascii', 'latin-1', 'utf-8', 'utf-16'): obj = _obj() obj.zCollectorDecoding = enc objmap = eval(enc.replace('-', '') + '_objmap') self.adm._updateObject(obj, objmap) for key in objmap: self.assertEqual(getattr(obj, key), objmap[key].decode(enc)) def test_applyDataMap_relmap(self): dmd = self.dmd class datamap(list): compname = "a/b" relname = "c" class Device(object): def deviceClass(self): return dmd.Devices class dmd: "Used for faking sync()" class _p_jar: @staticmethod def sync(): pass def getObjByPath(self, path): return reduce(getattr, path.split("/"), self) def getId(self): return "testDevice" class a: class b: class c: "The relationship to populate" @staticmethod def objectIdsAll(): "returns the list of object ids in this relationship" return [] self.adm.applyDataMap(Device(), datamap(), datamap.relname, datamap.compname) def test_applyDataMap_relmapException(self): '''test_applyDataMap_exception is mostly the same as test_applyDataMap_relmap - difference #1: compname is commented out - difference #2: with self.assertRaises(AttributeError) is added ''' dmd = self.dmd class datamap(list): #compname = "a/b" relname = "c" class Device(object): def deviceClass(self): return dmd.Devices class dmd: "Used for faking sync()" class _p_jar: @staticmethod def sync(): pass def getObjByPath(self, path): return reduce(getattr, path.split("/"), self) class a: class b: class c: "The relationship to populate" @staticmethod def objectIdsAll(): "returns the list of object ids in this relationship" return [] with self.assertRaises(AttributeError) as theException: self.adm.applyDataMap(Device(), datamap(), datamap.relname, datamap.compname) self.assertEqual(theException.exception.message, "type object 'datamap' has no attribute 'compname'") def testNoChangeAllComponentsLocked(self): device = self.dmd.Devices.createInstance('testDevice') # Create an IP interface device.os.addIpInterface('eth0', False) iface = device.os.interfaces._getOb('eth0') iface.lockFromDeletion() # Apply a RelMap with no interfaces relmap = RelationshipMap("interfaces", "os", "Products.ZenModel.IpInterface") self.assertFalse(self.adm._applyDataMap(device, relmap)) self.assertEquals(1, len(device.os.interfaces))
class ApplyDataMapTest(BaseTestCase): def afterSetUp(self): super(ApplyDataMapTest, self).afterSetUp() self.adm = ApplyDataMap() def test_updateObject_encoding(self): for enc in ('ascii', 'latin-1', 'utf-8', 'utf-16'): obj = _obj() obj.zCollectorDecoding = enc objmap = eval(enc.replace('-','')+'_objmap') self.adm._updateObject(obj, objmap) for key, val in objmap.items(): self.assertEqual(getattr(obj, key), val.decode(enc)) def test_applyDataMap_relmap(self): dmd = self.dmd class datamap(list): compname = "a/b" relname = "c" class Device(object): def deviceClass(self): return dmd.Devices def getPrimaryId(self): return "{}/{}".format(self.deviceClass().getPrimaryId(), self.getId()) class dmd: "Used for faking sync()" class _p_jar: @staticmethod def sync(): pass def getObjByPath(self, path): return reduce(getattr, path.split("/"), self) def getId(self): return "testDevice" class a: class b: class c: "The relationship to populate" @staticmethod def objectIdsAll(): "returns the list of object ids in this relationship" return [] self.adm.applyDataMap(Device(), datamap(), datamap.relname, datamap.compname) def test_applyDataMap_relmapException(self): '''test_applyDataMap_exception is mostly the same as test_applyDataMap_relmap - difference #1: compname is commented out - difference #2: with self.assertRaises(AttributeError) is added ''' dmd = self.dmd class datamap(list): #compname = "a/b" relname = "c" class Device(object): def deviceClass(self): return dmd.Devices class dmd: "Used for faking sync()" class _p_jar: @staticmethod def sync(): pass def getObjByPath(self, path): return reduce(getattr, path.split("/"), self) class a: class b: class c: "The relationship to populate" @staticmethod def objectIdsAll(): "returns the list of object ids in this relationship" return [] with self.assertRaises(AttributeError) as theException: self.adm.applyDataMap(Device(), datamap(), datamap.relname, datamap.compname) self.assertEqual(theException.exception.message, "type object 'datamap' has no attribute 'compname'") def testNoChangeAllComponentsLocked(self): device = self.dmd.Devices.createInstance('testDevice') # Create an IP interface device.os.addIpInterface('eth0', False) iface = device.os.interfaces._getOb('eth0') iface.lockFromDeletion() # Apply a RelMap with no interfaces relmap = RelationshipMap("interfaces", "os", "Products.ZenModel.IpInterface") self.assertFalse(self.adm._applyDataMap(device, relmap)) self.assertEquals(1, len(device.os.interfaces))
def run(self): with open('model.yaml', 'r') as f: self.model_config = yaml.load(f) self.connect() objmaps = [] for modname, obj_attrs in self.get_model_template("Global"): objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) for controller_num in range(1, self.options.controllers + 1): for modname, obj_attrs in self.get_model_template("Controller"): self.talesEvalAttrs( obj_attrs, num=controller_num, device_name=self.options.device ) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) for compute_num in range(1, self.options.computes + 1): for modname, obj_attrs in self.get_model_template("Compute"): self.talesEvalAttrs( obj_attrs, num=compute_num, device_name=self.options.device ) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) for tenant_num in range(3, self.options.tenants + 3): for modname, obj_attrs in self.get_model_template("Tenant"): self.talesEvalAttrs( obj_attrs, num=tenant_num, device_name=self.options.device ) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) compute_nums = range(1, self.options.computes + 1) tenant_nums = range(3, self.options.tenants + 3) for instance_num in range(1, self.options.instances + 1): for modname, obj_attrs in self.get_model_template("Instance"): tenant_num = tenant_nums[instance_num % self.options.tenants] compute_num = compute_nums[instance_num % self.options.computes] self.talesEvalAttrs( obj_attrs, num=instance_num, device_name=self.options.device, tenant_num=tenant_num, compute_num=compute_num ) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) device = self.dmd.Devices.OpenStack.Infrastructure.findDevice(self.options.device) if not device: print "Creating OpenStackInfrastructure device %s" % self.options.device device = self.dmd.Devices.OpenStack.Infrastructure.createInstance(self.options.device) device.setPerformanceMonitor('localhost') for controller_num in range(1, self.options.controllers + 1): device_name = "%s_controller%d" % (self.options.device, controller_num) d = self.dmd.Devices.Server.SSH.Linux.NovaHost.findDevice(device_name) if not d: print "Creating controller device %s" % device_name d = self.dmd.Devices.Server.SSH.Linux.NovaHost.createInstance(device_name) d.setZenProperty('zIpServiceMapMaxPort', 32767) for compute_num in range(1, self.options.computes + 1): device_name = "%s_compute%d" % (self.options.device, compute_num) d = self.dmd.Devices.Server.SSH.Linux.NovaHost.findDevice(device_name) if not d: print "Creating compute device %s" % device_name d = self.dmd.Devices.Server.SSH.Linux.NovaHost.createInstance(device_name) d.setZenProperty('zIpServiceMapMaxPort', 32767) relmap = RelationshipMap(relname='components') for objmap in objmaps: relmap.append(objmap) endpoint_om = ObjectMap( modname='ZenPacks.zenoss.OpenStackInfrastructure.Endpoint', data=dict( set_maintain_proxydevices=True ) ) print "Applying datamaps (1/2) (%d objects)" % len(objmaps) adm = ApplyDataMap() adm._applyDataMap(device, relmap) adm._applyDataMap(device, endpoint_om) print "Gathering network information" l3_agent_ids = [x.id for x in device.getDeviceComponents(type="OpenStackInfrastructureNeutronAgent") if x.type == 'L3 agent'] dhcp_agent_ids = [x.id for x in device.getDeviceComponents(type="OpenStackInfrastructureNeutronAgent") if x.type == 'DHCP agent'] all_network_ids = [x.id for x in device.getDeviceComponents(type="OpenStackInfrastructureNetwork")] all_router_ids = [x.id for x in device.getDeviceComponents(type="OpenStackInfrastructureRouter")] all_subnet_ids = [x.id for x in device.getDeviceComponents(type="OpenStackInfrastructureSubnet")] instance_network_ids = [x.id for x in device.getDeviceComponents(type="OpenStackInfrastructureNetwork") if x.ports() and len([y for y in x.ports() if y.instance()])] instance_subnet_ids = [y.id for y in set(chain.from_iterable([x.subnets() for x in device.getDeviceComponents(type="OpenStackInfrastructureNetwork") if x.ports() and len([y for y in x.ports() if y.instance()])]))] objmaps = [] print "Adding L3 Agent Relationships" for agent_id in l3_agent_ids: objmaps.append(ObjectMap( modname="ZenPacks.zenoss.OpenStackInfrastructure.NeutronAgent", compname="components/%s" % agent_id, data=dict( id=agent_id, set_networks=all_network_ids, set_routers=all_router_ids, set_subnets=all_subnet_ids ))) print "Adding DHCP agent Relationships" for agent_id in dhcp_agent_ids: objmaps.append(ObjectMap( modname="ZenPacks.zenoss.OpenStackInfrastructure.NeutronAgent", compname="components/%s" % agent_id, data=dict( id=agent_id, set_networks=instance_network_ids, set_subnets=instance_subnet_ids ))) print "Adding instance <-> hypervisor relationship" hypervisor_instances = defaultdict(list) for instance_num in range(1, self.options.instances + 1): instance_id = "server-%d" % instance_num compute_num = compute_nums[instance_num % self.options.computes] hypervisor_id = "hypervisor-compute%d.1" % compute_num hypervisor_instances[hypervisor_id].append(instance_id) for hypervisor_id, instance_ids in hypervisor_instances.iteritems(): objmaps.append(ObjectMap( modname="ZenPacks.zenoss.OpenStackInfrastructure.Hypervisor", compname="components/%s" % hypervisor_id, data=dict( id=hypervisor_id, set_instances=instance_ids ))) print "Applying datamaps (2/2) (%d objects)" % len(objmaps) adm = ApplyDataMap() for objmap in objmaps: adm._applyDataMap(device, objmap) print "Committing model changes." transaction.commit()
class TestCpuMap(BaseTestCase): def afterSetUp(self): super(TestCpuMap, self).afterSetUp() self.adm = ApplyDataMap() self.cmap = CpuMap() self.device = self.dmd.Devices.createInstance('testDevice') def testWin2003Server(self): results = loads("((dp1\n(dp2\nS'deviceTableOid'\np3\n(dp4\nS'11'\np5\n(dp6\nS'_type'\np7\nS'.1.3.6.1.2.1.25.3.1.4'\np8\nsS'_description'\np9\nS'Broadcom NetXtreme Gigabit Ethernet - SecuRemote Miniport'\np10\nssS'10'\np11\n(dp12\ng7\nS'.1.3.6.1.2.1.25.3.1.4'\np13\nsg9\nS'Broadcom NetXtreme Gigabit Ethernet #2 - SecuRemote Miniport'\np14\nssS'13'\np15\n(dp16\ng7\nS'.1.3.6.1.2.1.25.3.1.6'\np17\nsg9\nS'Fixed Disk'\np18\nssS'12'\np19\n(dp20\ng7\nS'.1.3.6.1.2.1.25.3.1.6'\np21\nsg9\nS'D:\\\\'\np22\nssS'15'\np23\n(dp24\ng7\nS'.1.3.6.1.2.1.25.3.1.16'\np25\nsg9\nS'5-Buttons (with wheel)'\np26\nssS'14'\np27\n(dp28\ng7\nS'.1.3.6.1.2.1.25.3.1.13'\np29\nsg9\nS'IBM enhanced (101- or 102-key) keyboard, Subtype=(0)'\np30\nssS'16'\np31\n(dp32\ng7\nS'.1.3.6.1.2.1.25.3.1.17'\np33\nsg9\nS'COM1:'\np34\nssS'1'\n(dp35\ng7\nS'.1.3.6.1.2.1.25.3.1.5'\np36\nsg9\nS'WebEx Document Loader'\np37\nssS'3'\n(dp38\ng7\nS'.1.3.6.1.2.1.25.3.1.5'\np39\nsg9\nS'Lexmark X500 Series'\np40\nssS'2'\n(dp41\ng7\nS'.1.3.6.1.2.1.25.3.1.5'\np42\nsg9\nS'Microsoft XPS Document Writer'\np43\nssS'5'\n(dp44\ng7\nS'.1.3.6.1.2.1.25.3.1.5'\np45\nsg9\nS'HP LaserJet 2100 PCL6'\np46\nssS'4'\n(dp47\ng7\nS'.1.3.6.1.2.1.25.3.1.5'\np48\nsg9\nS'HP LaserJet 3050 Series PCL 6'\np49\nssS'7'\n(dp50\ng7\nS'.1.3.6.1.2.1.25.3.1.4'\np51\nsg9\nS'MS TCP Loopback interface'\np52\nssS'6'\n(dp53\ng7\nS'.1.3.6.1.2.1.25.3.1.3'\np54\nsg9\nS'Intel'\np55\nssS'9'\n(dp56\ng7\nS'.1.3.6.1.2.1.25.3.1.4'\np57\nsg9\nS'VMware Virtual Ethernet Adapter for VMnet1'\np58\nssS'8'\n(dp59\ng7\nS'.1.3.6.1.2.1.25.3.1.4'\np60\nsg9\nS'VMware Virtual Ethernet Adapter for VMnet8'\np61\nssstp62\n.") # Verify that the modeler plugin processes the data properly. relmap = self.cmap.process(self.device, results, log) self.assertEquals(relmap.relname, 'cpus') om = relmap.maps[0] self.assertEquals(om.compname, 'hw') self.assertEquals(om.setProductKey.args[0], 'Intel') self.assertEquals(om.setProductKey.args[1], 'Intel') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, relmap) cpu = self.device.hw.cpus()[0] self.assertEquals(cpu.getManufacturerName(), 'Intel') self.assertEquals(cpu.getProductName(), 'Intel') def testCentOS5Server(self): results = loads('((dp1\n(dp2\nS\'deviceTableOid\'\np3\n(dp4\nS\'1025\'\np5\n(dp6\nS\'_type\'\np7\nS\'.1.3.6.1.2.1.25.3.1.4\'\np8\nsS\'_description\'\np9\nS\'network interface lo\'\np10\nssS\'768\'\np11\n(dp12\ng7\nS\'.1.3.6.1.2.1.25.3.1.3\'\np13\nsg9\nS\'GenuineIntel: Intel(R) Core(TM)2 CPU T7400 @ 2.16GHz\'\np14\nssS\'1026\'\np15\n(dp16\ng7\nS\'.1.3.6.1.2.1.25.3.1.4\'\np17\nsg9\nS\'network interface eth0\'\np18\nssS\'1027\'\np19\n(dp20\ng7\nS\'.1.3.6.1.2.1.25.3.1.4\'\np21\nsg9\nS\'network interface sit0\'\np22\nssS\'3072\'\np23\n(dp24\ng7\nS\'.1.3.6.1.2.1.25.3.1.12\'\np25\nsg9\nS"Guessing that there\'s a floating point co-processor"\np26\nssstp27\n.') # Verify that the modeler plugin processes the data properly. relmap = self.cmap.process(self.device, results, log) self.assertEquals(relmap.relname, 'cpus') om = relmap.maps[0] self.assertEquals(om.compname, 'hw') self.assertEquals(om.clockspeed, 2160) self.assertEquals(om.setProductKey.args[0], 'GenuineIntel: Intel(R) Core(TM)2 CPU T7400 @ 2.16GHz') self.assertEquals(om.setProductKey.args[1], 'Intel') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, relmap) cpu = self.device.hw.cpus()[0] self.assertEquals(cpu.clockspeed, 2160) self.assertEquals(cpu.getManufacturerName(), 'Intel') self.assertEquals(cpu.getProductName(), 'GenuineIntel_ Intel(R) Core(TM)2 CPU T7400 _ 2.16GHz') def testGetManufacturerAndModel(self): r = getManufacturerAndModel("Unknown CPU Type") self.assertEquals(r.args[0], "Unknown CPU Type") self.assertEquals(r.args[1], "Unknown") r = getManufacturerAndModel("Intel CPU") self.assertEquals(r.args[0], "Intel CPU") self.assertEquals(r.args[1], "Intel") r = getManufacturerAndModel("Xeon") self.assertEquals(r.args[0], "Xeon") self.assertEquals(r.args[1], "Intel") r = getManufacturerAndModel("Opteron Quad-Core") self.assertEquals(r.args[0], "Opteron Quad-Core") self.assertEquals(r.args[1], "AMD")
class TestEventMappings(zenpacklib.TestCase): disableLogging = False _eventData = None _eventsloaded = False def afterSetUp(self): # needed if this is run directly on the commandline, # since otherwise it will be __main__, and ZPL's afterSetup # will get confused. self.__module__ = 'ZenPacks.zenoss.OpenStackInfrastructure.tests.test_impact' super(TestEventMappings, self).afterSetUp() # Quiet down some noisy logging. # logging.getLogger('zen.OpenStackDeviceProxyComponent').setLevel(logging.ERROR) self._loadEventsData() self.adm = ApplyDataMap() self.queue = ConsolidatingObjectMapQueue() self.clock = 1000.0 def _now(): return self.clock self.queue.now = _now def _loadEventsData(self): if self._eventsloaded: return with open( os.path.join(os.path.dirname(__file__), 'data', 'eventdata.json')) as json_file: self._eventData = json.load(json_file) for event in self._eventData.values(): event['openstack_event_type'] = \ re.sub(r'^openstack-', '', event.get('eventClassKey', '')) if self._eventData: self._eventsloaded = True def model_data(self): if not hasattr(self, '_model_data'): self._model_data = create_model_data(self.dmd) return self._model_data def endpoint(self): ''' Return a OpenStackInfrastructureEndpoint populated in a suitable way for Impact testing. ''' return self.model_data()['endpoint'] def getObjByPath(self, path): try: return self.endpoint().getObjByPath(path) except NotFound: return None def process_event(self, evt): objmap = map_event(evt) if objmap: self.adm._applyDataMap(self.endpoint(), objmap) def test_instance_creation(self): self.assertTrue(self._eventsloaded) self.process_event(self._eventData['scheduler.run_instance.end']) self.process_event(self._eventData['compute.instance.create.start']) self.process_event(self._eventData['compute.instance.create.end']) instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone( instance5, msg="Incremental model created instance 'instance5'") self.assertTrue(instance5.publicIps is None or instance5.publicIps == []) self.assertTrue(instance5.privateIps is None or instance5.privateIps == []) evt = self._eventData['compute.instance.create.end'] # json would not allow evt.trait_fixed_ips to be a string # but events.py requires it to be a string evt['trait_fixed_ips'] = str(evt['trait_fixed_ips']) self.process_event(evt) self.assertTrue(instance5.privateIps == [u'172.24.4.229']) self.assertTrue(instance5.publicIps is None or instance5.publicIps == []) def _create_instance5(self): self.assertTrue(self._eventsloaded) # # Dummy up the instance (as if test_instance_creation had run, and we had instance5 in the system) from ZenPacks.zenoss.OpenStackInfrastructure.tests.utils import addContained, addNonContained from ZenPacks.zenoss.OpenStackInfrastructure.Instance import Instance instance1 = self.getObjByPath('components/instance1') instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance1, msg="Instance1 is missing from the model!") self.assertIsNone(instance5, msg="Instance5 is already present in model!") instance5 = addContained(self.endpoint(), "components", Instance("server-instance5")) instance5.title = u'instance5' instance5.hostName = 'instance5' instance5.resourceId = u'instance5' instance5.serverId = u'instance5' instance5.serverStatus = u'ACTIVE' addNonContained(instance5, "flavor", instance1.flavor()) addNonContained(instance5, "image", instance1.image()) addNonContained(instance5, "hypervisor", instance1.hypervisor()) addNonContained(instance5, "tenant", instance1.tenant()) return instance5 def test_instance_power_off(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.power_off.start']) self.process_event(self._eventData['compute.instance.power_off.end']) self.assertTrue(instance5.serverStatus == 'shutoff') self.assertTrue(instance5.vmState == 'stopped') self.assertTrue(instance5.powerState == 'shutdown') def test_instance_power_on(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) instance5.serverStatus = 'shutoff' self.assertTrue(instance5.serverStatus == 'shutoff') self.process_event(self._eventData['compute.instance.power_on.start']) self.process_event(self._eventData['compute.instance.power_on.end']) self.assertTrue(instance5.serverStatus == 'active') self.assertTrue(instance5.powerState == 'running') def test_instance_reboot(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.reboot.start']) self.process_event(self._eventData['compute.instance.reboot.end']) self.assertTrue(instance5.serverStatus == 'active') def test_instance_rebuild(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.rebuild.start']) self.process_event(self._eventData['compute.instance.power_off.start']) self.process_event(self._eventData['compute.instance.power_off.end']) self.process_event(self._eventData['compute.instance.rebuild.end']) def test_instance_suspend_resume(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.suspend']) self.assertTrue(instance5.serverStatus == 'suspended') self.assertTrue(instance5.powerState == 'suspended') self.process_event(self._eventData['compute.instance.resume']) self.assertTrue(instance5.serverStatus == 'active') self.assertTrue(instance5.powerState == 'running') def test_instance_delete(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.delete.start']) self.process_event(self._eventData['compute.instance.shutdown.start']) self.process_event(self._eventData['compute.instance.shutdown.end']) self.process_event(self._eventData['compute.instance.delete.end']) instance5 = self.getObjByPath('components/server-instance5') self.assertIsNone(instance5) def test_instance_rescue_unrescue(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.rescue.start']) self.process_event(self._eventData['compute.instance.exists']) self.process_event(self._eventData['compute.instance.rescue.end']) self.assertTrue(instance5.vmState == 'rescued') self.assertTrue(instance5.serverStatus == 'rescue') self.process_event(self._eventData['compute.instance.unrescue.start']) self.process_event(self._eventData['compute.instance.unrescue.end']) self.assertTrue(instance5.serverStatus == 'active') def _create_network(self, network_id): self.assertTrue(self._eventsloaded) ''' Build network using events and network_id''' log.info("Create network '%s'" % network_id) self.process_event(self._eventData['network.create.end']) network = self.getObjByPath('components/network-' + network_id) return network def _delete_network(self, network_id): self.assertTrue(self._eventsloaded) ''' Delete network using events and network_id''' log.info("Delete network '%s'" % network_id) self.process_event(self._eventData['network.delete.end']) network = self.getObjByPath('components/network-' + network_id) return network def _create_subnet(self, network_id, subnet_id): self.assertTrue(self._eventsloaded) ''' Build subnet_id using events and network_id. The network/network_id must already exist. ''' log.info("Create Subnet '%s'" % subnet_id) self.process_event(self._eventData['subnet.create.end']) subnet = self.getObjByPath('components/subnet-' + subnet_id) return subnet def _delete_subnet(self, subnet_id): self.assertTrue(self._eventsloaded) ''' Delete subnet using events and subnet_id''' log.info("Delete Subnet '%s'" % subnet_id) self.process_event(self._eventData['subnet.delete.end']) subnet = self.getObjByPath('components/subnet-' + subnet_id) return subnet def _create_port(self, network_id, port_id): self.assertTrue(self._eventsloaded) ''' Build port_id using events and network_id. The network/network_id must already exist. ''' log.info("Create port '%s'" % port_id) self.process_event(self._eventData['port.create.end']) port = self.getObjByPath('components/port-' + port_id) return port def _delete_port(self, port_id): self.assertTrue(self._eventsloaded) ''' Delete port using events and port_id''' log.info("Delete port '%s'" % port_id) self.process_event(self._eventData['port.delete.end']) port = self.getObjByPath('components/port-' + port_id) return port def _create_router(self, network_id, subnet_id, router_id): self.assertTrue(self._eventsloaded) ''' Build router_id using events, network_id, subnet_id. The network_id, subnet_id must already exist. ''' log.info("Create router '%s'" % router_id) self.process_event(self._eventData['router.create.end']) router = self.getObjByPath('components/router-' + router_id) return router def _delete_router(self, router_id): self.assertTrue(self._eventsloaded) ''' Delete router using events and router_id''' log.info("Delete router '%s'" % router_id) self.process_event(self._eventData['router.delete.end']) router = self.getObjByPath('components/router-' + router_id) return router def _create_floatingip(self, network_id, router_id, port_id, floatingip_id): self.assertTrue(self._eventsloaded) ''' Build floatingip_id using events, network_id, subnet_id. The network_id, subnet_id must already exist. ''' log.info("Create floatingip '%s'" % floatingip_id) self.process_event(self._eventData['floatingip.create.end']) floatingip = self.getObjByPath('components/floatingip-' + floatingip_id) return floatingip def _delete_floatingip(self, floatingip_id): self.assertTrue(self._eventsloaded) ''' Delete floatingip using events and floatingip_id''' log.info("Delete floatingip '%s'" % floatingip_id) self.process_event(self._eventData['floatingip.delete.end']) floatingip = self.getObjByPath('components/floatingip-' + floatingip_id) return floatingip def test_network(self): ''' Test Creation/Deletion of network ''' net = self._create_network("test") self.assertIsNotNone(net, msg="Failure: network doesn't exist!") net = self._delete_network(net.netId) self.assertIsNone(net, msg="Failure: network exists!") def test_subnet(self): ''' Test Creation/Deletion of subnet ''' net = self._create_network("test") self.assertIsNotNone(net, msg="Subnet: network doesn't exist!") subnet = self._create_subnet(net.netId, 'test') self.assertIsNotNone(subnet, msg="Failure: subnet doesn't exist!") subnet = self._delete_subnet(subnet.subnetId) self.assertIsNone(subnet, msg="Failure: subnet exist!") def test_port(self): self.assertTrue(self._eventsloaded) ''' Test Creation/Deletion of port ''' net = self._create_network("test") self.assertIsNotNone(net, msg="CreatePort: network doesn't exist!") port = self._create_port(net.netId, 'test') self.assertIsNotNone(port, msg="CreatePort: port doesn't exist!") port = self._delete_port(port.portId) self.assertIsNone(port, msg="Failure: port exists!") def test_router_and_floatingip(self): self.assertTrue(self._eventsloaded) ''' Test Creation/Deletion of port ''' net = self._create_network("test") subnet = self._create_subnet(net.netId, 'test') port = self._create_port(net.netId, 'test') router = self._create_router(net.netId, subnet.subnetId, 'test') self.assertIsNotNone(router, msg="CreateRouter: router doesn't exist!") f_ip = self._create_floatingip(net.netId, router.routerId, port.portId, 'test') self.assertIsNotNone(f_ip, msg="CreateRouter: FloatingIP doesn't exist!") router = self._delete_router(router.routerId) self.assertIsNone(router, msg="Failure: router exists!") f_ip = self._delete_floatingip(f_ip.floatingipId) self.assertIsNone(f_ip, msg="Failure: floatingip exists!") def _create_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Create volume '%s'" % volume_id) self.process_event(self._eventData['volume.create.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _create_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Create volume '%s'" % volume_id) self.process_event(self._eventData['volume.create.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _update_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Update volume '%s'" % volume_id) self.process_event(self._eventData['volume.update.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _update_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Update volume '%s'" % volume_id) self.process_event(self._eventData['volume.update.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _attach_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Attach volume '%s'" % volume_id) self.process_event(self._eventData['volume.attach.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _attach_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Attach volume '%s'" % volume_id) self.process_event(self._eventData['volume.attach.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _detach_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Detach volume '%s'" % volume_id) self.process_event(self._eventData['volume.detach.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _detach_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Detach volume '%s'" % volume_id) self.process_event(self._eventData['volume.detach.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _delete_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Delete volume '%s'" % volume_id) self.process_event(self._eventData['volume.delete.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _delete_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Delete volume '%s'" % volume_id) self.process_event(self._eventData['volume.delete.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _create_volsnapshot_start(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Create volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.create.start']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def _create_volsnapshot_end(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Create volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.create.end']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def _delete_volsnapshot_start(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Delete volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.delete.start']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def _delete_volsnapshot_end(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Delete volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.delete.end']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def test_volume_create_end(self): ''' volume create end This event does return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 1) def test_volume_update_start(self): ''' volume update start This event does not return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volume = self._update_volume_start('test') self.assertIsNotNone(volume) def test_volume_update_end(self): ''' volume update end This event does return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volume = self._update_volume_end('test') self.assertIsNotNone(volume) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 2) def test_volume_attach_end(self): ''' volume attach end This event does return a volume object ''' instance5 = self._create_instance5() volume = self._create_volume_end('test') self.assertIsNotNone(volume) self._attach_volume_start('test') self._attach_volume_end('test') self.assertIsNotNone(volume.instance()) self.assertEquals(volume.instance().id, instance5.id) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 1) self.assertEquals(volume.title, 'test volume') def test_volume_detach_end(self): ''' volume detach end This event does return a volume object ''' self._create_instance5() volume = self._create_volume_end('test') self.assertIsNotNone(volume) self._attach_volume_start('test') self._attach_volume_end('test') self.assertIsNotNone(volume.instance()) self._detach_volume_start('test') self._detach_volume_end('test') self.assertIsNone(volume.instance()) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 1) self.assertEquals(volume.title, 'test volume') self.assertIsNone(volume.instance()) def test_volume_delete_end(self): ''' volume delete end This event does not return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volume = self._delete_volume_end('test') self.assertIsNone(volume) def test_volsnapshot_create_end(self): ''' volume snapshot create end This event does return a volume snapshot object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volsnapshot = self._create_volsnapshot_end('test') self.assertIsNotNone(volsnapshot) self.assertEquals(volsnapshot.tenant.id, 'tenant') self.assertEquals(volsnapshot.id, 'volsnapshot-test') def test_volsnapshot_delete_end(self): ''' volsnapshot delete end This event does not return a volsnapshot object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volsnapshot = self._create_volsnapshot_end('test') self.assertIsNotNone(volsnapshot) volsnapshot = self._delete_volsnapshot_end('test') self.assertIsNone(volsnapshot) def test_instance_shortlived(self): self.assertTrue(self._eventsloaded) datamaps = [] self.queue.append( map_event(self._eventData['scheduler.run_instance.end'])) datamaps.extend(self.queue.drain()) self.queue.append( map_event(self._eventData['compute.instance.create.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append( map_event(self._eventData['compute.instance.create.end'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 datamaps.extend(self.queue.drain()) self.assertEquals(len(datamaps), 0, "No instances were created early") self.clock += 5.0 self.queue.append( map_event(self._eventData['compute.instance.delete.start'])) datamaps.extend(self.queue.drain()) self.queue.append( map_event(self._eventData['compute.instance.shutdown.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append( map_event(self._eventData['compute.instance.shutdown.end'])) datamaps.extend(self.queue.drain()) self.queue.append( map_event(self._eventData['compute.instance.delete.end'])) datamaps.extend(self.queue.drain()) # indeed, there should be no objmaps at all. self.assertEquals(len(datamaps), 0, "No model changes were made") def test_instance_longerlived(self): self.assertTrue(self._eventsloaded) datamaps = [] self.queue.append( map_event(self._eventData['scheduler.run_instance.end'])) datamaps.extend(self.queue.drain()) self.queue.append( map_event(self._eventData['compute.instance.create.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append( map_event(self._eventData['compute.instance.create.end'])) datamaps.extend(self.queue.drain()) instance5 = self.getObjByPath('components/server-instance5') self.assertIsNone( instance5, msg="Incremental model deferred creation of instance 'instance5'") self.assertEquals(len(datamaps), 0, "No instances were created early") # allow time for the events to be released self.clock += 120.0 datamaps.extend(self.queue.drain()) self.assertEquals(len(datamaps), 1, "Instance created after sufficient time has passed") self.clock += 5.0 self.queue.append( map_event(self._eventData['compute.instance.delete.start'])) datamaps.extend(self.queue.drain()) self.queue.append( map_event(self._eventData['compute.instance.shutdown.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append( map_event(self._eventData['compute.instance.shutdown.end'])) datamaps.extend(self.queue.drain()) self.queue.append( map_event(self._eventData['compute.instance.delete.end'])) datamaps.extend(self.queue.drain()) self.assertTrue((len(datamaps) == 2 and datamaps[1]._remove), msg="Instance deleted as expected") def test_component_ids(self): self.assertTrue(self._eventsloaded) # When using zOpenStackProcessEventTypes, the event_component_id method # is used to assign a component to the events that we pass on to zenoss. # This test verifies that it can successfully identify these component IDs.component component_id = {} for event_type, evt in self._eventData.iteritems(): component_id[event_type] = event_component_id(evt) self.assertEquals(component_id['compute.instance.create.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.delete.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.delete.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.exists'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_off.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_off.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_on.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_on.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.reboot.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.reboot.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.rebuild.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.rebuild.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.rescue.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.rescue.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.resume'], 'server-instance5') self.assertEquals(component_id['compute.instance.shutdown.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.shutdown.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.suspend'], 'server-instance5') self.assertEquals(component_id['compute.instance.unrescue.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.unrescue.start'], 'server-instance5') self.assertEquals(component_id['floatingip.create.end'], 'floatingip-test') self.assertEquals(component_id['floatingip.delete.end'], 'floatingip-test') self.assertEquals(component_id['network.create.end'], 'network-test') self.assertEquals(component_id['network.delete.end'], 'network-test') self.assertEquals(component_id['port.create.end'], 'port-test') self.assertEquals(component_id['port.delete.end'], 'port-test') self.assertEquals(component_id['router.create.end'], 'router-test') self.assertEquals(component_id['router.delete.end'], 'router-test') self.assertEquals(component_id['scheduler.run_instance.end'], None) self.assertEquals(component_id['security_group.create.end'], None) self.assertEquals(component_id['security_group.delete.end'], None) self.assertEquals(component_id['subnet.create.end'], 'subnet-test') self.assertEquals(component_id['subnet.delete.end'], 'subnet-test') self.assertEquals(component_id['volsnapshot.create.end'], 'volsnapshot-test') self.assertEquals(component_id['volsnapshot.create.start'], 'volsnapshot-test') self.assertEquals(component_id['volsnapshot.delete.end'], 'volsnapshot-test') self.assertEquals(component_id['volsnapshot.delete.start'], 'volsnapshot-test') self.assertEquals(component_id['volume.attach.end'], 'volume-test') self.assertEquals(component_id['volume.attach.start'], 'volume-test') self.assertEquals(component_id['volume.create.end'], 'volume-test') self.assertEquals(component_id['volume.create.start'], 'volume-test') self.assertEquals(component_id['volume.delete.end'], 'volume-test') self.assertEquals(component_id['volume.delete.start'], 'volume-test') self.assertEquals(component_id['volume.detach.end'], 'volume-test') self.assertEquals(component_id['volume.detach.start'], 'volume-test') self.assertEquals(component_id['volume.update.end'], 'volume-test') self.assertEquals(component_id['volume.update.start'], 'volume-test')
class TestEventMappings(zenpacklib.TestCase): disableLogging = False _eventData = None _eventsloaded = False def afterSetUp(self): # needed if this is run directly on the commandline, # since otherwise it will be __main__, and ZPL's afterSetup # will get confused. self.__module__ = 'ZenPacks.zenoss.OpenStackInfrastructure.tests.test_impact' super(TestEventMappings, self).afterSetUp() # Quiet down some noisy logging. # logging.getLogger('zen.OpenStackDeviceProxyComponent').setLevel(logging.ERROR) self._loadEventsData() self.adm = ApplyDataMap() self.queue = ConsolidatingObjectMapQueue() self.clock = 1000.0 def _now(): return self.clock self.queue.now = _now def _loadEventsData(self): if self._eventsloaded: return with open(os.path.join(os.path.dirname(__file__), 'data', 'eventdata.json')) as json_file: self._eventData = json.load(json_file) for event in self._eventData.values(): event['openstack_event_type'] = \ re.sub(r'^openstack-', '', event.get('eventClassKey', '')) if self._eventData: self._eventsloaded = True def model_data(self): if not hasattr(self, '_model_data'): self._model_data = create_model_data(self.dmd) return self._model_data def endpoint(self): ''' Return a OpenStackInfrastructureEndpoint populated in a suitable way for Impact testing. ''' return self.model_data()['endpoint'] def getObjByPath(self, path): try: return self.endpoint().getObjByPath(path) except NotFound: return None def process_event(self, evt): objmap = map_event(evt) if objmap: self.adm._applyDataMap(self.endpoint(), objmap) def test_instance_creation(self): self.assertTrue(self._eventsloaded) self.process_event(self._eventData['scheduler.run_instance.end']) self.process_event(self._eventData['compute.instance.create.start']) self.process_event(self._eventData['compute.instance.create.end']) instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5, msg="Incremental model created instance 'instance5'") self.assertTrue(instance5.publicIps is None or instance5.publicIps == []) self.assertTrue(instance5.privateIps is None or instance5.privateIps == []) evt = self._eventData['compute.instance.create.end'] # json would not allow evt.trait_fixed_ips to be a string # but events.py requires it to be a string evt['trait_fixed_ips'] = str(evt['trait_fixed_ips']) self.process_event(evt) self.assertTrue(instance5.privateIps == [u'172.24.4.229']) self.assertTrue(instance5.publicIps is None or instance5.publicIps == []) def _create_instance5(self): self.assertTrue(self._eventsloaded) # # Dummy up the instance (as if test_instance_creation had run, and we had instance5 in the system) from ZenPacks.zenoss.OpenStackInfrastructure.tests.utils import addContained, addNonContained from ZenPacks.zenoss.OpenStackInfrastructure.Instance import Instance instance1 = self.getObjByPath('components/instance1') instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance1, msg="Instance1 is missing from the model!") self.assertIsNone(instance5, msg="Instance5 is already present in model!") instance5 = addContained(self.endpoint(), "components", Instance("server-instance5")) instance5.title = u'instance5' instance5.hostName = 'instance5' instance5.resourceId = u'instance5' instance5.serverId = u'instance5' instance5.serverStatus = u'ACTIVE' addNonContained(instance5, "flavor", instance1.flavor()) addNonContained(instance5, "image", instance1.image()) addNonContained(instance5, "hypervisor", instance1.hypervisor()) addNonContained(instance5, "tenant", instance1.tenant()) return instance5 def test_instance_power_off(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.power_off.start']) self.process_event(self._eventData['compute.instance.power_off.end']) self.assertTrue(instance5.serverStatus == 'shutoff') self.assertTrue(instance5.vmState == 'stopped') self.assertTrue(instance5.powerState == 'shutdown') def test_instance_power_on(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) instance5.serverStatus = 'shutoff' self.assertTrue(instance5.serverStatus == 'shutoff') self.process_event(self._eventData['compute.instance.power_on.start']) self.process_event(self._eventData['compute.instance.power_on.end']) self.assertTrue(instance5.serverStatus == 'active') self.assertTrue(instance5.powerState == 'running') def test_instance_reboot(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.reboot.start']) self.process_event(self._eventData['compute.instance.reboot.end']) self.assertTrue(instance5.serverStatus == 'active') def test_instance_rebuild(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.rebuild.start']) self.process_event(self._eventData['compute.instance.power_off.start']) self.process_event(self._eventData['compute.instance.power_off.end']) self.process_event(self._eventData['compute.instance.rebuild.end']) def test_instance_suspend_resume(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.suspend']) self.assertTrue(instance5.serverStatus == 'suspended') self.assertTrue(instance5.powerState == 'suspended') self.process_event(self._eventData['compute.instance.resume']) self.assertTrue(instance5.serverStatus == 'active') self.assertTrue(instance5.powerState == 'running') def test_instance_delete(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.delete.start']) self.process_event(self._eventData['compute.instance.shutdown.start']) self.process_event(self._eventData['compute.instance.shutdown.end']) self.process_event(self._eventData['compute.instance.delete.end']) instance5 = self.getObjByPath('components/server-instance5') self.assertIsNone(instance5) def test_instance_rescue_unrescue(self): self.assertTrue(self._eventsloaded) self._create_instance5() instance5 = self.getObjByPath('components/server-instance5') self.assertIsNotNone(instance5) self.process_event(self._eventData['compute.instance.rescue.start']) self.process_event(self._eventData['compute.instance.exists']) self.process_event(self._eventData['compute.instance.rescue.end']) self.assertTrue(instance5.vmState == 'rescued') self.assertTrue(instance5.serverStatus == 'rescue') self.process_event(self._eventData['compute.instance.unrescue.start']) self.process_event(self._eventData['compute.instance.unrescue.end']) self.assertTrue(instance5.serverStatus == 'active') def _create_network(self, network_id): self.assertTrue(self._eventsloaded) ''' Build network using events and network_id''' log.info("Create network '%s'" % network_id) self.process_event(self._eventData['network.create.end']) network = self.getObjByPath('components/network-' + network_id) return network def _delete_network(self, network_id): self.assertTrue(self._eventsloaded) ''' Delete network using events and network_id''' log.info("Delete network '%s'" % network_id) self.process_event(self._eventData['network.delete.end']) network = self.getObjByPath('components/network-' + network_id) return network def _create_subnet(self, network_id, subnet_id): self.assertTrue(self._eventsloaded) ''' Build subnet_id using events and network_id. The network/network_id must already exist. ''' log.info("Create Subnet '%s'" % subnet_id) self.process_event(self._eventData['subnet.create.end']) subnet = self.getObjByPath('components/subnet-' + subnet_id) return subnet def _delete_subnet(self, subnet_id): self.assertTrue(self._eventsloaded) ''' Delete subnet using events and subnet_id''' log.info("Delete Subnet '%s'" % subnet_id) self.process_event(self._eventData['subnet.delete.end']) subnet = self.getObjByPath('components/subnet-' + subnet_id) return subnet def _create_port(self, network_id, port_id): self.assertTrue(self._eventsloaded) ''' Build port_id using events and network_id. The network/network_id must already exist. ''' log.info("Create port '%s'" % port_id) self.process_event(self._eventData['port.create.end']) port = self.getObjByPath('components/port-' + port_id) return port def _delete_port(self, port_id): self.assertTrue(self._eventsloaded) ''' Delete port using events and port_id''' log.info("Delete port '%s'" % port_id) self.process_event(self._eventData['port.delete.end']) port = self.getObjByPath('components/port-' + port_id) return port def _create_router(self, network_id, subnet_id, router_id): self.assertTrue(self._eventsloaded) ''' Build router_id using events, network_id, subnet_id. The network_id, subnet_id must already exist. ''' log.info("Create router '%s'" % router_id) self.process_event(self._eventData['router.create.end']) router = self.getObjByPath('components/router-' + router_id) return router def _delete_router(self, router_id): self.assertTrue(self._eventsloaded) ''' Delete router using events and router_id''' log.info("Delete router '%s'" % router_id) self.process_event(self._eventData['router.delete.end']) router = self.getObjByPath('components/router-' + router_id) return router def _create_floatingip(self, network_id, router_id, port_id, floatingip_id): self.assertTrue(self._eventsloaded) ''' Build floatingip_id using events, network_id, subnet_id. The network_id, subnet_id must already exist. ''' log.info("Create floatingip '%s'" % floatingip_id) self.process_event(self._eventData['floatingip.create.end']) floatingip = self.getObjByPath('components/floatingip-' + floatingip_id) return floatingip def _delete_floatingip(self, floatingip_id): self.assertTrue(self._eventsloaded) ''' Delete floatingip using events and floatingip_id''' log.info("Delete floatingip '%s'" % floatingip_id) self.process_event(self._eventData['floatingip.delete.end']) floatingip = self.getObjByPath('components/floatingip-' + floatingip_id) return floatingip def test_network(self): ''' Test Creation/Deletion of network ''' net = self._create_network("test") self.assertIsNotNone(net, msg="Failure: network doesn't exist!") net = self._delete_network(net.netId) self.assertIsNone(net, msg="Failure: network exists!") def test_subnet(self): ''' Test Creation/Deletion of subnet ''' net = self._create_network("test") self.assertIsNotNone(net, msg="Subnet: network doesn't exist!") subnet = self._create_subnet(net.netId, 'test') self.assertIsNotNone(subnet, msg="Failure: subnet doesn't exist!") subnet = self._delete_subnet(subnet.subnetId) self.assertIsNone(subnet, msg="Failure: subnet exist!") def test_port(self): self.assertTrue(self._eventsloaded) ''' Test Creation/Deletion of port ''' net = self._create_network("test") self.assertIsNotNone(net, msg="CreatePort: network doesn't exist!") port = self._create_port(net.netId, 'test') self.assertIsNotNone(port, msg="CreatePort: port doesn't exist!") port = self._delete_port(port.portId) self.assertIsNone(port, msg="Failure: port exists!") def test_router_and_floatingip(self): self.assertTrue(self._eventsloaded) ''' Test Creation/Deletion of port ''' net = self._create_network("test") subnet = self._create_subnet(net.netId, 'test') port = self._create_port(net.netId, 'test') router = self._create_router(net.netId, subnet.subnetId, 'test') self.assertIsNotNone(router, msg="CreateRouter: router doesn't exist!") f_ip = self._create_floatingip(net.netId, router.routerId, port.portId, 'test') self.assertIsNotNone(f_ip, msg="CreateRouter: FloatingIP doesn't exist!") router = self._delete_router(router.routerId) self.assertIsNone(router, msg="Failure: router exists!") f_ip = self._delete_floatingip(f_ip.floatingipId) self.assertIsNone(f_ip, msg="Failure: floatingip exists!") def _create_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Create volume '%s'" % volume_id) self.process_event(self._eventData['volume.create.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _create_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Create volume '%s'" % volume_id) self.process_event(self._eventData['volume.create.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _update_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Update volume '%s'" % volume_id) self.process_event(self._eventData['volume.update.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _update_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Update volume '%s'" % volume_id) self.process_event(self._eventData['volume.update.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _attach_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Attach volume '%s'" % volume_id) self.process_event(self._eventData['volume.attach.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _attach_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Attach volume '%s'" % volume_id) self.process_event(self._eventData['volume.attach.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _detach_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Detach volume '%s'" % volume_id) self.process_event(self._eventData['volume.detach.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _detach_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Detach volume '%s'" % volume_id) self.process_event(self._eventData['volume.detach.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _delete_volume_start(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Delete volume '%s'" % volume_id) self.process_event(self._eventData['volume.delete.start']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _delete_volume_end(self, volume_id): self.assertTrue(self._eventsloaded) ''' Build volume_id using events. ''' log.info("Delete volume '%s'" % volume_id) self.process_event(self._eventData['volume.delete.end']) volume = self.getObjByPath('components/volume-' + volume_id) return volume def _create_volsnapshot_start(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Create volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.create.start']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def _create_volsnapshot_end(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Create volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.create.end']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def _delete_volsnapshot_start(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Delete volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.delete.start']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def _delete_volsnapshot_end(self, volsnapshot_id): self.assertTrue(self._eventsloaded) ''' Build volume snapshot using events. ''' log.info("Delete volume snapshot '%s'" % volsnapshot_id) self.process_event(self._eventData['volsnapshot.delete.end']) volsnapshot = self.getObjByPath('components/volsnapshot-' + volsnapshot_id) return volsnapshot def test_volume_create_end(self): ''' volume create end This event does return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 1) def test_volume_update_start(self): ''' volume update start This event does not return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volume = self._update_volume_start('test') self.assertIsNotNone(volume) def test_volume_update_end(self): ''' volume update end This event does return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volume = self._update_volume_end('test') self.assertIsNotNone(volume) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 2) def test_volume_attach_end(self): ''' volume attach end This event does return a volume object ''' instance5 = self._create_instance5() volume = self._create_volume_end('test') self.assertIsNotNone(volume) self._attach_volume_start('test') self._attach_volume_end('test') self.assertIsNotNone(volume.instance()) self.assertEquals(volume.instance().id, instance5.id) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 1) self.assertEquals(volume.title, 'test volume') def test_volume_detach_end(self): ''' volume detach end This event does return a volume object ''' self._create_instance5() volume = self._create_volume_end('test') self.assertIsNotNone(volume) self._attach_volume_start('test') self._attach_volume_end('test') self.assertIsNotNone(volume.instance()) self._detach_volume_start('test') self._detach_volume_end('test') self.assertIsNone(volume.instance()) self.assertEquals(volume.tenant.id, 'tenant') self.assertEquals(volume.id, 'volume-test') self.assertEquals(volume.size, 1) self.assertEquals(volume.title, 'test volume') self.assertIsNone(volume.instance()) def test_volume_delete_end(self): ''' volume delete end This event does not return a volume object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volume = self._delete_volume_end('test') self.assertIsNone(volume) def test_volsnapshot_create_end(self): ''' volume snapshot create end This event does return a volume snapshot object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volsnapshot = self._create_volsnapshot_end('test') self.assertIsNotNone(volsnapshot) self.assertEquals(volsnapshot.tenant.id, 'tenant') self.assertEquals(volsnapshot.id, 'volsnapshot-test') def test_volsnapshot_delete_end(self): ''' volsnapshot delete end This event does not return a volsnapshot object ''' volume = self._create_volume_end('test') self.assertIsNotNone(volume) volsnapshot = self._create_volsnapshot_end('test') self.assertIsNotNone(volsnapshot) volsnapshot = self._delete_volsnapshot_end('test') self.assertIsNone(volsnapshot) def test_instance_shortlived(self): self.assertTrue(self._eventsloaded) datamaps = [] self.queue.append(map_event(self._eventData['scheduler.run_instance.end'])) datamaps.extend(self.queue.drain()) self.queue.append(map_event(self._eventData['compute.instance.create.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append(map_event(self._eventData['compute.instance.create.end'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 datamaps.extend(self.queue.drain()) self.assertEquals(len(datamaps), 0, "No instances were created early") self.clock += 5.0 self.queue.append(map_event(self._eventData['compute.instance.delete.start'])) datamaps.extend(self.queue.drain()) self.queue.append(map_event(self._eventData['compute.instance.shutdown.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append(map_event(self._eventData['compute.instance.shutdown.end'])) datamaps.extend(self.queue.drain()) self.queue.append(map_event(self._eventData['compute.instance.delete.end'])) datamaps.extend(self.queue.drain()) # indeed, there should be no objmaps at all. self.assertEquals(len(datamaps), 0, "No model changes were made") def test_instance_longerlived(self): self.assertTrue(self._eventsloaded) datamaps = [] self.queue.append(map_event(self._eventData['scheduler.run_instance.end'])) datamaps.extend(self.queue.drain()) self.queue.append(map_event(self._eventData['compute.instance.create.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append(map_event(self._eventData['compute.instance.create.end'])) datamaps.extend(self.queue.drain()) instance5 = self.getObjByPath('components/server-instance5') self.assertIsNone(instance5, msg="Incremental model deferred creation of instance 'instance5'") self.assertEquals(len(datamaps), 0, "No instances were created early") # allow time for the events to be released self.clock += 120.0 datamaps.extend(self.queue.drain()) self.assertEquals(len(datamaps), 1, "Instance created after sufficient time has passed") self.clock += 5.0 self.queue.append(map_event(self._eventData['compute.instance.delete.start'])) datamaps.extend(self.queue.drain()) self.queue.append(map_event(self._eventData['compute.instance.shutdown.start'])) datamaps.extend(self.queue.drain()) self.clock += 1.0 self.queue.append(map_event(self._eventData['compute.instance.shutdown.end'])) datamaps.extend(self.queue.drain()) self.queue.append(map_event(self._eventData['compute.instance.delete.end'])) datamaps.extend(self.queue.drain()) self.assertTrue( (len(datamaps) == 2 and datamaps[1]._remove), msg="Instance deleted as expected") def test_component_ids(self): self.assertTrue(self._eventsloaded) # When using zOpenStackProcessEventTypes, the event_component_id method # is used to assign a component to the events that we pass on to zenoss. # This test verifies that it can successfully identify these component IDs.component component_id = {} for event_type, evt in self._eventData.iteritems(): component_id[event_type] = event_component_id(evt) self.assertEquals(component_id['compute.instance.create.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.delete.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.delete.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.exists'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_off.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_off.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_on.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.power_on.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.reboot.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.reboot.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.rebuild.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.rebuild.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.rescue.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.rescue.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.resume'], 'server-instance5') self.assertEquals(component_id['compute.instance.shutdown.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.shutdown.start'], 'server-instance5') self.assertEquals(component_id['compute.instance.suspend'], 'server-instance5') self.assertEquals(component_id['compute.instance.unrescue.end'], 'server-instance5') self.assertEquals(component_id['compute.instance.unrescue.start'], 'server-instance5') self.assertEquals(component_id['floatingip.create.end'], 'floatingip-test') self.assertEquals(component_id['floatingip.delete.end'], 'floatingip-test') self.assertEquals(component_id['network.create.end'], 'network-test') self.assertEquals(component_id['network.delete.end'], 'network-test') self.assertEquals(component_id['port.create.end'], 'port-test') self.assertEquals(component_id['port.delete.end'], 'port-test') self.assertEquals(component_id['router.create.end'], 'router-test') self.assertEquals(component_id['router.delete.end'], 'router-test') self.assertEquals(component_id['scheduler.run_instance.end'], None) self.assertEquals(component_id['security_group.create.end'], None) self.assertEquals(component_id['security_group.delete.end'], None) self.assertEquals(component_id['subnet.create.end'], 'subnet-test') self.assertEquals(component_id['subnet.delete.end'], 'subnet-test') self.assertEquals(component_id['volsnapshot.create.end'], 'volsnapshot-test') self.assertEquals(component_id['volsnapshot.create.start'], 'volsnapshot-test') self.assertEquals(component_id['volsnapshot.delete.end'], 'volsnapshot-test') self.assertEquals(component_id['volsnapshot.delete.start'], 'volsnapshot-test') self.assertEquals(component_id['volume.attach.end'], 'volume-test') self.assertEquals(component_id['volume.attach.start'], 'volume-test') self.assertEquals(component_id['volume.create.end'], 'volume-test') self.assertEquals(component_id['volume.create.start'], 'volume-test') self.assertEquals(component_id['volume.delete.end'], 'volume-test') self.assertEquals(component_id['volume.delete.start'], 'volume-test') self.assertEquals(component_id['volume.detach.end'], 'volume-test') self.assertEquals(component_id['volume.detach.start'], 'volume-test') self.assertEquals(component_id['volume.update.end'], 'volume-test') self.assertEquals(component_id['volume.update.start'], 'volume-test')
class TestNewDeviceMap(BaseTestCase): def afterSetUp(self): super(TestNewDeviceMap, self).afterSetUp() self.adm = ApplyDataMap() self.ndmap = NewDeviceMap() self.device = self.dmd.Devices.createInstance('testDevice') def testWin2003Server(self): results = loads("((dp1\nS'snmpDescr'\np2\nS'Hardware: x86 Family 15 Model 4 Stepping 9 AT/AT COMPATIBLE - Software: Windows Version 5.2 (Build 3790 Uniprocessor Free)'\np3\nsS'snmpOid'\np4\nS'.1.3.6.1.4.1.311.1.1.3.1.2'\np5\ns(dtp6\n.") # Verify that the modeler plugin processes the data properly. om = self.ndmap.process(self.device, results, log) self.assertEquals(om.setHWProductKey.args[0], '.1.3.6.1.4.1.311.1.1.3.1.2') self.assertEquals(om.setHWProductKey.args[1], 'Microsoft') self.assertEquals(om.setOSProductKey, 'Windows Version 5.2') self.assertEquals(om.snmpDescr, 'Hardware: x86 Family 15 Model 4 Stepping 9 AT/AT COMPATIBLE - Software: Windows Version 5.2 (Build 3790 Uniprocessor Free)') self.assertEquals(om.snmpOid, '.1.3.6.1.4.1.311.1.1.3.1.2') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getHWManufacturerName(), 'Microsoft') self.assertEquals(self.device.getHWProductName(), '.1.3.6.1.4.1.311.1.1.3.1.2') self.assertEquals(self.device.getOSManufacturerName(), 'Unknown') self.assertEquals(self.device.getOSProductName(), 'Windows Version 5.2') self.assertEquals(self.device.snmpDescr, 'Hardware: x86 Family 15 Model 4 Stepping 9 AT/AT COMPATIBLE - Software: Windows Version 5.2 (Build 3790 Uniprocessor Free)') self.assertEquals(self.device.snmpOid, '.1.3.6.1.4.1.311.1.1.3.1.2') def testCentOS5Server(self): results = loads("((dp1\nS'snmpDescr'\np2\nS'Linux centos32.damsel.loc 2.6.18-128.1.6.el5 #1 SMP Wed Apr 1 09:19:18 EDT 2009 i686'\np3\nsS'snmpOid'\np4\nS'.1.3.6.1.4.1.8072.3.2.10'\np5\ns(dtp6\n.") # Verify that the modeler plugin processes the data properly. om = self.ndmap.process(self.device, results, log) self.assertEquals(om.setHWProductKey.args[0], '.1.3.6.1.4.1.8072.3.2.10') self.assertEquals(om.setHWProductKey.args[1], 'net snmp') self.assertEquals(om.setOSProductKey, 'Linux 2.6.18-128.1.6.el5') self.assertEquals(om.snmpDescr, 'Linux centos32.damsel.loc 2.6.18-128.1.6.el5 #1 SMP Wed Apr 1 09:19:18 EDT 2009 i686') self.assertEquals(om.snmpOid, '.1.3.6.1.4.1.8072.3.2.10') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getHWManufacturerName(), 'net snmp') self.assertEquals(self.device.getHWProductName(), '.1.3.6.1.4.1.8072.3.2.10') self.assertEquals(self.device.getOSManufacturerName(), 'Unknown') self.assertEquals(self.device.getOSProductName(), 'Linux 2.6.18-128.1.6.el5') self.assertEquals(self.device.snmpDescr, 'Linux centos32.damsel.loc 2.6.18-128.1.6.el5 #1 SMP Wed Apr 1 09:19:18 EDT 2009 i686') self.assertEquals(self.device.snmpOid, '.1.3.6.1.4.1.8072.3.2.10') def testSolaris(self): results = loads("((dp1\nS'snmpDescr'\np2\nS'SunOS testHost 5.10 Generic_138889-05 i86pc'\np3\nsS'snmpOid'\np4\nS'.1.3.6.1.4.1.8072.3.2.3'\np5\ns(dtp6\n.") # Verify that the modeler plugin processes the data properly. om = self.ndmap.process(self.device, results, log) # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getOSManufacturerName(), 'Sun') self.assertEquals(self.device.getOSProductName(), 'SunOS 5.10 Generic_138889-05')
class TestNewDeviceMap(BaseTestCase): def afterSetUp(self): super(TestNewDeviceMap, self).afterSetUp() self.adm = ApplyDataMap() self.ndmap = NewDeviceMap() self.device = self.dmd.Devices.createInstance('testDevice') def testWin2003Server(self): results = loads( "((dp1\nS'snmpDescr'\np2\nS'Hardware: x86 Family 15 Model 4 Stepping 9 AT/AT COMPATIBLE - Software: Windows Version 5.2 (Build 3790 Uniprocessor Free)'\np3\nsS'snmpOid'\np4\nS'.1.3.6.1.4.1.311.1.1.3.1.2'\np5\ns(dtp6\n." ) # Verify that the modeler plugin processes the data properly. om = self.ndmap.process(self.device, results, log) self.assertEquals(om.setHWProductKey.args[0], '.1.3.6.1.4.1.311.1.1.3.1.2') self.assertEquals(om.setHWProductKey.args[1], 'Microsoft') self.assertEquals(om.setOSProductKey, 'Windows Version 5.2') self.assertEquals( om.snmpDescr, 'Hardware: x86 Family 15 Model 4 Stepping 9 AT/AT COMPATIBLE - Software: Windows Version 5.2 (Build 3790 Uniprocessor Free)' ) self.assertEquals(om.snmpOid, '.1.3.6.1.4.1.311.1.1.3.1.2') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getHWManufacturerName(), 'Microsoft') self.assertEquals(self.device.getHWProductName(), '.1.3.6.1.4.1.311.1.1.3.1.2') self.assertEquals(self.device.getOSManufacturerName(), 'Unknown') self.assertEquals(self.device.getOSProductName(), 'Windows Version 5.2') self.assertEquals( self.device.snmpDescr, 'Hardware: x86 Family 15 Model 4 Stepping 9 AT/AT COMPATIBLE - Software: Windows Version 5.2 (Build 3790 Uniprocessor Free)' ) self.assertEquals(self.device.snmpOid, '.1.3.6.1.4.1.311.1.1.3.1.2') def testCentOS5Server(self): results = loads( "((dp1\nS'snmpDescr'\np2\nS'Linux centos32.damsel.loc 2.6.18-128.1.6.el5 #1 SMP Wed Apr 1 09:19:18 EDT 2009 i686'\np3\nsS'snmpOid'\np4\nS'.1.3.6.1.4.1.8072.3.2.10'\np5\ns(dtp6\n." ) # Verify that the modeler plugin processes the data properly. om = self.ndmap.process(self.device, results, log) self.assertEquals(om.setHWProductKey.args[0], '.1.3.6.1.4.1.8072.3.2.10') self.assertEquals(om.setHWProductKey.args[1], 'net snmp') self.assertEquals(om.setOSProductKey, 'Linux 2.6.18-128.1.6.el5') self.assertEquals( om.snmpDescr, 'Linux centos32.damsel.loc 2.6.18-128.1.6.el5 #1 SMP Wed Apr 1 09:19:18 EDT 2009 i686' ) self.assertEquals(om.snmpOid, '.1.3.6.1.4.1.8072.3.2.10') # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getHWManufacturerName(), 'net snmp') self.assertEquals(self.device.getHWProductName(), '.1.3.6.1.4.1.8072.3.2.10') self.assertEquals(self.device.getOSManufacturerName(), 'Unknown') self.assertEquals(self.device.getOSProductName(), 'Linux 2.6.18-128.1.6.el5') self.assertEquals( self.device.snmpDescr, 'Linux centos32.damsel.loc 2.6.18-128.1.6.el5 #1 SMP Wed Apr 1 09:19:18 EDT 2009 i686' ) self.assertEquals(self.device.snmpOid, '.1.3.6.1.4.1.8072.3.2.10') def testSolaris(self): results = loads( "((dp1\nS'snmpDescr'\np2\nS'SunOS testHost 5.10 Generic_138889-05 i86pc'\np3\nsS'snmpOid'\np4\nS'.1.3.6.1.4.1.8072.3.2.3'\np5\ns(dtp6\n." ) # Verify that the modeler plugin processes the data properly. om = self.ndmap.process(self.device, results, log) # Verify that the data made it into the model properly. self.adm._applyDataMap(self.device, om) self.assertEquals(self.device.getOSManufacturerName(), 'Sun') self.assertEquals(self.device.getOSProductName(), 'SunOS 5.10 Generic_138889-05')
def run(self): with open('model.yaml', 'r') as f: self.model_config = yaml.load(f) self.connect() objmaps = [] for modname, obj_attrs in self.get_model_template("Global"): objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) for controller_num in range(1, self.options.controllers + 1): for modname, obj_attrs in self.get_model_template("Controller"): self.talesEvalAttrs(obj_attrs, num=controller_num, device_name=self.options.device) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) for compute_num in range(1, self.options.computes + 1): for modname, obj_attrs in self.get_model_template("Compute"): self.talesEvalAttrs(obj_attrs, num=compute_num, device_name=self.options.device) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) for tenant_num in range(3, self.options.tenants + 3): for modname, obj_attrs in self.get_model_template("Tenant"): self.talesEvalAttrs(obj_attrs, num=tenant_num, device_name=self.options.device) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) compute_nums = range(1, self.options.computes + 1) tenant_nums = range(3, self.options.tenants + 3) for instance_num in range(1, self.options.instances + 1): for modname, obj_attrs in self.get_model_template("Instance"): tenant_num = tenant_nums[instance_num % self.options.tenants] compute_num = compute_nums[instance_num % self.options.computes] self.talesEvalAttrs(obj_attrs, num=instance_num, device_name=self.options.device, tenant_num=tenant_num, compute_num=compute_num) objmaps.append(ObjectMap(modname=modname, data=obj_attrs)) device = self.dmd.Devices.OpenStack.Infrastructure.findDevice( self.options.device) if not device: print "Creating OpenStackInfrastructure device %s" % self.options.device device = self.dmd.Devices.OpenStack.Infrastructure.createInstance( self.options.device) device.setPerformanceMonitor('localhost') for controller_num in range(1, self.options.controllers + 1): device_name = "%s_controller%d" % (self.options.device, controller_num) d = self.dmd.Devices.Server.SSH.Linux.NovaHost.findDevice( device_name) if not d: print "Creating controller device %s" % device_name d = self.dmd.Devices.Server.SSH.Linux.NovaHost.createInstance( device_name) d.setZenProperty('zIpServiceMapMaxPort', 32767) for compute_num in range(1, self.options.computes + 1): device_name = "%s_compute%d" % (self.options.device, compute_num) d = self.dmd.Devices.Server.SSH.Linux.NovaHost.findDevice( device_name) if not d: print "Creating compute device %s" % device_name d = self.dmd.Devices.Server.SSH.Linux.NovaHost.createInstance( device_name) d.setZenProperty('zIpServiceMapMaxPort', 32767) relmap = RelationshipMap(relname='components') for objmap in objmaps: relmap.append(objmap) endpoint_om = ObjectMap( modname='ZenPacks.zenoss.OpenStackInfrastructure.Endpoint', data=dict(set_maintain_proxydevices=True)) print "Applying datamaps (1/2) (%d objects)" % len(objmaps) adm = ApplyDataMap() adm._applyDataMap(device, relmap) adm._applyDataMap(device, endpoint_om) print "Gathering network information" l3_agent_ids = [ x.id for x in device.getDeviceComponents( type="OpenStackInfrastructureNeutronAgent") if x.type == 'L3 agent' ] dhcp_agent_ids = [ x.id for x in device.getDeviceComponents( type="OpenStackInfrastructureNeutronAgent") if x.type == 'DHCP agent' ] all_network_ids = [ x.id for x in device.getDeviceComponents( type="OpenStackInfrastructureNetwork") ] all_router_ids = [ x.id for x in device.getDeviceComponents( type="OpenStackInfrastructureRouter") ] all_subnet_ids = [ x.id for x in device.getDeviceComponents( type="OpenStackInfrastructureSubnet") ] instance_network_ids = [ x.id for x in device.getDeviceComponents( type="OpenStackInfrastructureNetwork") if x.ports() and len([y for y in x.ports() if y.instance()]) ] instance_subnet_ids = [ y.id for y in set( chain.from_iterable([ x.subnets() for x in device.getDeviceComponents( type="OpenStackInfrastructureNetwork") if x.ports() and len([y for y in x.ports() if y.instance()]) ])) ] objmaps = [] print "Adding L3 Agent Relationships" for agent_id in l3_agent_ids: objmaps.append( ObjectMap( modname= "ZenPacks.zenoss.OpenStackInfrastructure.NeutronAgent", compname="components/%s" % agent_id, data=dict(id=agent_id, set_networks=all_network_ids, set_routers=all_router_ids, set_subnets=all_subnet_ids))) print "Adding DHCP agent Relationships" for agent_id in dhcp_agent_ids: objmaps.append( ObjectMap( modname= "ZenPacks.zenoss.OpenStackInfrastructure.NeutronAgent", compname="components/%s" % agent_id, data=dict(id=agent_id, set_networks=instance_network_ids, set_subnets=instance_subnet_ids))) print "Adding instance <-> hypervisor relationship" hypervisor_instances = defaultdict(list) for instance_num in range(1, self.options.instances + 1): instance_id = "server-%d" % instance_num compute_num = compute_nums[instance_num % self.options.computes] hypervisor_id = "hypervisor-compute%d.1" % compute_num hypervisor_instances[hypervisor_id].append(instance_id) for hypervisor_id, instance_ids in hypervisor_instances.iteritems(): objmaps.append( ObjectMap(modname= "ZenPacks.zenoss.OpenStackInfrastructure.Hypervisor", compname="components/%s" % hypervisor_id, data=dict(id=hypervisor_id, set_instances=instance_ids))) print "Applying datamaps (2/2) (%d objects)" % len(objmaps) adm = ApplyDataMap() for objmap in objmaps: adm._applyDataMap(device, objmap) print "Committing model changes." transaction.commit()