def __parseSystemComponent(self, item, componentClass): r'@types: Properties, PyClass -> SystemComponent' version = (self.__getPropertyIgnoreCase('MajorVersion', item) and sap_jee.SystemComponent.Version( self.__getPropertyIgnoreCase('MajorVersion', item), self.__getPropertyIgnoreCase('MinorVersion', item), self.__getPropertyIgnoreCase('MicroVersion', item)) or None) objectName = jmx.restoreObjectName( self.__getPropertyIgnoreCase('jmxObjectName', item)) # attribute 'Name' can be None but object name contains it name = (self.__getPropertyIgnoreCase('Name', item) or objectName.getKeyProperty('name')) jars = self.__getPropertyIgnoreCase('Jars', item) jars = (jars # convert ArrayList to list and list(jars) or ()) return componentClass( name, self.__getPropertyIgnoreCase('DisplayName', item), self.__getPropertyIgnoreCase('Description', item), self.__getPropertyIgnoreCase('ProviderName', item), version, jars )
def _parseCluster(self, item): r'@types: Properties -> jee.Cluster' objectNameRepr = item.get('jmxObjectName') objectName = jmx.restoreObjectName(objectNameRepr) cluster = jee.Cluster(objectName.getKeyProperty('name')) cluster.setObjectName(objectNameRepr) return cluster
def _getMbeanIdentifier(self, obj): r'@types: jee.HasObjectName' if obj.getObjectName(): objectName = jmx.restoreObjectName(obj.getObjectName()) mbeanIdentifier = objectName.getKeyProperty('mbeanIdentifier') # an example cells/ddm-rnd-yg-vm3Cell01/nodes/ddm-rnd-yg-vm3Node01/servers/server1/resources.xml # we have to strip the resources.xml with the latest slash theLatestSlashIndex = mbeanIdentifier.rfind('/') mbeanIdentifier = mbeanIdentifier[:theLatestSlashIndex] return mbeanIdentifier
def _getMbeanIdentifier(self, obj): r"@types: jee.HasObjectName" if obj.getObjectName(): objectName = jmx.restoreObjectName(obj.getObjectName()) mbeanIdentifier = objectName.getKeyProperty("mbeanIdentifier") # an example cells/ddm-rnd-yg-vm3Cell01/nodes/ddm-rnd-yg-vm3Node01/servers/server1/resources.xml # we have to strip the resources.xml with the latest slash theLatestSlashIndex = mbeanIdentifier.rfind("/") mbeanIdentifier = mbeanIdentifier[:theLatestSlashIndex] return mbeanIdentifier
def discoverJms(domain, jmsDiscoverer, jmsTopologyReporter): r'@types: jee.Domain, jee.Server, weblogic_discoverer.JmsDiscovererByJmx, jms.TopologyReporter -> ObjectStateHolderVector' vector = ObjectStateHolderVector() # all JMS servers logger.info("Find all JMS servers") jmsServers = [] # DISCOVER ALL JMS SERVERS try: # get named server with store information (name & store) jmsServers = jmsDiscoverer.findServersWithStore() except (Exception, JException): logger.warnException("Failed to get all JMS servers with information about store") try: # name attribute available only jmsServers = jmsDiscoverer.findServers() except (Exception, JException): logger.warnException("Failed to get all JMS servers without information about store") runningServerByName = {} # JMS SERVERS IN RUNTIME try: for server in jmsDiscoverer.findServersInRuntime(): runningServerByName[server.getName()] = server except (Exception, JException): logger.warnException("Failed to find JMS servers in runtime") # servers in domain by name jeeServerByName = {} for node in domain.getNodes(): for server in node.getServers(): jeeServerByName[server.getName()] = server for server in jmsServers: # discover destinations serverToReport = server deploymentTarget = None runningInstance = runningServerByName.get(server.getName()) if runningInstance: serverToReport = runningInstance serverToReport.store = server.store # try to resolve server deployment target objectName = jmx.restoreObjectName( runningInstance.getObjectName() ) jeeServerName = objectName.getKeyProperty('ServerRuntime') jeeServer = jeeServerByName.get(jeeServerName) if jeeServer: deploymentTarget = jeeServer destinations = jmsDiscoverer.discoverDestinations(server) for destination in destinations: destination.server = server try: vector.addAll( jmsTopologyReporter.reportJmsServer(domain, deploymentTarget, server)) vector.addAll( jmsTopologyReporter.reportResources(domain, deploymentTarget, *destinations)) except Exception: logger.warnException("Failed to report JMS resources for %s" % server) # JMS Modules jmsModules = [] try: jmsModules.extend(jmsDiscoverer.findJmsModules()) except (Exception, JException): logger.debug("Failed to find JMS modules") jmsModuleByName = {} for module in jmsModules: jmsModuleByName[module.getName()] = module # non-distributed JMS Topics and Queues destinationInModules = [] try: destinationInModules.extend(jmsDiscoverer.findDestinationsInModules()) except (Exception, JException): logger.debug('Failed to find Destinations in JMS modules') for destination in destinationInModules: jmsModuleName = jmsDiscoverer.getModuleNameByDestination(destination) server = jmsModuleByName.get(jmsModuleName) if server: destination.server = server try: vector.addAll( jmsTopologyReporter.reportJmsServer(domain, deploymentTarget, server) ) vector.addAll( jmsTopologyReporter.reportResources(domain, deploymentTarget, destination) ) except Exception: logger.debug("Failed to report JMS resources of JMS Module %s" % server) return vector
except (Exception, JException): logger.warnException("Failed to find available connection pools") # datasources try: for ds in dsDicoverer.findDatasources(): datasourceByName[ds.getName()] = ds except (Exception, JException): logger.warnException("Failed to find available datasources") # XA enabled datasources try: for ds in dsDicoverer.findTxDatasources(): datasourceByName[ds.getName()] = ds except (Exception, JException): logger.warnException("Failed to find available XA datasources") for ds in datasourceByName.values(): objectName = jmx.restoreObjectName(ds.getObjectName()) targetName = objectName.getKeyProperty('Location') if targetName: datasourcesByTargetName.setdefault(targetName, []).append(ds) pool = ds.poolName and connectionPoolByName.get(ds.poolName) if pool: ds.url = pool.url ds.driverClass = pool.driverClass ds.initialCapacity.set(pool.initialCapacity.value()) ds.maxCapacity.set(pool.maxCapacity.value()) ds.capacityIncrement.set(pool.capacityIncrement.value()) ds.testConnectionsOnRelease = pool.testConnectionsOnRelease try: dsVector = datasourceTopologyReporter.reportDatasourcesWithDeployer(domain, None, *datasourceByName.values()) except (Exception, JException):
for server in node.getServers(): serverByNodeName.setdefault(node.getName(), {}).setdefault(server.getName(), server) # cluster by name mapping clusterByName = {} for cluster in domain.getClusters(): clusterByName[cluster.getName()] = cluster for application in filter(isAmongApplicationsToDiscover, applications): # mapping of objectNames of modules to deployment target modulesByTarget = {} # determine deployment targets for module in application.getModules(): objectNameStr = module.getObjectName() objectName = jmx.restoreObjectName(objectNameStr) nodeName = objectName.getKeyProperty('node') # get servers in module node by name serverByName = serverByNodeName.get(nodeName) if serverByName: process = objectName.getKeyProperty('process') jeeServer = objectName.getKeyProperty('J2EEServer') jeeServerName = jeeServer or process server = serverByName.get(jeeServerName) if server: # determine whether server is a cluster member clusterRole = server.getRole(jee.ClusterMemberServerRole) if clusterRole: target = clusterByName.get(clusterRole.clusterName) if not target:
for server in node.getServers(): serverByNodeName.setdefault(node.getName(), {}).setdefault(server.getName(), server) # cluster by name mapping clusterByName = {} for cluster in domain.getClusters(): clusterByName[cluster.getName()] = cluster for application in filter(isAmongApplicationsToDiscover, applications): # mapping of objectNames of modules to deployment target modulesByTarget = {} # determine deployment targets for module in application.getModules(): objectNameStr = module.getObjectName() objectName = jmx.restoreObjectName(objectNameStr) nodeName = objectName.getKeyProperty("node") # get servers in module node by name serverByName = serverByNodeName.get(nodeName) if serverByName: process = objectName.getKeyProperty("process") jeeServer = objectName.getKeyProperty("J2EEServer") jeeServerName = jeeServer or process server = serverByName.get(jeeServerName) if server: # determine whether server is a cluster member clusterRole = server.getRole(jee.ClusterMemberServerRole) if clusterRole: target = clusterByName.get(clusterRole.clusterName) if not target:
def discoverJms(domain, jmsDiscoverer, jmsTopologyReporter): r'@types: jee.Domain, jee.Server, weblogic_discoverer.JmsDiscovererByJmx, jms.TopologyReporter -> ObjectStateHolderVector' vector = ObjectStateHolderVector() # all JMS servers logger.info("Find all JMS servers") jmsServers = [] # DISCOVER ALL JMS SERVERS try: # get named server with store information (name & store) jmsServers = jmsDiscoverer.findServersWithStore() except (Exception, JException): logger.warnException( "Failed to get all JMS servers with information about store") try: # name attribute available only jmsServers = jmsDiscoverer.findServers() except (Exception, JException): logger.warnException( "Failed to get all JMS servers without information about store" ) runningServerByName = {} # JMS SERVERS IN RUNTIME try: for server in jmsDiscoverer.findServersInRuntime(): runningServerByName[server.getName()] = server except (Exception, JException): logger.warnException("Failed to find JMS servers in runtime") # servers in domain by name jeeServerByName = {} for node in domain.getNodes(): for server in node.getServers(): jeeServerByName[server.getName()] = server for server in jmsServers: # discover destinations serverToReport = server deploymentTarget = None runningInstance = runningServerByName.get(server.getName()) if runningInstance: serverToReport = runningInstance serverToReport.store = server.store # try to resolve server deployment target objectName = jmx.restoreObjectName(runningInstance.getObjectName()) jeeServerName = objectName.getKeyProperty('ServerRuntime') jeeServer = jeeServerByName.get(jeeServerName) if jeeServer: deploymentTarget = jeeServer destinations = jmsDiscoverer.discoverDestinations(server) for destination in destinations: destination.server = server try: vector.addAll( jmsTopologyReporter.reportJmsServer(domain, deploymentTarget, server)) vector.addAll( jmsTopologyReporter.reportResources(domain, deploymentTarget, *destinations)) except Exception: logger.warnException("Failed to report JMS resources for %s" % server) # JMS Modules jmsModules = [] try: jmsModules.extend(jmsDiscoverer.findJmsModules()) except (Exception, JException): logger.debug("Failed to find JMS modules") jmsModuleByName = {} for module in jmsModules: jmsModuleByName[module.getName()] = module # non-distributed JMS Topics and Queues destinationInModules = [] try: destinationInModules.extend(jmsDiscoverer.findDestinationsInModules()) except (Exception, JException): logger.debug('Failed to find Destinations in JMS modules') for destination in destinationInModules: jmsModuleName = jmsDiscoverer.getModuleNameByDestination(destination) server = jmsModuleByName.get(jmsModuleName) if server: destination.server = server try: vector.addAll( jmsTopologyReporter.reportJmsServer( domain, deploymentTarget, server)) vector.addAll( jmsTopologyReporter.reportResources( domain, deploymentTarget, destination)) except Exception: logger.debug( "Failed to report JMS resources of JMS Module %s" % server) return vector
logger.warnException( "Failed to find available connection pools") # datasources try: for ds in dsDicoverer.findDatasources(): datasourceByName[ds.getName()] = ds except (Exception, JException): logger.warnException("Failed to find available datasources") # XA enabled datasources try: for ds in dsDicoverer.findTxDatasources(): datasourceByName[ds.getName()] = ds except (Exception, JException): logger.warnException("Failed to find available XA datasources") for ds in datasourceByName.values(): objectName = jmx.restoreObjectName(ds.getObjectName()) targetName = objectName.getKeyProperty('Location') if targetName: datasourcesByTargetName.setdefault(targetName, []).append(ds) pool = ds.poolName and connectionPoolByName.get(ds.poolName) if pool: ds.url = pool.url ds.driverClass = pool.driverClass ds.initialCapacity.set(pool.initialCapacity.value()) ds.maxCapacity.set(pool.maxCapacity.value()) ds.capacityIncrement.set(pool.capacityIncrement.value()) ds.testConnectionsOnRelease = pool.testConnectionsOnRelease try: dsVector = datasourceTopologyReporter.reportDatasourcesWithDeployer(
appByName = {} # mapping of resources by application name # @types: dict(str, list(jee.Resource)) resourceByAppName = {} # find all available applications try: for app in appDiscoverer.findApplications(): appByName[app.getName()] = app except (Exception, JException): logger.warnException('Failed to discover applications') # find EJB, WEB modules where 'J2EEApplication' in object name of each points to # the application name it belongs to for module in appDiscoverer.discoverEjbModules(): objectName = jmx.restoreObjectName(module.getObjectName()) applicationName = objectName.getKeyProperty('J2EEApplication') application = appByName.get(applicationName) if not application: application = jee.Application(applicationName) appByName[applicationName] = application if isAppResourcesDiscoveryEnabled: application.addModule(module) # parse module descriptor to get references on used resources files = filter(lambda f, expectedName = module.getDescriptorName(): f.getName() == expectedName, module.getConfigFiles()) if files: # take JEE deployment descriptor - there is only one file_ = files[0] descriptor = descrParser.parseEjbModuleDescriptor(file_.content, module) for resource in descriptor.getResources():