Ejemplo n.º 1
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("")
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
    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'])
Ejemplo n.º 6
0
 def setUp(self):
     self.filter = VariableDefsExportFilter("unittest")
Ejemplo n.º 7
0
    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