Package Products :: Package ZenModel :: Module LinkManager
[hide private]
[frames] | no frames]

Source Code for Module Products.ZenModel.LinkManager

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, Zenoss Inc. 
  5  # 
  6  # This program is free software; you can redistribute it and/or modify it 
  7  # under the terms of the GNU General Public License version 2 or (at your 
  8  # option) any later version as published by the Free Software Foundation. 
  9  # 
 10  # For complete information please visit: http://www.zenoss.com/oss/ 
 11  # 
 12  ########################################################################### 
 13   
 14  from itertools import groupby 
 15   
 16  from Acquisition import aq_base 
 17   
 18  from Globals import InitializeClass 
 19  from AccessControl import ClassSecurityInfo 
 20   
 21  from OFS.Folder import Folder 
 22   
 23  from json import dumps 
 24  from Products.CMFCore.utils import getToolByName 
 25  from Products.ZCatalog.ZCatalog import manage_addZCatalog 
 26  from Products.ZenModel.Device import Device 
 27  from Products.ZenUtils.Search import makeCaseInsensitiveFieldIndex 
 28  from Products.ZenUtils.NetworkTree import NetworkLink 
 29  from Products.Zuul import getFacade 
 30  from Products.ZenEvents.events2.processing import Manager 
 31  from zenoss.protocols.protobufs.zep_pb2 import (SEVERITY_CRITICAL, SEVERITY_ERROR, 
 32                                                  SEVERITY_WARNING, SEVERITY_INFO, 
 33                                                  SEVERITY_DEBUG, SEVERITY_CLEAR) 
 34  from zenoss.protocols.protobufs.zep_pb2 import STATUS_NEW, STATUS_ACKNOWLEDGED 
 35   
 36  security = ClassSecurityInfo() 
 37   
 38  NODE_IDS = dict( 
 39      layer_3 = {'IpNetwork':'networkId', 'Device':'deviceId'}, 
 40      layer_2 = {'LAN':'lanId', 'Device':'deviceId'} 
 41  ) 
 42   
43 -def _getComplement(context, layer=3):
44 key = 'layer_%d' % layer 45 nodestuff = NODE_IDS[key] 46 if not isinstance(context, basestring): 47 try: 48 context = nodestuff[context.meta_type] 49 except KeyError: 50 return None 51 first, second = nodestuff.values() 52 if context==first: 53 return second 54 else: 55 return first
56
57 -def manage_addLinkManager(context, id="ZenLinkManager"):
58 """ Make a LinkManager """ 59 mgr = LinkManager(id) 60 context._setObject(mgr.id, mgr) 61 mgr = context._getOb(id) 62 _create_catalogs(mgr)
63 64
65 -def _create_layer2_catalog(mgr):
66 layer_2_indices = ( 67 ('lanId', makeCaseInsensitiveFieldIndex), 68 ('macaddress', makeCaseInsensitiveFieldIndex), 69 ('deviceId', makeCaseInsensitiveFieldIndex), 70 ('interfaceId', makeCaseInsensitiveFieldIndex) 71 ) 72 mgr._addLinkCatalog('layer2_catalog', layer_2_indices)
73 74
75 -def _create_layer3_catalog(mgr):
76 layer_3_indices = ( 77 ('networkId', makeCaseInsensitiveFieldIndex), 78 ('ipAddressId', makeCaseInsensitiveFieldIndex), 79 ('deviceId', makeCaseInsensitiveFieldIndex), 80 ('interfaceId', makeCaseInsensitiveFieldIndex) 81 ) 82 mgr._addLinkCatalog('layer3_catalog', layer_3_indices)
83 84
85 -def _create_catalogs(mgr):
86 _create_layer2_catalog(mgr) 87 _create_layer3_catalog(mgr)
88 89 145 146
147 -class LinkManager(Folder):
148 """ 149 A tool that keeps track of OSI layer links between objects. 150 """
151 - def __init__(self, id, *args, **kwargs):
152 Folder.__init__(self, id, *args, **kwargs) 153 self.id = id
154
155 - def _getCatalog(self, layer=3):
156 try: 157 return getToolByName(self, 'layer%d_catalog' % layer) 158 except AttributeError: 159 return None
160
161 - def _addLinkCatalog(self, id, indices):
162 manage_addZCatalog(self, id, id) 163 zcat = self._getOb(id) 164 cat = zcat._catalog 165 for index, factory in indices: 166 cat.addIndex(index, factory(index)) 167 zcat.addColumn(index)
168
169 - def getLinkedNodes(self, meta_type, id, layer=3, visited=None):
170 cat = self._getCatalog(layer) 171 col = NODE_IDS['layer_%d' % layer][meta_type] 172 nextcol = _getComplement(col, layer) 173 brains = cat(**{col:id}) 174 gen1ids = set(getattr(brain, nextcol) for brain in brains) 175 if visited: 176 gen1ids = gen1ids - visited # Don't go places we've been! 177 gen2 = cat(**{nextcol:list(gen1ids)}) 178 return gen2, gen1ids
179 199 200 def _whichnet(brain): 201 return brain.networkId
202 203 def _whichdev(brain): 204 return brain.deviceId 205 206 links, nets = self.getLinkedNodes('Device', subids.keys()) 207 links = map(aq_base, links) # For comparison, can't be ImplicitAcq 208 209 byloc = {} 210 for k, g in groupby(links, _whichorg): 211 byloc.setdefault(k, []).extend(g) 212 if '__outside' in byloc: del byloc['__outside'] 213 214 bynet = {} 215 for k, g in groupby(links, _whichnet): 216 if getattr(self.dmd.unrestrictedTraverse(k), 'zDrawMapLinks', True): 217 bynet.setdefault(k, []).extend(g) 218 219 final = {} 220 linkobs = [] 221 222 inverted_loc = {} 223 for loc in byloc: 224 for dev in byloc[loc]: 225 inverted_loc[dev.deviceId] = loc 226 for net in bynet: 227 devs = bynet[net] 228 alllocs = set() 229 for dev in devs: 230 if dev.deviceId and dev.deviceId in inverted_loc: 231 alllocs.add(inverted_loc[dev.deviceId]) 232 if len(alllocs)>=2: 233 for dev in devs: 234 if dev.deviceId: 235 loc = inverted_loc.get(dev.deviceId, None) 236 if loc: 237 final.setdefault(loc, []).append(dev) 238 def haslink(locs1, locs2): 239 for l in locs1: 240 for b in locs2: 241 if l.networkId==b.networkId: 242 return True 243 locs = final.keys() 244 while locs: 245 loc = locs.pop() 246 for loc2 in locs: 247 first = final[loc] 248 second = final[loc2] 249 if haslink(first, second): 250 link = Layer3Link(self.dmd, {loc:first, loc2:second}) 251 linkobs.append(link) 252 return dumps([(x.getAddresses(), x.getStatus()) for x in linkobs]) 253 269 292 for ip in net.ipaddresses.objectValuesGen(): 293 iface = ip.interface() 294 if iface: addToDict(iface) 295 if len(locdict)<=1: continue 296 locgroups = locdict.values() 297 while locgroups: 298 lg = locgroups.pop() 299 targets = [] 300 for g in locgroups: targets.extend(g) 301 for l in lg: 302 for t in targets: 303 n = NetworkLink() 304 n.setEndpoints(l, t) 305 result.add(n) 306 return result 307 InitializeClass(LinkManager) 308