Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 6AB2C200D25 for ; Sun, 22 Oct 2017 20:05:08 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 69432160BD7; Sun, 22 Oct 2017 18:05:08 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 8BAEF1609E1 for ; Sun, 22 Oct 2017 20:05:07 +0200 (CEST) Received: (qmail 39553 invoked by uid 500); 22 Oct 2017 18:05:06 -0000 Mailing-List: contact commits-help@airflow.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@airflow.incubator.apache.org Delivered-To: mailing list commits@airflow.incubator.apache.org Received: (qmail 39544 invoked by uid 99); 22 Oct 2017 18:05:06 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 22 Oct 2017 18:05:06 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id E1616C45CC for ; Sun, 22 Oct 2017 18:05:05 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.222 X-Spam-Level: X-Spam-Status: No, score=-4.222 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id AOBy4V0cFxGq for ; Sun, 22 Oct 2017 18:05:04 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id F25F35FB87 for ; Sun, 22 Oct 2017 18:05:03 +0000 (UTC) Received: (qmail 39532 invoked by uid 99); 22 Oct 2017 18:05:02 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 22 Oct 2017 18:05:02 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id CC00DDFC2F; Sun, 22 Oct 2017 18:05:00 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: bolke@apache.org To: commits@airflow.incubator.apache.org Message-Id: <15acc50f20884cae9008faa806f5cb46@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: incubator-airflow git commit: [AIRFLOW-926] Fix JDBC Hook Date: Sun, 22 Oct 2017 18:05:00 +0000 (UTC) archived-at: Sun, 22 Oct 2017 18:05:08 -0000 Repository: incubator-airflow Updated Branches: refs/heads/master cd3ad3f2e -> 21257e8f0 [AIRFLOW-926] Fix JDBC Hook JayDeBeApi made a backwards incompatible change This updates the JDBC Hook's implementation and changes the required JayDeBeApi to >= 1.1.1 Closes #2651 from r-richmond/AIRFLOW-926 Project: http://git-wip-us.apache.org/repos/asf/incubator-airflow/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-airflow/commit/21257e8f Tree: http://git-wip-us.apache.org/repos/asf/incubator-airflow/tree/21257e8f Diff: http://git-wip-us.apache.org/repos/asf/incubator-airflow/diff/21257e8f Branch: refs/heads/master Commit: 21257e8f0643335d09c41f324c1d83ad1a8fc485 Parents: cd3ad3f Author: r-richmond Authored: Sun Oct 22 20:04:26 2017 +0200 Committer: Bolke de Bruin Committed: Sun Oct 22 20:04:30 2017 +0200 ---------------------------------------------------------------------- airflow/hooks/jdbc_hook.py | 7 ++-- setup.py | 2 +- tests/contrib/hooks/test_jdbc_hook.py | 51 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-airflow/blob/21257e8f/airflow/hooks/jdbc_hook.py ---------------------------------------------------------------------- diff --git a/airflow/hooks/jdbc_hook.py b/airflow/hooks/jdbc_hook.py index bc1f352..dcc6cd2 100644 --- a/airflow/hooks/jdbc_hook.py +++ b/airflow/hooks/jdbc_hook.py @@ -52,9 +52,10 @@ class JdbcHook(DbApiHook): jdbc_driver_loc = conn.extra_dejson.get('extra__jdbc__drv_path') jdbc_driver_name = conn.extra_dejson.get('extra__jdbc__drv_clsname') - conn = jaydebeapi.connect(jdbc_driver_name, - [str(host), str(login), str(psw)], - jdbc_driver_loc,) + conn = jaydebeapi.connect(jclassname=jdbc_driver_name, + url=str(host), + driver_args=[str(login), str(psw)], + jars=jdbc_driver_loc.split(",")) return conn def set_autocommit(self, conn, autocommit): http://git-wip-us.apache.org/repos/asf/incubator-airflow/blob/21257e8f/setup.py ---------------------------------------------------------------------- diff --git a/setup.py b/setup.py index d520445..4f1f20a 100644 --- a/setup.py +++ b/setup.py @@ -144,7 +144,7 @@ hive = [ 'impyla>=0.13.3', 'unicodecsv>=0.14.1' ] -jdbc = ['jaydebeapi>=0.2.0'] +jdbc = ['jaydebeapi>=1.1.1'] mssql = ['pymssql>=2.1.1', 'unicodecsv>=0.14.1'] mysql = ['mysqlclient>=1.3.6'] rabbitmq = ['librabbitmq>=1.6.1'] http://git-wip-us.apache.org/repos/asf/incubator-airflow/blob/21257e8f/tests/contrib/hooks/test_jdbc_hook.py ---------------------------------------------------------------------- diff --git a/tests/contrib/hooks/test_jdbc_hook.py b/tests/contrib/hooks/test_jdbc_hook.py new file mode 100644 index 0000000..3e8ac12 --- /dev/null +++ b/tests/contrib/hooks/test_jdbc_hook.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import unittest + +from mock import Mock +from mock import patch + +from airflow import configuration +from airflow.hooks.jdbc_hook import JdbcHook +from airflow import models +from airflow.utils import db + +jdbc_conn_mock = Mock( + name="jdbc_conn" +) + + +class TestJdbcHook(unittest.TestCase): + def setUp(self): + configuration.load_test_config() + db.merge_conn( + models.Connection( + conn_id='jdbc_default', conn_type='jdbc', + host='jdbc://localhost/', port=443, + extra='{"extra__jdbc__drv_path": "/path1/test.jar,/path2/t.jar2", "extra__jdbc__drv_clsname": "com.driver.main"}')) + + @patch("airflow.hooks.jdbc_hook.jaydebeapi.connect", autospec=True, + return_value=jdbc_conn_mock) + def test_jdbc_conn_connection(self, jdbc_mock): + jdbc_hook = JdbcHook() + jdbc_conn = jdbc_hook.get_conn() + self.assertTrue(jdbc_mock.called) + self.assertIsInstance(jdbc_conn, Mock) + self.assertEqual(jdbc_conn.name, jdbc_mock.return_value.name) + + +if __name__ == '__main__': + unittest.main()