def reportDatabaseTopology(self, dsnInfo, dependentObject): """ :param dsnInfo: list of all DSN's for which need to report topology :type dsnInfo: odbc.DSNInfo :return: vector which include all osh's for created topology :rtype: appilog.common.system.types.vectors.ObjectStateHolderVector """ vector = ObjectStateHolderVector() try: database_pdo = self.__builder.buildDatabaseServerPdo(dsnInfo) platform = db_platform.findPlatformBySignature(dsnInfo.driver) builder = db_builder.getBuilderByPlatform(platform) db_reporter = db.getReporter(platform, builder) host_descriptor = self.__builder.buildHostDescriptor(dsnInfo.address) host_descriptor = host_descriptor._replace(name=None) reporter = host_topology.Reporter() host_osh, ip_oshs, oshs = reporter.report_host(host_descriptor) server_osh, ipseOsh, database_oshs, topology = db_reporter.reportServerWithDatabases(database_pdo, host_osh, [dependentObject]) vector.addAll(topology) vector.addAll(oshs) return vector except dns_resolver.ResolveException: logger.reportWarning("Cannot resolve ip of node") return ObjectStateHolderVector()
def reportDatabaseTopology(self, dsnInfo, dependentObject): """ :param dsnInfo: list of all DSN's for which need to report topology :type dsnInfo: odbc.DSNInfo :return: vector which include all osh's for created topology :rtype: appilog.common.system.types.vectors.ObjectStateHolderVector """ vector = ObjectStateHolderVector() try: database_pdo = self.__builder.buildDatabaseServerPdo(dsnInfo) platform = db_platform.findPlatformBySignature(dsnInfo.driver) builder = db_builder.getBuilderByPlatform(platform) db_reporter = db.getReporter(platform, builder) host_descriptor = self.__builder.buildHostDescriptor( dsnInfo.address) host_descriptor = host_descriptor._replace(name=None) reporter = host_topology.Reporter() host_osh, ip_oshs, oshs = reporter.report_host(host_descriptor) server_osh, ipseOsh, database_oshs, topology = db_reporter.reportServerWithDatabases( database_pdo, host_osh, [dependentObject]) vector.addAll(topology) vector.addAll(oshs) return vector except dns_resolver.ResolveException: logger.reportWarning("Cannot resolve ip of node") return ObjectStateHolderVector()
def reportDatasources(self, container, *datasources): r'@types: entity.HasOsh, tuple(jdbc.Datasource)' if not (container and container.getOsh()): raise ValueError( "Datasource container is not specified or not built") vector = ObjectStateHolderVector() for datasource in datasources: vector.addAll(self.reportDataSource(datasource, container)) # based on URL we can report information about database server and used databases if datasource.url: try: urlParser = jdbc_url_parser.getUrlParser(datasource.url) except (Exception, JException): logger.warnException( "Failed to find appropriate parser for the url %s " % datasource.url) else: logger.debug("Use %s for %s" % (urlParser, datasource.url)) try: parsedResult = urlParser.parse(datasource.url) except (Exception, JException): logger.warnException("Failed to parse datasource URL") else: # dispatch reporting of parsed result as parse method # may return different types like DatabaseServer and OracleRac vector.addAll( self.__reportParsedData(urlParser.getPlatform(), datasource, parsedResult)) elif datasource.getServer(): # resolve address server = datasource.getServer() if server.address: try: ips = self.__dnsResolver.resolveIpsByHostname( server.address) server.address = ips[0] except (Exception, JException): logger.warnException( "Failed to resolve IP for the %s" % server) else: # report database server using generic builder if one is not found by the signature signature = ';'.join( map(str, (datasource.description, datasource.driverClass))) platform = db_platform.findPlatformBySignature( signature) if platform: databaseBuilder = db_builder.getBuilderByPlatform( platform) else: databaseBuilder = db_builder.Generic() databaseServerReporter = db.getReporter( platform, databaseBuilder) _, _, _, oshs = databaseServerReporter.reportServerWithDatabasesFromAddress( server, (datasource.getOsh(), )) vector.addAll(oshs) return vector
def report_db(server, host_osh, dependants): r'''@types: db.DatabaseServer, osh, seq[osh] -> tuple[osh, list[osh]] @raise ValueError: Platform is not found @return: tuple of built server OSH and vector where all related topology included ''' oshs = [] builder = db_builder.getBuilderByPlatform(server.getPlatform()) reporter = db.getReporter(server.getPlatform(), builder) result = reporter.reportServerWithDatabases(server, host_osh, dependants) server_osh, _, _, vector_ = result oshs.extend(vector_) return server_osh, oshs
def reportDatasources(self, container, *datasources): r'@types: entity.HasOsh, tuple(jdbc.Datasource)' if not (container and container.getOsh()): raise ValueError("Datasource container is not specified or not built") vector = ObjectStateHolderVector() for datasource in datasources: vector.addAll(self.reportDataSource(datasource, container)) # based on URL we can report information about database server and used databases if datasource.url: try: urlParser = jdbc_url_parser.getUrlParser(datasource.url) except (Exception, JException): logger.warnException("Failed to find appropriate parser for the url %s " % datasource.url) else: logger.debug("Use %s for %s" % (urlParser, datasource.url)) try: parsedResult = urlParser.parse(datasource.url) except (Exception, JException): logger.warnException("Failed to parse datasource URL") else: # dispatch reporting of parsed result as parse method # may return different types like DatabaseServer and OracleRac vector.addAll(self.__reportParsedData( urlParser.getPlatform(), datasource, parsedResult)) elif datasource.getServer(): # resolve address server = datasource.getServer() if server.address: try: ips = self.__dnsResolver.resolveIpsByHostname(server.address) server.address = ips[0] except (Exception, JException): logger.warnException("Failed to resolve IP for the %s" % server) else: # report database server using generic builder if one is not found by the signature signature = ';'.join(map(str, (datasource.description, datasource.driverClass))) platform = db_platform.findPlatformBySignature(signature) if platform: databaseBuilder = db_builder.getBuilderByPlatform(platform) else: databaseBuilder = db_builder.Generic() databaseServerReporter = db.getReporter(platform, databaseBuilder) _, _, _, oshs = databaseServerReporter.reportServerWithDatabasesFromAddress(server, (datasource.getOsh(), )) vector.addAll(oshs) return vector
def __reportParsedServer(self, platform, datasource, databaseServer): vector = ObjectStateHolderVector() # get merged database server instance server = self.__mergeDatabaseServers(datasource.getServer(), databaseServer) # If server doesn't contain databases we can create one from the datasource information if present if not server.getDatabases() and datasource.databaseName: server.addDatabases(db.Database(datasource.databaseName)) # resolve address try: ips = self.__dnsResolver.resolveIpsByHostname(server.address) server.address = ips[0] except (Exception, JException): logger.warnException("Failed to resolve IP for the %s" % server.address) else: # report database server databaseBuilder = db_builder.getBuilderByPlatform(platform) databaseServerReporter = db.getReporter(platform, databaseBuilder) _, _, _, oshs = databaseServerReporter.reportServerWithDatabasesFromAddress(server, (datasource.getOsh(), )) vector.addAll(oshs) return vector
def __reportParsedServer(self, platform, datasource, databaseServer): vector = ObjectStateHolderVector() # get merged database server instance server = self.__mergeDatabaseServers(datasource.getServer(), databaseServer) # If server doesn't contain databases we can create one from the datasource information if present if not server.getDatabases() and datasource.databaseName: server.addDatabases(db.Database(datasource.databaseName)) # resolve address try: ips = self.__dnsResolver.resolveIpsByHostname(server.address) server.address = ips[0] except (Exception, JException): logger.warnException("Failed to resolve IP for the %s" % server.address) else: # report database server databaseBuilder = db_builder.getBuilderByPlatform(platform) databaseServerReporter = db.getReporter(platform, databaseBuilder) _, _, _, oshs = databaseServerReporter.reportServerWithDatabasesFromAddress( server, (datasource.getOsh(), )) vector.addAll(oshs) return vector