Пример #1
0
class WaveDataUploader:
    """
    This class is used to create a wave dataset uploader object by given config file location.
    """

    def __init__(self, configFile, mode):
        """
        Constructor for wave data uploader.
        :param configFile: config file name
        """
        self._uploadMode = mode
        self._config = ConfigParser()
        self._config.read(configFile)

        self._setup = Setup(self._config)
        self._loginInfo = LoginInfo('wave-login', self._config)

        self._wave_connector = WaveConnector(self._loginInfo, self._setup.auth_url, self._setup.resource_url)

        self._producerConfigs = []
        for name in self._setup.producers:
            producerConfig = ProducerConfig(
                name.strip(), self._config, self._setup.rootPath, self._setup.dataFolder)
            self._producerConfigs.append(producerConfig)

    def _waveUploader(self, loginInfo, dataset_id,  dataset, uploadMode, dataConfig, setup):
        """
        this method is a stub methd for tests
        """
        return WaveUploader(loginInfo, dataset_id, dataset, uploadMode, dataConfig, setup)

    def execute(self):
        """
        Execute the Health Service Upload by given an starting timestamp with int type
        :return: True for running success, False for failure
        """
        try:
            self._wave_connector.login()
            for producerConfig in self._producerConfigs:
                producer = producerConfig.producer
                print(type(producer))
                subprocess.call(
                        '/bin/rm -rf ' + producerConfig.dataConfig.dataFolder + "/*.csv", shell=True)
                Logger.logger.info('pull from ' + producer.name())
                producer.pull(producerConfig.dataConfig.dataFolder)
                Logger.logger.info('upload dataset ' + producerConfig.dataset)
                waveUploader = self._waveUploader(
                    self._wave_connector,
                    producerConfig.data_id,
                    producerConfig.dataset,
                    self._uploadMode,
                    producerConfig.dataConfig,
                    self._setup)
                waveUploader.uploadCsv(producerConfig.data_id)
            return True
        except Exception as e:
            print(e)
            info = "Error while executing."
            exception_handler(info, e)
            return False
Пример #2
0
    def __init__(self, config_file):
        parser = ConfigParser()
        parser.optionxform = str
        config_file = config_file
        Logger.logger.info(config_file)
        parser.read(config_file)
        database_conf = DatabaseConfig(parser)

        self._db_conf = database_conf
        self.template_path = parser.get("Paths", 'template_path')
        self.saql_path = parser.get("Paths", 'saql_path')
        self.environment = parser.get('Wave_Config', 'environment')
        download = parser.get('Paths', 'download')
        output = parser.get('Paths', 'output')
        self.download = download + "/" + self.environment
        self.output = output + "/" + self.environment

        # login and config
        self.login_config = LoginInfo('login', parser)
        self.wave_config = DashboardInfo(parser)
        self._ui_mgr = UiManager(self._db_conf, self.output,
                                 self.template_path, self.saql_path,
                                 self.download, self.environment)
        self._entity_service = EntityService(self._db_conf)
        self.conn = WaveConnector(self.login_config, self.wave_config.authUrl,
                                  self.wave_config.resource_url)
        self.conn.login()
Пример #3
0
    def test_fetch_data_by_url(self, mock_session, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # fetch succeed
        mock_session.return_value.status_code = 200
        mock_session.return_value.json.return_value = {"foo": "bar"}
        result = self.wave_connector.fetch_data_by_url("fake url")
        self.assertIsNotNone(result)
        self.assertEqual(result, {"foo": "bar"})

        # fetch failed
        mock_session.return_value.status_code = 404
        mock_session.return_value.json.return_value = {"foo": "bar"}
        http_error = requests.exceptions.RequestException
        mock_session.return_value.raise_for_status.side_effect = http_error

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.fetch_data_by_url("fake url")
            self.assertEqual(1, mock_session.raise_for_status.call_count)
            self.assertEqual(0, mock_session.json.call_count)
        self.assertEqual(cm.exception.code, 1)
Пример #4
0
    def test_delete_dashboard_by_id(self, mock_session, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # create succeed
        mock_session.return_value.status_code = 200
        result = self.wave_connector.delete_dashboard_by_id(
            "fake-dashboard-id")
        self.assertIsNotNone(result)
        self.assertEqual(result, 200)

        # create failed
        mock_session.return_value.status_code = 404
        http_error = requests.exceptions.RequestException
        mock_session.return_value.raise_for_status.side_effect = http_error

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.delete_dashboard_by_id("fake-dashboard-id")
            self.assertEqual(1, mock_session.raise_for_status.call_count)
            self.assertEqual(0, mock_session.json.call_count)
        self.assertEqual(cm.exception.code, 1)
Пример #5
0
    def test_login(self, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        http_error = requests.exceptions.RequestException
        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        mock_post.return_value.raise_for_status.side_effect = http_error

        # login succeed
        wave_connector = WaveConnector(self.mock_login_config,
                                       "http://test.com", "/resource")
        wave_connector.login()
        self.assertEqual(0, mock_post.raise_for_status.call_count)

        # login failed
        mock_post.return_value.status_code = 404
        with self.assertRaises(SystemExit) as cm:
            wave_connector = WaveConnector(self.mock_login_config,
                                           " http://test.com", "/resource")
            wave_connector.login()
            self.assertEqual(1, mock_post.raise_for_status.call_count)
        self.assertEqual(cm.exception.code, 1)
Пример #6
0
    def __init__(self, configFile, mode):
        """
        Constructor for wave data uploader.
        :param configFile: config file name
        """
        self._uploadMode = mode
        self._config = ConfigParser()
        self._config.read(configFile)

        self._setup = Setup(self._config)
        self._loginInfo = LoginInfo('wave-login', self._config)

        self._wave_connector = WaveConnector(self._loginInfo, self._setup.auth_url, self._setup.resource_url)

        self._producerConfigs = []
        for name in self._setup.producers:
            producerConfig = ProducerConfig(
                name.strip(), self._config, self._setup.rootPath, self._setup.dataFolder)
            self._producerConfigs.append(producerConfig)
Пример #7
0
    def test_fetch_data_by_name(self, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # create succeed
        # mock_session.return_value.status_code = 200
        # mock_session.return_value.json.return_value = {"foo": "bar"}
        self.wave_connector.fetch_data_by_url = mock.Mock(return_value={
            "fake-category": ({
                "label": "fake-name"
            }, {
                "label2": "fake-name2"
            })
        })
        result = self.wave_connector.fetch_data_by_name(
            "fake-category", "fake-name")
        self.assertIsNotNone(result)
        self.assertEqual(result, {"label": "fake-name"})

        # create failed

        http_error = requests.exceptions.RequestException
        self.wave_connector.fetch_data_by_url = mock.Mock(
            side_effect=http_error)

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.fetch_data_by_name("fake-category",
                                                   "fake-name")
        self.assertEqual(cm.exception.code, 1)
Пример #8
0
class WaveUiProcessor:
    def __init__(self, config_file):
        parser = ConfigParser()
        parser.optionxform = str
        config_file = config_file
        Logger.logger.info(config_file)
        parser.read(config_file)
        database_conf = DatabaseConfig(parser)

        self._db_conf = database_conf
        self.template_path = parser.get("Paths", 'template_path')
        self.saql_path = parser.get("Paths", 'saql_path')
        self.environment = parser.get('Wave_Config', 'environment')
        download = parser.get('Paths', 'download')
        output = parser.get('Paths', 'output')
        self.download = download + "/" + self.environment
        self.output = output + "/" + self.environment

        # login and config
        self.login_config = LoginInfo('login', parser)
        self.wave_config = DashboardInfo(parser)
        self._ui_mgr = UiManager(self._db_conf, self.output,
                                 self.template_path, self.saql_path,
                                 self.download, self.environment)
        self._entity_service = EntityService(self._db_conf)
        self.conn = WaveConnector(self.login_config, self.wave_config.authUrl,
                                  self.wave_config.resource_url)
        self.conn.login()

    def delete_dashboard_list(self, dashboard_list):
        """
        Method removes all dashboards in provided list and associated dashboard-page from database
        :param dashboard_list:
        :return:
        """
        for d in dashboard_list:
            logger.info("Deleting dashboard %s (%s)" %
                        (d.display_name, d.wave_id))
            response = self.conn.delete_dashboard_by_id(d.wave_id)
            logger.info(response)

            logger.info("Removing dashboard %s (%s) from database" %
                        (d.display_name, d.wave_id))
            containers = self._entity_service.get_dashboard_pages(d.wave_id)
            for c in containers:
                self._entity_service.delete_relationship_by_id(
                    d.wave_id, c.name)
            self._entity_service.delete_dashboard_by_id(d.wave_id)
            logger.info("Removed from database!")

    def upload_single_dashboard(self, json_content, prev_wave_id):
        """
        Method uploads dashboard to Wave and updates dashboard with valid Wave ID in database
        :param json_content:
        :param prev_wave_id:
        :return:
        """
        response = self.conn.create_dashboard(json.loads(json_content))

        new_wave_id = response["id"]
        url = response["url"]
        folder_id = response["folder"]["id"]

        logger.info("Dashboard %s (%s) created successfully" %
                    (response["name"], new_wave_id))
        # get info from original wave_id
        db_dashboard = self._entity_service.get_dashboard_by_id(prev_wave_id)

        # add new dashboard to DB
        self._entity_service.add_new_dashboard(
            Dashboard(new_wave_id, db_dashboard.dashboard_name,
                      db_dashboard.dashboard_type, db_dashboard.display_name,
                      url, db_dashboard.link_var, db_dashboard.group_name,
                      folder_id, self.environment))

        db_pages = self._entity_service.get_dashboard_pages(prev_wave_id)

        # update all the relationships
        for c in db_pages:
            self._entity_service.add_relationship(new_wave_id, c.name)
            self._entity_service.delete_relationship_by_id(
                prev_wave_id, c.name)

        self._entity_service.delete_dashboard_by_id(prev_wave_id)
        logger.info("Updated database")

    def create_dashboards(self):
        """
        Method uploads new dashboard to Wave if it does not exist and updates existing dashboard otherwise
        :return:
        """
        dashboards = self._ui_mgr.get_dashboards(self.environment)
        for ds in dashboards:
            json_content = self._ui_mgr.generate_json(ds.dashboard_name,
                                                      ds.env)
            try:
                # adding to existing dashboard (valid wave_id)
                # create_input_object = {'folder': ds.folder_id, 'name': ds.dashboard_name, 'description': ds.display_name, 'state': json.loads(json_content)}
                # pretty_print(load_json_from(json_content))
                response_ds = self.conn.create_dashboard(
                    data=load_json_from(json_content))
                pretty_print(response_ds, 1)
                logger.info(
                    "Dashboard %s (%s) updated ID %s" %
                    (ds.display_name, ds.dashboard_name, response_ds['id']))
                ds.wave_id = response_ds['id']
                ds.url = response_ds['url']
                self._ui_mgr.save_dashboard(ds)
            except requests.exceptions.RequestException:
                # Wave ID from dashboard in DB does not exist
                logger.info("Creating dashboard")
                # self.upload_single_dashboard(json_content, ds.wave_id)
                logger.info("<Response [201]>")

    def update_dashboards(self):
        """
        Method updates existing dashboards with generated JSON from metadata
        :return:
        """
        dashboards = self._ui_mgr.get_dashboards(self.environment)
        for d in dashboards:
            json_test = self._ui_mgr.generate_json(d.dashboard_name, d.env)
            response = self.conn.update_dashboard_by_id(
                d.wave_id, json.loads(json_test))
            logger.info(response)
            logger.info("Dashboard %s (%s) updated" %
                        (d.display_name, d.wave_id))

    def delete_dashboards(self, dashboard_name=""):
        """
        Method deletes dashboard by its name if provided or all dashboards otherwise
        :param dashboard_name:
        :return:
        """
        dashboards = self._ui_mgr.get_dashboards(self.environment)
        if dashboard_name:
            dashboards = filter(
                lambda x: x.get_dashboard_name() == dashboard_name, dashboards)
            self.delete_dashboard_list(dashboards)
        else:
            self.delete_dashboard_list(dashboards)

    def download_dashboards(self):
        """
        Method saves JSON file of all dashboards that were uploaded/updated in the same session
        :return:
        """
        today = datetime.now()
        dashboards = self._ui_mgr.get_dashboards(self.environment)
        for d in dashboards:
            file_name = self.output + "/" + d.display_name + "_dashboard.json"
            content = read_file(file_name)
            download_path = self.download + "/" + d.display_name + "_" + d.env + "_" + today.strftime(
                '%Y%m%d%H%M') + "_dashboard.json"
            save_file(download_path, content)
            logger.info("Dashboard %s (%s) saved successfully" %
                        (d.display_name, d.wave_id))
Пример #9
0
class WaveConnectorTestSuite(unittest.TestCase):
    """Utils test cases."""
    def setUp(self):
        self.wave_connector = None
        self.mock_login_config = mock.Mock(clientID="fake_clientID",
                                           clientSecret="fake_clientSecret",
                                           grantType="fake_grantType",
                                           username="******",
                                           password="******")
        self.mock_dashboard_config = mock.Mock(
            resource_url="fake_resource_url")

    @mock.patch('wave_common.wave_connector.requests.post')
    def test_login(self, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        http_error = requests.exceptions.RequestException
        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        mock_post.return_value.raise_for_status.side_effect = http_error

        # login succeed
        wave_connector = WaveConnector(self.mock_login_config,
                                       "http://test.com", "/resource")
        wave_connector.login()
        self.assertEqual(0, mock_post.raise_for_status.call_count)

        # login failed
        mock_post.return_value.status_code = 404
        with self.assertRaises(SystemExit) as cm:
            wave_connector = WaveConnector(self.mock_login_config,
                                           " http://test.com", "/resource")
            wave_connector.login()
            self.assertEqual(1, mock_post.raise_for_status.call_count)
        self.assertEqual(cm.exception.code, 1)

    @mock.patch('wave_common.wave_connector.requests.post')
    @mock.patch('wave_common.wave_connector.requests.Session.get')
    def test_fetch_data_by_url(self, mock_session, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # fetch succeed
        mock_session.return_value.status_code = 200
        mock_session.return_value.json.return_value = {"foo": "bar"}
        result = self.wave_connector.fetch_data_by_url("fake url")
        self.assertIsNotNone(result)
        self.assertEqual(result, {"foo": "bar"})

        # fetch failed
        mock_session.return_value.status_code = 404
        mock_session.return_value.json.return_value = {"foo": "bar"}
        http_error = requests.exceptions.RequestException
        mock_session.return_value.raise_for_status.side_effect = http_error

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.fetch_data_by_url("fake url")
            self.assertEqual(1, mock_session.raise_for_status.call_count)
            self.assertEqual(0, mock_session.json.call_count)
        self.assertEqual(cm.exception.code, 1)

    @mock.patch('wave_common.wave_connector.requests.post')
    @mock.patch('wave_common.wave_connector.requests.Session.get')
    def test_fetch_dashboard_by_id(self, mock_session, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # fetch succeed
        mock_session.return_value.status_code = 200
        mock_session.return_value.json.return_value = {"foo": "bar"}
        result = self.wave_connector.fetch_dashboard_by_id("fake-dashboard-id")
        self.assertIsNotNone(result)
        self.assertEqual(result, {"foo": "bar"})

        # fetch failed
        mock_session.return_value.status_code = 404
        mock_session.return_value.json.return_value = {"foo": "bar"}
        http_error = requests.exceptions.RequestException
        mock_session.return_value.raise_for_status.side_effect = http_error

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.fetch_dashboard_by_id("fake-dashboard-id")
            self.assertEqual(1, mock_session.raise_for_status.call_count)
            self.assertEqual(0, mock_session.json.call_count)
        self.assertEqual(cm.exception.code, 1)

    @mock.patch('wave_common.wave_connector.requests.post')
    @mock.patch('wave_common.wave_connector.requests.Session.post')
    def test_create_dashboard(self, mock_session, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # create succeed
        mock_session.return_value.status_code = 200
        mock_session.return_value.json.return_value = {"foo": "bar"}
        result = self.wave_connector.create_dashboard("fake-dashboard-data")
        self.assertIsNotNone(result)
        self.assertEqual(result, {"foo": "bar"})

        # create failed
        mock_session.return_value.status_code = 404
        mock_session.return_value.json.return_value = {"foo": "bar"}
        http_error = requests.exceptions.RequestException
        mock_session.return_value.raise_for_status.side_effect = http_error

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.create_dashboard("fake-dashboard-data")
            self.assertEqual(1, mock_session.raise_for_status.call_count)
            self.assertEqual(0, mock_session.json.call_count)
        self.assertEqual(cm.exception.code, 1)

    @mock.patch('wave_common.wave_connector.requests.post')
    @mock.patch('wave_common.wave_connector.requests.Session.patch')
    def test_update_dashboard_by_id(self, mock_session, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # create succeed
        mock_session.return_value.status_code = 200
        result = self.wave_connector.update_dashboard_by_id(
            "fake-id", "fake-dashboard-data")
        self.assertIsNotNone(result)
        self.assertEqual(result, 200)

        # create failed
        mock_session.return_value.status_code = 404
        http_error = requests.exceptions.RequestException
        mock_session.return_value.raise_for_status.side_effect = http_error

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.update_dashboard_by_id("fake-id",
                                                       "fake-dashboard-data")
            self.assertEqual(1, mock_session.raise_for_status.call_count)
            self.assertEqual(0, mock_session.json.call_count)
        self.assertEqual(cm.exception.code, 1)

    @mock.patch('wave_common.wave_connector.requests.post')
    @mock.patch('wave_common.wave_connector.requests.Session.delete')
    def test_delete_dashboard_by_id(self, mock_session, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # create succeed
        mock_session.return_value.status_code = 200
        result = self.wave_connector.delete_dashboard_by_id(
            "fake-dashboard-id")
        self.assertIsNotNone(result)
        self.assertEqual(result, 200)

        # create failed
        mock_session.return_value.status_code = 404
        http_error = requests.exceptions.RequestException
        mock_session.return_value.raise_for_status.side_effect = http_error

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.delete_dashboard_by_id("fake-dashboard-id")
            self.assertEqual(1, mock_session.raise_for_status.call_count)
            self.assertEqual(0, mock_session.json.call_count)
        self.assertEqual(cm.exception.code, 1)

    @mock.patch('wave_common.wave_connector.requests.post')
    # @mock.patch('shd.wave_connector.requests.Session.get')
    def test_fetch_data_by_name(self, mock_post):
        response = {
            "access_token": "fake_token",
            "instance_url": "fake_url",
            "token_type": "fake_type"
        }

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = response
        self.wave_connector = WaveConnector(self.mock_login_config,
                                            "http://test.com", "/resource")

        # create succeed
        # mock_session.return_value.status_code = 200
        # mock_session.return_value.json.return_value = {"foo": "bar"}
        self.wave_connector.fetch_data_by_url = mock.Mock(return_value={
            "fake-category": ({
                "label": "fake-name"
            }, {
                "label2": "fake-name2"
            })
        })
        result = self.wave_connector.fetch_data_by_name(
            "fake-category", "fake-name")
        self.assertIsNotNone(result)
        self.assertEqual(result, {"label": "fake-name"})

        # create failed

        http_error = requests.exceptions.RequestException
        self.wave_connector.fetch_data_by_url = mock.Mock(
            side_effect=http_error)

        with self.assertRaises(SystemExit) as cm:
            self.wave_connector.fetch_data_by_name("fake-category",
                                                   "fake-name")
        self.assertEqual(cm.exception.code, 1)

    if __name__ == '__main__':
        unittest.main()