def test_02(self): """ Checks that the mandatory site code has been provided """ # override the default fixture for this test with self.failUnlessRaises(ValueError): self.filter = VariableDefsExportFilter(None) with self.failUnlessRaises(ValueError): self.filter = VariableDefsExportFilter("")
class TestFilter02(unittest.TestCase): devcfg_name = 'device_config_02.json' enabled_outputs_cnt = 5 @classmethod def setUpClass(cls): devcfg.METADATA_HOME = fixture_path('devcfg.d') cls.dev_cfg = DeviceNetworkConfiguration(fixture_path(cls.devcfg_name), autoload=True) def test_01(self): """ Checks with vars metadata """ vars_meta = json.load(file(fixture_path('vars_metadata.json'))) self.filter = VariableDefsExportFilter("test_site", vars_metadata=vars_meta) var_defs = self.filter.export_variable_definitions(self.dev_cfg) self.assertEqual(len(var_defs), self.enabled_outputs_cnt) d = dict([ (entry['varname'], entry) for entry in var_defs ]) vd = d['temp_living'] self.assertEqual(vd['lower_bound'], 10) self.assertEqual(vd['upper_bound'], 50) self.assertEqual(vd['delta_min'], -5) self.assertEqual(vd['delta_max'], 5) vd = d['nrj'] self.assertEqual(vd['lower_bound'], 0) self.assertIsNone(vd['upper_bound']) def test_02(self): """ Filter the exported variables by not including them in the metadata """ # patch the metadata to remove one of the enabled sensors vars_meta = json.load(file(fixture_path('vars_metadata.json'))) del vars_meta['living_mvt'] self.filter = VariableDefsExportFilter("test_site", vars_metadata=vars_meta) var_defs = self.filter.export_variable_definitions(self.dev_cfg) self.assertEqual(len(var_defs), self.enabled_outputs_cnt - 1)
def test_02(self): """ Filter the exported variables by not including them in the metadata """ # patch the metadata to remove one of the enabled sensors vars_meta = json.load(file(fixture_path('vars_metadata.json'))) del vars_meta['living_mvt'] self.filter = VariableDefsExportFilter("test_site", vars_metadata=vars_meta) var_defs = self.filter.export_variable_definitions(self.dev_cfg) self.assertEqual(len(var_defs), self.enabled_outputs_cnt - 1)
class TestFilter01(unittest.TestCase): @classmethod def setUpClass(cls): devcfg.METADATA_HOME = fixture_path('devcfg.d') def setUp(self): self.filter = VariableDefsExportFilter("unittest") def test_01(self): """ Checks all is working as expected with an empty configuration """ cfg = {} defs = self.filter.export_variable_definitions(cfg) self.assertIsInstance(defs, list) self.assertEqual(len(defs), 0) def test_02(self): """ Checks that the mandatory site code has been provided """ # override the default fixture for this test with self.failUnlessRaises(ValueError): self.filter = VariableDefsExportFilter(None) with self.failUnlessRaises(ValueError): self.filter = VariableDefsExportFilter("") def test_03(self): """ Checks with a minimal configuration and no vars metadata (=> all enabled outputs are exported) """ test_scenarios = ( ('device_config_01.json', 7), ('device_config_02.json', 5) ) for devcfg_name, enabled_outputs in test_scenarios: dev_cfg = DeviceNetworkConfiguration(fixture_path(devcfg_name), autoload=True) var_defs = self.filter.export_variable_definitions(dev_cfg) self.assertEqual(len(var_defs), enabled_outputs)
def test_01(self): """ Checks with vars metadata """ vars_meta = json.load(file(fixture_path('vars_metadata.json'))) self.filter = VariableDefsExportFilter("test_site", vars_metadata=vars_meta) var_defs = self.filter.export_variable_definitions(self.dev_cfg) self.assertEqual(len(var_defs), self.enabled_outputs_cnt) d = dict([ (entry['varname'], entry) for entry in var_defs ]) vd = d['temp_living'] self.assertEqual(vd['lower_bound'], 10) self.assertEqual(vd['upper_bound'], 50) self.assertEqual(vd['delta_min'], -5) self.assertEqual(vd['delta_max'], 5) vd = d['nrj'] self.assertEqual(vd['lower_bound'], 0) self.assertIsNone(vd['upper_bound'])
def setUp(self): self.filter = VariableDefsExportFilter("unittest")
def run(self, cfg, devices_config, vars_metadata): #pylint: disable=R0912 """ Builds the variable definitions dataset, using the current devices configuration data, and uploads it to the appropriate area on DataWareHouse server. Unlike for events date this process is not scheduled to run periodically, so no backlog is handled here. :param ProcessConfiguration cfg: configuration data :param devices_config: devices coonfiguration :returns: error code (ERR_xxx) if something went wrong, 0 if all is ok """ self.log_info('starting') done = False # export the configuration as DataWareHouse point definitions error = self.ERR_EXPORT try: site_code = cfg[ProcessConfiguration.Props.SITE_CODE] exp_filter = VariableDefsExportFilter( site_code=site_code, contact=cfg[ProcessConfiguration.Props.REPORT_TO], vars_metadata=vars_metadata ) data = exp_filter.export_variable_definitions(devices_config) except Exception as e: #pylint: disable=W0703 self.log_error('configuration export failure : %s', str(e)) else: self.log_info('configuration export ok') cfg_retries = cfg[ProcessConfiguration.Props.RETRIES] max_try = cfg_retries[ProcessConfiguration.Props.MAX_ATTEMPTS] retry_delay = cfg_retries[ProcessConfiguration.Props.DELAY] with tempfile.TemporaryFile() as f: # stores the result in the temp file json.dump(data, f) f.flush() f.seek(0) # send them to the server cfg_server = cfg[ProcessConfiguration.Props.SERVER] url = cfg[ProcessConfiguration.Props.API_URLS][ProcessConfiguration.Props.DEFS_UPLOAD] % { 'host': cfg_server[ProcessConfiguration.Props.HOST], 'site': site_code } self.log_info('ready to send data') cfg_auth = cfg_server[ProcessConfiguration.Props.AUTH] auth = (cfg_auth[ProcessConfiguration.Props.LOGIN], cfg_auth[ProcessConfiguration.Props.PASSWORD]) cnt = 0 while not done and cnt < max_try: cnt += 1 self.log_info('POSTing data to %s', url) resp = requests.post( url, data=f, auth=auth, headers={ 'Content-Type': 'application/json' } ) # self.log_info('%s - %s', resp, resp.text) if resp.ok: done = True resp_data = json.loads(resp.text) self.log_info('!! success (%s)', resp_data['message']) else: try: self.log_error('failed : %d - %s (%s)', resp.status_code, resp.reason, resp.text) except ValueError: self.log_error('unexpected server error : %d - %s', resp.status_code, resp.reason) if cnt < max_try: self.log_info('retrying in %d seconds...', retry_delay) time.sleep(retry_delay) else: self.log_error( 'max try count (%d) exhausted => aborting', max_try ) if done: self.log_info('export process successful') error = self.ERR_NONE else: self.log_error('export process failed') return error