def verify_test_stat(self, table, stime, select_fields, where_clause, num, check_rows = None, sort_fields=None, filt=None): self._logger.info("verify_test_stat") vns = VerificationOpsSrv('127.0.0.1', self._opserver_port) res = vns.post_query(table, start_time=stime, end_time='now', select_fields=select_fields, where_clause=where_clause, sort_fields=sort_fields, filter=filt) self._logger.info('Recieved %s' % str(res)) if (len(res) != num): self._logger.info("Found %d rows, expected %d" % (len(res),num)) return False if check_rows is None: return True self._logger.info('Checking against %s' % str(check_rows)) for crow in check_rows: match = False for row in res: for k in crow.keys(): if k in row: if (crow[k] != row[k]): self._logger.error('Expected %s : %s got %s : %s' % (str(k), str(crow[k]), str(k), str(row[k]))) break else: break else: match = True break if match is False: self._logger.info("Could not match %s" % str(crow)) return False return True
def verify_vm_uve(self, vm_id, num_vm_ifs, msg_count, opserver_port=None): if opserver_port is not None: vns = VerificationOpsSrv('127.0.0.1', opserver_port) else: vns = VerificationOpsSrv('127.0.0.1', self._opserver_port) res = vns.get_ops_vm(vm_id) if res == {}: return False else: assert (len(res) > 0) self._logger.info(str(res)) anum_vm_ifs = len(res.get_attr('Agent', 'interface_list')) assert anum_vm_ifs == num_vm_ifs anum_vm_if_stats = len(res.get_attr('Agent', 'if_stats_list')) assert anum_vm_if_stats == num_vm_ifs for i in range(num_vm_ifs): vm_if_dict = res.get_attr('Agent', 'interface_list')[i] vm_if_stats_dict = res.get_attr('Agent', 'if_stats_list')[i] evm_if_name = self._VM_IF_PREFIX + str(i) avm_if_name = vm_if_dict['name'] assert avm_if_name == evm_if_name avm_if_stats_name = vm_if_stats_dict['name'] assert avm_if_stats_name == evm_if_name epkt_count = self._INITIAL_PKT_COUNT + \ (msg_count - 1) * self._PKTS_PER_SEC apkt_count = vm_if_stats_dict['in_pkts'] assert int(apkt_count) == epkt_count ebyte_count = epkt_count * self._BYTES_PER_PACKET abyte_count = vm_if_stats_dict['in_bytes'] assert int(abyte_count) == ebyte_count return True
def verify_test_stat(self, table, stime, select_fields, where_clause, num, check_rows = None, sort_fields=None, filt=None): self._logger.info("verify_test_stat") vns = VerificationOpsSrv('127.0.0.1', self._opserver_port) res = vns.post_query(table, start_time=stime, end_time='now', select_fields=select_fields, where_clause=where_clause, sort_fields=sort_fields, filter=filt) self._logger.info(str(res)) if (len(res) != num): self._logger.info("Found %d rows, expected %d" % (len(res),num)) return False if check_rows is None: return True for crow in check_rows: match = False for row in res: for k in crow.keys(): if k in row: if (crow[k] != row[k]): break else: break else: match = True break if match is False: self._logger.info("Could not match %s" % str(crow)) return False return True
def verify_message_table_filter(self): self.logger.info("verify_message_table_where_filter") vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) where_clause1 = "ModuleId = QueryEngine" where_clause2 = str("Source =" + socket.gethostname()) res = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["ModuleId"], where_clause=str(where_clause1 + " OR " + where_clause2), filter="ModuleId = QueryEngine") if res == []: return False else: assert (len(res) > 0) moduleids = list(set(x['ModuleId'] for x in res)) self.logger.info(str(moduleids)) if len(moduleids) != 1: # 1 moduleid: Collector return False res1 = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["ModuleId"], where_clause=str(where_clause1 + " AND " + where_clause2), filter="ModuleId = Collector") self.logger.info(str(res1)) if res1 != []: return False return True
def verify_vm_uve(self, vm_id, num_vm_ifs, msg_count, opserver_port=None): if opserver_port is not None: vns = VerificationOpsSrv('127.0.0.1', opserver_port) else: vns = VerificationOpsSrv('127.0.0.1', self._opserver_port) res = vns.get_ops_vm(vm_id) if res == {}: return False else: assert(len(res) > 0) self._logger.info(str(res)) anum_vm_ifs = len(res.get_attr('Agent', 'interface_list')) assert anum_vm_ifs == num_vm_ifs anum_vm_if_stats = len(res.get_attr('Agent', 'if_stats_list')) assert anum_vm_if_stats == num_vm_ifs for i in range(num_vm_ifs): vm_if_dict = res.get_attr('Agent', 'interface_list')[i] vm_if_stats_dict = res.get_attr('Agent', 'if_stats_list')[i] evm_if_name = self._VM_IF_PREFIX + str(i) avm_if_name = vm_if_dict['name'] assert avm_if_name == evm_if_name avm_if_stats_name = vm_if_stats_dict['name'] assert avm_if_stats_name == evm_if_name epkt_count = self._INITIAL_PKT_COUNT + \ (msg_count - 1) * self._PKTS_PER_SEC apkt_count = vm_if_stats_dict['in_pkts'] assert int(apkt_count) == epkt_count ebyte_count = epkt_count * self._BYTES_PER_PACKET abyte_count = vm_if_stats_dict['in_bytes'] assert int(abyte_count) == ebyte_count return True
def verify_message_table_filter(self): self.logger.info("verify_message_table_where_filter"); vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) where_clause1 = "ModuleId = QueryEngine" where_clause2 = str("Source =" + socket.gethostname()) res = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["ModuleId"], where_clause = str(where_clause1 + " OR " + where_clause2), filter = "ModuleId = QueryEngine") if res == []: return False else: assert(len(res) > 0) moduleids = list(set(x['ModuleId'] for x in res)) self.logger.info(str(moduleids)) if len(moduleids) != 1: # 1 moduleid: Collector return False res1 = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["ModuleId"], where_clause = str(where_clause1 + " AND " + where_clause2), filter = "ModuleId = Collector") self.logger.info(str(res1)) if res1 != []: return False return True
def verify_vm_uve(self, vm_id, num_vm_ifs, msg_count): vns = VerificationOpsSrv("127.0.0.1", self._opserver_port) res = vns.get_ops_vm(vm_id) if res == {}: return False else: assert len(res) > 0 self._logger.info(str(res)) anum_vm_ifs = len(res.get_attr("Agent", "interface_list")) assert anum_vm_ifs == num_vm_ifs anum_vm_if_stats = len(res.get_attr("Agent", "if_stats_list")) assert anum_vm_if_stats == num_vm_ifs for i in range(num_vm_ifs): vm_if_dict = res.get_attr("Agent", "interface_list")[i] vm_if_stats_dict = res.get_attr("Agent", "if_stats_list")[i] evm_if_name = self._VM_IF_PREFIX + str(i) avm_if_name = vm_if_dict["name"] assert avm_if_name == evm_if_name avm_if_stats_name = vm_if_stats_dict["name"] assert avm_if_stats_name == evm_if_name epkt_count = self._INITIAL_PKT_COUNT + (msg_count - 1) * self._PKTS_PER_SEC apkt_count = vm_if_stats_dict["in_pkts"] assert int(apkt_count) == epkt_count ebyte_count = epkt_count * self._BYTES_PER_PACKET abyte_count = vm_if_stats_dict["in_bytes"] assert int(abyte_count) == ebyte_count return True
def verify_test_stat( self, table, stime, select_fields, where_clause, num, check_rows=None, check_uniq=None, sort_fields=None, filt=None, ): self._logger.info("verify_test_stat") vns = VerificationOpsSrv("127.0.0.1", self._opserver_port) res = vns.post_query( table, start_time=stime, end_time="now", select_fields=select_fields, where_clause=where_clause, sort_fields=sort_fields, filter=filt, ) self._logger.info("Recieved %s" % str(res)) self._logger.info("Found %d rows, expected %d" % (len(res), num)) if len(res) != num: return False if check_uniq is not None: for k, v in check_uniq.iteritems(): vs = set() for row in res: if k in row: vs.add(row[k]) self._logger.info("Expected %d uniq values of %s, found %s" % (v, k, str(vs))) if len(vs) != v: return False if check_rows is None: return True self._logger.info("Checking against %s" % str(check_rows)) for crow in check_rows: match = False for row in res: for k in crow.keys(): if k in row: if crow[k] != row[k]: self._logger.error( "Expected %s : %s got %s : %s" % (str(k), str(crow[k]), str(k), str(row[k])) ) break else: break else: match = True break if match is False: self._logger.info("Could not match %s" % str(crow)) return False return True
def verify_flow_samples(self, generator_obj): self.logger.info("verify_flow_samples") vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['T'], where_clause='') self.logger.info(str(res)) if len(res) == generator_obj.num_flow_samples: return True return False
def verify_intervn_sum(self, gen_obj): self.logger.info("verify_intervn_sum") vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) res = vns.post_query('StatTable.UveVirtualNetworkAgent.vn_stats', start_time='-10m', end_time='now', select_fields=gen_obj.vn_sum_rows['select'], where_clause=gen_obj.vn_sum_rows['whereclause']) self.logger.info(str(res)) if len(res) == gen_obj.vn_sum_rows['rows']: return True return False
def verify_collector_obj_count(self): vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) res = vns.post_query('ObjectCollectorInfo', start_time = '-10m', end_time = 'now', select_fields = ["ObjectLog"], where_clause = str('ObjectId=' + socket.gethostname()), sync = False) if res == []: return False else: assert(len(res) > 0) self.logger.info(str(res)) return True
def verify_collector_obj_count(self): vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) res = vns.post_query('ObjectCollectorInfo', start_time='-10m', end_time='now', select_fields=["ObjectLog"], where_clause=str('ObjectId=' + socket.gethostname()), sync=False) if res == []: return False else: assert (len(res) > 0) self.logger.info(str(res)) return True
def verify_opserver_redis_uve_master(self, opserver, exp_redis_uve_master): vop = VerificationOpsSrv('127.0.0.1', opserver.http_port) try: redis_uve_master = vop.get_redis_uve_master()['RedisUveMasterInfo'] self.logger.info('redis uve master: ' + str(redis_uve_master)) self.logger.info('exp redis uve master: 127.0.0.1:%d' % (exp_redis_uve_master.port)) if int(redis_uve_master['port']) != exp_redis_uve_master.port: return False if redis_uve_master['status'] != 'Connected': return False except Exception as err: self.logger.error('Exception: %s' % err) return False return True
def verify_message_table_moduleid(self): self.logger.info("verify_message_table_moduleid"); vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) # query for QueryEngine logs res_qe = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["Type", "Messagetype" ], where_clause = "ModuleId = QueryEngine") # query for Collector logs res_c = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["Type", "Messagetype" ], where_clause = "ModuleId = Collector") if (res_qe == []) or (res_c == []): return False assert(len(res_qe) > 0) assert(len(res_c) > 0) return True
def verify_vm_uve(self, vm_id, num_vm_ifs, msg_count, opserver_port=None): if opserver_port is not None: vns = VerificationOpsSrv('127.0.0.1', opserver_port) else: vns = VerificationOpsSrv('127.0.0.1', self._opserver_port) res = vns.get_ops_vm(vm_id) if res == {}: return False else: assert(len(res) > 0) self._logger.info(str(res)) anum_vm_ifs = len(res.get_attr('Agent', 'interface_list')) assert anum_vm_ifs == num_vm_ifs for i in range(num_vm_ifs): vm_if_dict = res.get_attr('Agent', 'interface_list')[i] evm_if_name = self._VM_IF_PREFIX + str(i) avm_if_name = vm_if_dict['name'] assert avm_if_name == evm_if_name return True
def verify_vm_uve(self, vm_id, num_vm_ifs, msg_count, opserver_port=None): if opserver_port is not None: vns = VerificationOpsSrv('127.0.0.1', opserver_port) else: vns = VerificationOpsSrv('127.0.0.1', self._opserver_port) res = vns.get_ops_vm(vm_id) if res == {}: return False else: assert (len(res) > 0) self._logger.info(str(res)) anum_vm_ifs = len(res.get_attr('Agent', 'interface_list')) assert anum_vm_ifs == num_vm_ifs for i in range(num_vm_ifs): vm_if_dict = res.get_attr('Agent', 'interface_list')[i] evm_if_name = self._VM_IF_PREFIX + str(i) avm_if_name = vm_if_dict['name'] assert avm_if_name == evm_if_name return True
def verify_message_table_moduleid(self): self.logger.info("verify_message_table_moduleid") vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) # query for QueryEngine logs res_qe = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["Type", "Messagetype"], where_clause="ModuleId = QueryEngine") # query for Collector logs res_c = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["Type", "Messagetype"], where_clause="ModuleId = Collector") if (res_qe == []) or (res_c == []): return False assert (len(res_qe) > 0) assert (len(res_c) > 0) return True
def verify_message_table_messagetype(self): self.logger.info("verify_message_table_messagetype"); vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) # query for CollectorInfo logs res = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["ModuleId" ], where_clause = "Messagetype = CollectorInfo") if (res == []): return False assert(len(res) > 0) # verify if the result returned is ok moduleids = list(set(x['ModuleId'] for x in res)) self.logger.info("Modules: %s " % str(moduleids)) # only one moduleid: Collector if (not((len(moduleids) == 1))): return False if (not ("Collector" in moduleids)): return False return True
def verify_message_table_messagetype(self): self.logger.info("verify_message_table_messagetype") vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) # query for CollectorInfo logs res = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["ModuleId"], where_clause="Messagetype = CollectorInfo") if (res == []): return False assert (len(res) > 0) # verify if the result returned is ok moduleids = list(set(x['ModuleId'] for x in res)) self.logger.info("Modules: %s " % str(moduleids)) # only one moduleid: Collector if (not ((len(moduleids) == 1))): return False if (not ("Collector" in moduleids)): return False return True
def verify_message_table_sort(self): self.logger.info("verify_message_table_sort:Ascending Sort") vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) where_clause1 = "ModuleId = QueryEngine" where_clause2 = str("Source =" + socket.gethostname()) exp_moduleids = ['Collector', 'OpServer', 'QueryEngine'] # Ascending sort res = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["ModuleId"], where_clause=str(where_clause1 + " OR " + where_clause2), sort_fields=["ModuleId"], sort=1) if res == []: return False else: assert (len(res) > 0) moduleids = [] for x in res: if x['ModuleId'] not in moduleids: moduleids.append(x['ModuleId']) self.logger.info(str(moduleids)) for module in exp_moduleids: if module not in moduleids: return False expected_res = sorted(res, key=itemgetter('ModuleId')) if res != expected_res: return False # Descending sort self.logger.info("verify_message_table_sort:Descending Sort") res = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["ModuleId"], where_clause=str(where_clause1 + " OR " + where_clause2), sort_fields=["ModuleId"], sort=2) if res == []: return False else: assert (len(res) > 0) moduleids = [] for x in res: if x['ModuleId'] not in moduleids: moduleids.append(x['ModuleId']) self.logger.info(str(moduleids)) for module in exp_moduleids: if module not in moduleids: return False expected_res = sorted(res, key=itemgetter('ModuleId'), reverse=True) if res != expected_res: return False # Limit res = vns.post_query('MessageTable', start_time='-10m', end_time='now', select_fields=["ModuleId"], where_clause=str(where_clause1 + " OR " + where_clause2), sort_fields=["ModuleId"], sort=1, limit=1) if res == []: return False else: assert (len(res) > 0) moduleids = [] for x in res: if x['ModuleId'] not in moduleids: moduleids.append(x['ModuleId']) self.logger.info(str(moduleids)) if len(moduleids) == 1: # 2 moduleids: Collector/QueryEngine if moduleids[0] != 'Collector': return False return True else: return False
def verify_flow_table(self, generator_obj): # query flow records self.logger.info('verify_flow_table') vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) res = vns.post_query( 'FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'agg-packets', 'agg-bytes'], where_clause='') self.logger.info("FlowRecordTable result:%s" % str(res)) assert (len(res) == generator_obj.flow_cnt) # query based on various WHERE parameters # sourcevn and sourceip res = vns.post_query( 'FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sourcevn', 'sourceip'], where_clause='sourceip=10.10.10.1 AND sourcevn=domain1:admin:vn1') self.logger.info(str(res)) assert (len(res) == generator_obj.flow_cnt) res = vns.post_query( 'FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sourcevn', 'sourceip'], where_clause='sourceip=10.10.10.1 AND sourcevn=domain1:admin:vn1') self.logger.info(str(res)) assert (len(res) == generator_obj.num_flow_samples) # give non-existent values in the where clause res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sourcevn', 'sourceip'], where_clause='sourceip=20.1.1.10') self.logger.info(str(res)) assert (len(res) == 0) res = vns.post_query( 'FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sourcevn', 'sourceip'], where_clause='sourceip=20.1.1.10 AND sourcevn=domain1:admin:vn1') self.logger.info(str(res)) assert (len(res) == 0) # destvn and destip res = vns.post_query( 'FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'destvn', 'destip'], where_clause='destip=10.10.10.2 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) assert (len(res) == generator_obj.flow_cnt) res = vns.post_query( 'FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['destvn', 'destip'], where_clause='destip=10.10.10.2 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) assert (len(res) == generator_obj.num_flow_samples) # give non-existent values in the where clause res = vns.post_query( 'FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'destvn', 'destip'], where_clause= 'destip=10.10.10.2 AND destvn=default-domain:default-project:default-virtual-network' ) self.logger.info(str(res)) assert (len(res) == 0) res = vns.post_query( 'FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['destvn', 'destip'], where_clause='destip=20.1.1.10 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) assert (len(res) == 0) # sport and protocol res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sport', 'protocol'], where_clause='sport=13 AND protocol=1') self.logger.info(str(res)) assert (len(res) == 1) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'protocol'], where_clause='sport=13 AND protocol=1') self.logger.info(str(res)) assert (len(res) == 5) # give no-existent values in the where clause res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sport', 'protocol'], where_clause='sport=20 AND protocol=17') self.logger.info(str(res)) assert (len(res) == 0) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'protocol'], where_clause='sport=20 AND protocol=1') self.logger.info(str(res)) assert (len(res) == 0) # dport and protocol res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'dport', 'protocol'], where_clause='dport=104 AND protocol=2') self.logger.info(str(res)) assert (len(res) == 1) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['dport', 'protocol'], where_clause='dport=104 AND protocol=2') self.logger.info(str(res)) assert (len(res) == 5) # give no-existent values in the where clause res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'dport', 'protocol'], where_clause='dport=10 AND protocol=17') self.logger.info(str(res)) assert (len(res) == 0) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['dport', 'protocol'], where_clause='dport=10 AND protocol=17') self.logger.info(str(res)) assert (len(res) == 0) # sort and limit res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'protocol'], where_clause='', sort_fields=['protocol'], sort=1) self.logger.info(str(res)) assert (len(res) == generator_obj.flow_cnt) assert (res[0]['protocol'] == 0) res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['protocol'], where_clause='', sort_fields=['protocol'], sort=2, limit=1) self.logger.info(str(res)) assert (len(res) == 1) assert (res[0]['protocol'] == 2) return True
def verify_test_stat(self, table, stime, select_fields, where_clause, num, check_rows=None, check_uniq=None, sort_fields=None, filt=None): self._logger.info("verify_test_stat") vns = VerificationOpsSrv(socket.getfqdn("127.0.0.1"), self._opserver_port) res = vns.post_query(table, start_time=stime, end_time='now', select_fields=select_fields, where_clause=where_clause, sort_fields=sort_fields, filter=filt) self._logger.info('Recieved %s' % str(res)) self._logger.info("Found %d rows, expected %d" % (len(res), num)) if (len(res) != num): return False if check_uniq is not None: for k, v in check_uniq.iteritems(): vs = set() for row in res: if k in row: vs.add(row[k]) self._logger.info("Expected %d uniq values of %s, found %s" % \ (v, k, str(vs))) if len(vs) != v: return False if check_rows is None: return True self._logger.info('Checking against %s' % str(check_rows)) for crow in check_rows: match = False for row in res: for k in crow.keys(): if k in row: if crow[k] != None: if isinstance(crow[k], float): crow[k] = round(crow[k], 5) if isinstance(row[k], float): row[k] = round(row[k], 5) if (crow[k] != row[k]): self._logger.error( 'Expected %s : %s got %s : %s' % (str(k), str(crow[k]), str(k), str( row[k]))) break else: break else: match = True break if match is False: self._logger.info("Could not match %s" % str(crow)) return False return True
def verify_flow_series_aggregation_binning(self, generator_obj): self.logger.info('verify_flow_series_aggregation_binning') vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) # 1. stats self.logger.info('Flowseries: [sum(bytes),sum(packets)]') res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sum(bytes)', 'sum(packets)'], where_clause='') self.logger.info(str(res)) assert (len(res) == 1) exp_sum_pkts = exp_sum_bytes = 0 for f in generator_obj.flows: exp_sum_pkts += f.packets exp_sum_bytes += f.bytes assert (res[0]['sum(packets)'] == exp_sum_pkts) assert (res[0]['sum(bytes)'] == exp_sum_bytes) # 2. flow tuple + stats self.logger.info( 'Flowseries: [sport, dport, sum(bytes), sum(packets)]') # Each flow has unique (sport, dport). Therefore, the following query # should return # records equal to the # flows. res = vns.post_query( 'FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'dport', 'sum(bytes)', 'sum(packets)'], where_clause='') self.logger.info(str(res)) assert (len(res) == generator_obj.flow_cnt) for r in res: cnt = 0 for f in generator_obj.flows: if r['sport'] == f.sport and r['dport'] == f.dport: assert (r['sum(packets)'] == f.packets) assert (r['sum(bytes)'] == f.bytes) break cnt += 1 assert (cnt < generator_obj.flow_cnt) # All flows has the same (sourcevn, destvn). Therefore, the following # query should return one record. res = vns.post_query( 'FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sourcevn', 'destvn', 'sum(bytes)', 'sum(packets)'], where_clause='') self.logger.info(str(res)) assert (len(res) == 1) exp_sum_pkts = exp_sum_bytes = 0 for f in generator_obj.flows: exp_sum_pkts += f.packets exp_sum_bytes += f.bytes assert (res[0]['sum(packets)'] == exp_sum_pkts) assert (res[0]['sum(bytes)'] == exp_sum_bytes) # top 3 flows res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'dport', 'sum(bytes)'], where_clause='', sort_fields=['sum(bytes)'], sort=2, limit=3) self.logger.info(str(res)) assert (len(res) == 3) exp_res = sorted(generator_obj.flows, key=lambda flow: flow.bytes, reverse=True) cnt = 0 for r in res: assert (r['sport'] == exp_res[cnt].sport) assert (r['dport'] == exp_res[cnt].dport) assert (r['sum(bytes)'] == exp_res[cnt].bytes) cnt += 1 # 3. T=<granularity> + stats self.logger.info('Flowseries: [T=<x>, sum(bytes), sum(packets)]') st = str(generator_obj.flow_start_time) et = str(generator_obj.flow_start_time + (30 * 1000 * 1000)) granularity = 10 res = vns.post_query( 'FlowSeriesTable', start_time=st, end_time=et, select_fields=[ 'T=%s' % (granularity), 'sum(bytes)', 'sum(packets)' ], where_clause= 'sourcevn=domain1:admin:vn1 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) num_records = (int(et) - int(st)) / (granularity * 1000 * 1000) assert (len(res) == num_records) ts = [ generator_obj.flow_start_time + ((x + 1) * granularity * 1000 * 1000) for x in range(num_records) ] exp_result = { ts[0]: { 'sum(bytes)': 5500, 'sum(packets)': 65 }, ts[1]: { 'sum(bytes)': 725, 'sum(packets)': 15 }, ts[2]: { 'sum(bytes)': 700, 'sum(packets)': 8 } } assert (len(exp_result) == num_records) for r in res: try: stats = exp_result[r['T']] except KeyError: assert (False) assert (r['sum(bytes)'] == stats['sum(bytes)']) assert (r['sum(packets)'] == stats['sum(packets)']) # 4. T=<granularity> + tuples + stats self.logger.info( 'Flowseries: [T=<x>, protocol, sum(bytes), sum(packets)]') st = str(generator_obj.flow_start_time) et = str(generator_obj.flow_start_time + (10 * 1000 * 1000)) granularity = 5 res = vns.post_query( 'FlowSeriesTable', start_time=st, end_time=et, select_fields=[ 'T=%s' % (granularity), 'protocol', 'sum(bytes)', 'sum(packets)' ], where_clause= 'sourcevn=domain1:admin:vn1 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) num_ts = (int(et) - int(st)) / (granularity * 1000 * 1000) ts = [ generator_obj.flow_start_time + ((x + 1) * granularity * 1000 * 1000) for x in range(num_ts) ] exp_result = { 0: { ts[0]: { 'sum(bytes)': 450, 'sum(packets)': 5 }, ts[1]: { 'sum(bytes)': 250, 'sum(packets)': 3 } }, 1: { ts[0]: { 'sum(bytes)': 1050, 'sum(packets)': 18 }, ts[1]: { 'sum(bytes)': 750, 'sum(packets)': 14 } }, 2: { ts[0]: { 'sum(bytes)': 3000, 'sum(packets)': 25 } } } assert (len(res) == 5) for r in res: try: stats = exp_result[r['protocol']][r['T']] except KeyError: assert (False) assert (r['sum(bytes)'] == stats['sum(bytes)']) assert (r['sum(packets)'] == stats['sum(packets)']) return True
def verify_flow_series_aggregation_binning(self, generator_obj): self.logger.info('verify_flow_series_aggregation_binning') vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) # 1. stats self.logger.info('Flowseries: [sum(bytes),sum(packets)]') res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sum(bytes)', 'sum(packets)'], where_clause='') self.logger.info(str(res)) assert(len(res) == 1) exp_sum_pkts = exp_sum_bytes = 0 for f in generator_obj.flows: exp_sum_pkts += f.packets exp_sum_bytes += f.bytes assert(res[0]['sum(packets)'] == exp_sum_pkts) assert(res[0]['sum(bytes)'] == exp_sum_bytes) # 2. flow tuple + stats self.logger.info('Flowseries: [sport, dport, sum(bytes), sum(packets)]') # Each flow has unique (sport, dport). Therefore, the following query # should return # records equal to the # flows. res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'dport', 'sum(bytes)', 'sum(packets)'], where_clause='') self.logger.info(str(res)) assert(len(res) == generator_obj.flow_cnt) for r in res: cnt = 0 for f in generator_obj.flows: if r['sport'] == f.sport and r['dport'] == f.dport: assert(r['sum(packets)'] == f.packets) assert(r['sum(bytes)'] == f.bytes) break cnt += 1 assert(cnt < generator_obj.flow_cnt) # All flows has the same (sourcevn, destvn). Therefore, the following # query should return one record. res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sourcevn', 'destvn', 'sum(bytes)', 'sum(packets)'], where_clause='') self.logger.info(str(res)) assert(len(res) == 1) exp_sum_pkts = exp_sum_bytes = 0 for f in generator_obj.flows: exp_sum_pkts += f.packets exp_sum_bytes += f.bytes assert(res[0]['sum(packets)'] == exp_sum_pkts) assert(res[0]['sum(bytes)'] == exp_sum_bytes) # top 3 flows res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'dport', 'sum(bytes)'], where_clause='', sort_fields=['sum(bytes)'], sort=2, limit=3) self.logger.info(str(res)) assert(len(res) == 3) exp_res = sorted(generator_obj.flows, key=lambda flow: flow.bytes, reverse=True) cnt = 0 for r in res: assert(r['sport'] == exp_res[cnt].sport) assert(r['dport'] == exp_res[cnt].dport) assert(r['sum(bytes)'] == exp_res[cnt].bytes) cnt += 1 # 3. T=<granularity> + stats self.logger.info('Flowseries: [T=<x>, sum(bytes), sum(packets)]') st = str(generator_obj.flow_start_time) et = str(generator_obj.flow_start_time+(30*1000*1000)) granularity = 10 res = vns.post_query('FlowSeriesTable', start_time=st, end_time=et, select_fields=['T=%s' % (granularity), 'sum(bytes)', 'sum(packets)'], where_clause='sourcevn=domain1:admin:vn1 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) num_records = (int(et)-int(st))/(granularity*1000*1000) assert(len(res) == num_records) ts = [generator_obj.flow_start_time+((x+1)*granularity*1000*1000) for x in range(num_records)] exp_result = { ts[0]:{'sum(bytes)':5500, 'sum(packets)': 65}, ts[1]:{'sum(bytes)':725, 'sum(packets)': 15}, ts[2]:{'sum(bytes)':700, 'sum(packets)': 8} } assert(len(exp_result) == num_records) for r in res: try: stats = exp_result[r['T']] except KeyError: assert(False) assert(r['sum(bytes)'] == stats['sum(bytes)']) assert(r['sum(packets)'] == stats['sum(packets)']) # 4. T=<granularity> + tuples + stats self.logger.info('Flowseries: [T=<x>, protocol, sum(bytes), sum(packets)]') st = str(generator_obj.flow_start_time) et = str(generator_obj.flow_start_time+(10*1000*1000)) granularity = 5 res = vns.post_query('FlowSeriesTable', start_time=st, end_time=et, select_fields=['T=%s' % (granularity), 'protocol', 'sum(bytes)', 'sum(packets)'], where_clause='sourcevn=domain1:admin:vn1 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) num_ts = (int(et)-int(st))/(granularity*1000*1000) ts = [generator_obj.flow_start_time+((x+1)*granularity*1000*1000) for x in range(num_ts)] exp_result = { 0:{ts[0]:{'sum(bytes)':450, 'sum(packets)':5}, ts[1]:{'sum(bytes)':250, 'sum(packets)':3} }, 1:{ts[0]:{'sum(bytes)':1050, 'sum(packets)':18}, ts[1]:{'sum(bytes)':750, 'sum(packets)':14} }, 2:{ts[0]:{'sum(bytes)':3000, 'sum(packets)':25} } } assert(len(res) == 5) for r in res: try: stats = exp_result[r['protocol']][r['T']] except KeyError: assert(False) assert(r['sum(bytes)'] == stats['sum(bytes)']) assert(r['sum(packets)'] == stats['sum(packets)']) return True
def verify_flow_table(self, generator_obj): # query flow records self.logger.info('verify_flow_table') vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'agg-packets', 'agg-bytes'], where_clause='') self.logger.info("FlowRecordTable result:%s" % str(res)) assert(len(res) == generator_obj.flow_cnt) # query based on various WHERE parameters # sourcevn and sourceip res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sourcevn', 'sourceip'], where_clause='sourceip=10.10.10.1 AND sourcevn=domain1:admin:vn1') self.logger.info(str(res)) assert(len(res) == generator_obj.flow_cnt) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sourcevn', 'sourceip'], where_clause='sourceip=10.10.10.1 AND sourcevn=domain1:admin:vn1') self.logger.info(str(res)) assert(len(res) == generator_obj.num_flow_samples) # give non-existent values in the where clause res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sourcevn', 'sourceip'], where_clause='sourceip=20.1.1.10') self.logger.info(str(res)) assert(len(res) == 0) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sourcevn', 'sourceip'], where_clause='sourceip=20.1.1.10 AND sourcevn=domain1:admin:vn1') self.logger.info(str(res)) assert(len(res) == 0) # destvn and destip res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'destvn', 'destip'], where_clause='destip=10.10.10.2 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) assert(len(res) == generator_obj.flow_cnt) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['destvn', 'destip'], where_clause='destip=10.10.10.2 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) assert(len(res) == generator_obj.num_flow_samples) # give non-existent values in the where clause res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'destvn', 'destip'], where_clause='destip=10.10.10.2 AND destvn=default-domain:default-project:default-virtual-network') self.logger.info(str(res)) assert(len(res) == 0) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['destvn', 'destip'], where_clause='destip=20.1.1.10 AND destvn=domain1:admin:vn2') self.logger.info(str(res)) assert(len(res) == 0) # sport and protocol res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sport', 'protocol'], where_clause='sport=13 AND protocol=1') self.logger.info(str(res)) assert(len(res) == 1) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'protocol'], where_clause = 'sport=13 AND protocol=1') self.logger.info(str(res)) assert(len(res) == 5) # give no-existent values in the where clause res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'sport', 'protocol'], where_clause='sport=20 AND protocol=17') self.logger.info(str(res)) assert(len(res) == 0) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['sport', 'protocol'], where_clause = 'sport=20 AND protocol=1') self.logger.info(str(res)) assert(len(res) == 0) # dport and protocol res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'dport', 'protocol'], where_clause='dport=104 AND protocol=2') self.logger.info(str(res)) assert(len(res) == 1) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['dport', 'protocol'], where_clause = 'dport=104 AND protocol=2') self.logger.info(str(res)) assert(len(res) == 5) # give no-existent values in the where clause res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'dport', 'protocol'], where_clause='dport=10 AND protocol=17') self.logger.info(str(res)) assert(len(res) == 0) res = vns.post_query('FlowSeriesTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['dport', 'protocol'], where_clause='dport=10 AND protocol=17') self.logger.info(str(res)) assert(len(res) == 0) # sort and limit res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['UuidKey', 'protocol'], where_clause='', sort_fields=['protocol'], sort=1) self.logger.info(str(res)) assert(len(res) == generator_obj.flow_cnt) assert(res[0]['protocol'] == 0) res = vns.post_query('FlowRecordTable', start_time=str(generator_obj.flow_start_time), end_time=str(generator_obj.flow_end_time), select_fields=['protocol'], where_clause='', sort_fields=['protocol'], sort=2, limit=1) self.logger.info(str(res)) assert(len(res) == 1) assert(res[0]['protocol'] == 2) return True
def verify_message_table_sort(self): self.logger.info("verify_message_table_sort:Ascending Sort") vns = VerificationOpsSrv('127.0.0.1', self.opserver_port) where_clause1 = "ModuleId = QueryEngine" where_clause2 = str("Source =" + socket.gethostname()) exp_moduleids = ['Collector', 'OpServer', 'QueryEngine'] # Ascending sort res = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["ModuleId"], where_clause = str(where_clause1 + " OR " + where_clause2), sort_fields = ["ModuleId"], sort = 1) if res == []: return False else: assert(len(res) > 0) moduleids = [] for x in res: if x['ModuleId'] not in moduleids: moduleids.append(x['ModuleId']) self.logger.info(str(moduleids)) for module in exp_moduleids: if module not in moduleids: return False expected_res = sorted(res, key=itemgetter('ModuleId')) if res != expected_res: return False # Descending sort self.logger.info("verify_message_table_sort:Descending Sort"); res = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["ModuleId"], where_clause = str(where_clause1 + " OR " + where_clause2), sort_fields = ["ModuleId"], sort = 2) if res == []: return False else: assert(len(res) > 0) moduleids = [] for x in res: if x['ModuleId'] not in moduleids: moduleids.append(x['ModuleId']) self.logger.info(str(moduleids)) for module in exp_moduleids: if module not in moduleids: return False expected_res = sorted(res, key=itemgetter('ModuleId'), reverse=True) if res != expected_res: return False # Limit res = vns.post_query('MessageTable', start_time = '-10m', end_time = 'now', select_fields = ["ModuleId"], where_clause = str(where_clause1 + " OR " + where_clause2), sort_fields = ["ModuleId"], sort = 1, limit=1) if res == []: return False else: assert(len(res) > 0) moduleids = [] for x in res: if x['ModuleId'] not in moduleids: moduleids.append(x['ModuleId']) self.logger.info(str(moduleids)) if len(moduleids) == 1: # 2 moduleids: Collector/QueryEngine if moduleids[0] != 'Collector': return False return True else: return False