From d3cd69f55e20898977b036f3c85d8375da9d7a08 Mon Sep 17 00:00:00 2001 From: Alpine Release Date: Sun, 11 Feb 2018 15:09:21 +0800 Subject: [PATCH 1/7] fix the issue that the get workfile list can fetch ony 50 workfiles --- alpine/workfile.py | 5 +++-- tests/api/test_job.py | 2 +- tests/api/test_workfile.py | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/alpine/workfile.py b/alpine/workfile.py index b409cd7..3d591d4 100644 --- a/alpine/workfile.py +++ b/alpine/workfile.py @@ -52,8 +52,7 @@ def get_list(self, workspace_id, per_page=100): url = "{0}/workspaces/{1}/workfiles".format(self.base_url, str(workspace_id)) url = self._add_token_to_url(url) - if self.session.headers.get("Content-Type") is not None: - self.session.headers.pop("Content-Type") + self.session.headers.update({"Content-Type": "application/json"}) page_current = 0 while True: payload = {"no_published_worklets": True, @@ -242,6 +241,8 @@ def upload(self, workspace_id, afm_file, data_sources_list): payload.append(("workfile[execution_locations][{0}][id]".format(i), database_id)) # files is used to create a multipart upload content-type with requests, we send in a file object + if self.session.headers.get("Content-Type") is not None: + self.session.headers.pop("Content-Type") files = {"workfile[versions_attributes][0][contents]": open(afm_file, 'rb')} self.logger.debug("POSTing to: {0}\n With payload: {1}".format(url, payload)) response = self.session.post(url, files=files, data=payload, verify=False) diff --git a/tests/api/test_job.py b/tests/api/test_job.py index 0b26f4c..3652bdd 100644 --- a/tests/api/test_job.py +++ b/tests/api/test_job.py @@ -43,7 +43,7 @@ def setUp(self): # Upload a DB flow base_dir = os.getcwd() - afm_path = "{0}/../data/afm/db_row_fil_with_variable.afm".format(base_dir) + afm_path = "{0}/data/afm/db_row_fil_with_variable.afm".format(base_dir) # afm_path = "db_bat_row_fil.afm" try: workfile_id = alpine_client.workfile.get_id("db_row_fil_with_variable", workspace_id) diff --git a/tests/api/test_workfile.py b/tests/api/test_workfile.py index 3961f73..a6f8fab 100644 --- a/tests/api/test_workfile.py +++ b/tests/api/test_workfile.py @@ -48,7 +48,7 @@ def setUp(self): # Upload a DB flow base_dir = os.getcwd() - afm_path = "{0}/../data/afm/db_row_fil_with_variable.afm".format(base_dir) + afm_path = "{0}/data/afm/db_row_fil_with_variable.afm".format(base_dir) # afm_path = "db_bat_row_fil.afm" try: workfile_id = alpine_client.workfile.get_id("db_row_fil_with_variable", workspace_id) @@ -75,6 +75,36 @@ def test_get_workfiles_list(self): self.assertIsNotNone(workfile_list) self.assertEqual(workfile_list.__len__(), 1) + def test_get_workfiles_list_multiple_pages(self): + workspace_name_multiple_flows = "Workspace for Multiple Workfile Tests" + workspace_id_multiple_flows_count = 10 + + try: + workspace_id_multiple_flows = alpine_client.workspace.get_id(workspace_name_multiple_flows) + alpine_client.workspace.delete(workspace_id_multiple_flows) + except WorkspaceNotFoundException: + pass + workspace_info_nultiple_flow = alpine_client.workspace.create(workspace_name_multiple_flows) + workspace_id_multiple_flows = workspace_info_nultiple_flow['id'] + + # Upload DB flows + base_dir = os.getcwd() + afm_path = "{0}/data/afm/db_row_fil_with_variable.afm".format(base_dir) + database_list = alpine_client.datasource.get_database_list(db_datasource_id) + for database in database_list: + if database['name'] == "miner_demo": + database_id = database['id'] + datasource_info = [{"data_source_type": DataSource.DSType.GreenplumDatabase, + "data_source_id": db_datasource_id, + "database_id": database_id + }] + for i in range(0, workspace_id_multiple_flows_count): + workfile_info = alpine_client.workfile.upload(workspace_id_multiple_flows, afm_path, datasource_info) + + workfile_list = alpine_client.workfile.get_list(workspace_id_multiple_flows,per_page=2) + self.assertIsNotNone(workfile_list) + self.assertEqual(workfile_list.__len__(), workspace_id_multiple_flows_count) + def test_get_workfile_info(self): workfile_id = alpine_client.workfile.get_id("db_row_fil_with_variable", workspace_id) workfile_info = alpine_client.workfile.get(workfile_id) @@ -132,7 +162,7 @@ def test_stop_workflow(self): def test_upload_hdfs_afm(self): base_dir = os.getcwd() - afm_path = "{0}/../data/afm/demo_hadoop_row_filter_regression.afm".format(base_dir) + afm_path = "{0}/data/afm/demo_hadoop_row_filter_regression.afm".format(base_dir) #afm_path = "demo_hadoop_row_filter_regression.afm" try: workfile_id = alpine_client.workfile.get_id("demo_hadoop_row_filter_regression", workspace_id) @@ -147,7 +177,7 @@ def test_upload_hdfs_afm(self): def test_upload_db_afm(self): base_dir = os.getcwd() - afm_path = "{0}/../data/afm/db_bat_row_fil.afm".format(base_dir) + afm_path = "{0}/data/afm/db_bat_row_fil.afm".format(base_dir) #afm_path = "db_bat_row_fil.afm" try: workfile_id = alpine_client.workfile.get_id("db_bat_row_fil", workspace_id) From 45fa3daf34b79e39dbf06e403491dbbd7a3685d9 Mon Sep 17 00:00:00 2001 From: Alpine Release Date: Mon, 12 Feb 2018 20:41:20 +0800 Subject: [PATCH 2/7] fix the issue that body data not taking affect because of the session header Content-Type not correctly set --- alpine/datasource.py | 7 +++++-- alpine/job.py | 7 +++++++ alpine/user.py | 9 +++++---- alpine/workfile.py | 4 ++-- alpine/workspace.py | 12 ++++++++---- tests/api/test_job.py | 6 +++--- 6 files changed, 30 insertions(+), 15 deletions(-) diff --git a/alpine/datasource.py b/alpine/datasource.py index 67ee71b..46575d1 100644 --- a/alpine/datasource.py +++ b/alpine/datasource.py @@ -34,6 +34,7 @@ def get_list(self, type=None, per_page=100): """ db_datasource_list = None hd_datasource_list = None + self.session.headers.update({"Content-Type": "application/json"}) if not type == "Hadoop": try: url = "{0}/data_sources".format(self.base_url) @@ -116,8 +117,7 @@ def get(self, ds_id, type): ) url = self._add_token_to_url(url) - if self.session.headers.get("Content-DSType") is not None: - self.session.headers.pop("Content-DSType") + self.session.headers.update({"Content-Type": "application/json"}) r = self.session.get(url, verify=False) ds_response = r.json() @@ -175,6 +175,9 @@ def get_database_list(self, data_source_id, per_page=100): url = self._add_token_to_url(url) self.logger.debug("Getting list of databases from {0}".format(url)) page_current = 0 + + self.session.headers.update({"Content-Type": "application/json"}) + while True: payload = { "all": True, diff --git a/alpine/job.py b/alpine/job.py index 156abd9..5b83c5e 100644 --- a/alpine/job.py +++ b/alpine/job.py @@ -66,6 +66,8 @@ def create(self, workspace_id, job_name, schedule_type=None, interval_value=0, n url = "{0}/workspaces/{1}/jobs".format(self.base_url, workspace_id) url = self._add_token_to_url(url) + self.session.headers.update({"Content-Type": "application/x-www-form-urlencoded"}) + # Building the payload information to send with our HTTP POST to create the job payload = {"name": job_name, "interval_unit": schedule_type, @@ -279,6 +281,8 @@ def create(self, workspace_id, job_id, workfile_id, task_type=None): url = self._add_token_to_url(url) self.logger.debug("The URL that we will be posting is: {0}".format(url)) + self.session.headers.update({"Content-Type": "application/x-www-form-urlencoded"}) + # constructing the payload for adding a task payload = {"action": task_type, "workfile_id": workfile_id} @@ -346,6 +350,9 @@ def get_list(self, workspace_id, job_id): url = "{0}/workspaces/{1}/jobs/{2}".format(self.base_url, workspace_id, job_id) url = self._add_token_to_url(url) + if self.session.headers.get("Content-Type") is not None: + self.session.headers.pop("Content-Type") + # Doing a HTTP GET self.logger.debug("POSTing a HTTP GET to retrieve the tasks on the workspace.") response = self.session.get(url) diff --git a/alpine/user.py b/alpine/user.py index 2a5bc40..a9fa408 100644 --- a/alpine/user.py +++ b/alpine/user.py @@ -60,6 +60,7 @@ def create(self, username, password, first_name, last_name, email, title=None, d app_role = User.ApplicationRole.BusinessUser self.session.headers.update({"Content-Type": "application/json"}) # Set special header for this post + url = "{0}/users".format(self.base_url) url = self._add_token_to_url(url) payload = {"username": username, @@ -236,8 +237,7 @@ def get(self, user_id): url = "{0}/users/{1}".format(self.base_url, user_id) url = self._add_token_to_url(url) - if self.session.headers.get("Content-Type") is not None: - self.session.headers.pop("Content-Type") + self.session.headers.update({"Content-Type": "application/json"}) r = self.session.get(url, verify=False) user_response = r.json() @@ -270,8 +270,9 @@ def get_list(self, per_page=100): url = self._add_token_to_url(url) page_current = 0 users_list = None - if self.session.headers.get("Content-Type") is not None: - self.session.headers.pop("Content-Type") + + self.session.headers.update({"Content-Type": "application/json"}) + while True: payload = {"per_page": per_page, "page": page_current + 1} user_list_response = self.session.get(url, params=payload, verify=False).json() diff --git a/alpine/workfile.py b/alpine/workfile.py index 3d591d4..82d87d8 100644 --- a/alpine/workfile.py +++ b/alpine/workfile.py @@ -53,6 +53,7 @@ def get_list(self, workspace_id, per_page=100): url = self._add_token_to_url(url) self.session.headers.update({"Content-Type": "application/json"}) + page_current = 0 while True: payload = {"no_published_worklets": True, @@ -89,8 +90,7 @@ def get(self, workfile_id): url = "{0}/workfiles/{1}".format(self.base_url, workfile_id) url = self._add_token_to_url(url) - if self.session.headers.get("Content-Type") is not None: - self.session.headers.pop("Content-Type") + self.session.headers.update({"Content-Type": "application/json"}) r = self.session.get(url, verify=False) workfile_response = r.json() diff --git a/alpine/workspace.py b/alpine/workspace.py index dd713f4..e94d5b4 100644 --- a/alpine/workspace.py +++ b/alpine/workspace.py @@ -47,6 +47,9 @@ def create(self, workspace_name, public=False, summary=None): str_public = "false" if public: str_public = "true" + + self.session.headers.update({"Content-Type": "application/x-www-form-urlencoded"}) + payload = {"name": workspace_name, "public": str_public, "summary": summary} @@ -121,8 +124,7 @@ def get_list(self, user_id=None, active=None, per_page=50): url = "{0}/workspaces".format(self.base_url) url = self._add_token_to_url(url) - if self.session.headers.get("Content-Type") is not None: - self.session.headers.pop("Content-Type") + self.session.headers.update({"Content-Type": "application/json"}) payload = {"user_id": user_id, "active": active_state, @@ -166,8 +168,7 @@ def get(self, workspace_id): url = "{0}/workspaces/{1}".format(self.base_url, workspace_id) url = self._add_token_to_url(url) - if self.session.headers.get("Content-Type") is not None: - self.session.headers.pop("Content-Type") + self.session.headers.update({"Content-Type": "application/json"}) r = self.session.get(url, verify=False) workspace_response = r.json() @@ -306,6 +307,9 @@ def get_list(self, workspace_id, per_page=100): url = self._add_token_to_url(url) member_list = None page_current = 0 + + self.session.headers.update({"Content-Type": "application/json"}) + while True: payload = {"per_page": per_page, "page": page_current + 1, diff --git a/tests/api/test_job.py b/tests/api/test_job.py index 3652bdd..6a4bb68 100644 --- a/tests/api/test_job.py +++ b/tests/api/test_job.py @@ -242,7 +242,7 @@ def test_add_workflow_task(self): task_info = alpine_client.job.task.create(workspace_id, job_info['id'], workflow_id) self.assertIsNotNone(task_info) self.assertTrue(task_info['is_valid']) - wait_interval_max = 120 + wait_interval_max = 300 print("Wait for max to {0} seconds for the scheduled job run finished".format(wait_interval_max)) for i in range(0, wait_interval_max): job_info_new = alpine_client.job.get(workspace_id, job_info['id']) @@ -272,7 +272,7 @@ def test_delete_task(self): tasks = alpine_client.job.task.get_list(workspace_id, job_info['id']) self.assertEqual(1, len(tasks)) alpine_client.job.task.delete(workspace_id, job_info['id'], task_info['id']) - time.sleep(1) + time.sleep(5) new_tasks = alpine_client.job.task.get_list(workspace_id, job_info['id']) self.assertEqual(0, len(new_tasks)) try: @@ -301,7 +301,7 @@ def test_run_workflow_task(self): self.assertIsNotNone(task_info) self.assertTrue(task_info['is_valid']) s = alpine_client.job.run(job_info['id']) - wait_interval_max = 120 + wait_interval_max = 300 print("Wait for max to {0} seconds for the scheduled job run finished".format(wait_interval_max)) for i in range(0, wait_interval_max): job_info_new = alpine_client.job.get(workspace_id, job_info['id']) From 793cebd21bcc9276f6a6bbdb4a5cf7d91f92037d Mon Sep 17 00:00:00 2001 From: Alpine Release Date: Mon, 12 Feb 2018 22:49:00 +0800 Subject: [PATCH 3/7] add some sleep to ignore test failures --- tests/api/test_job.py | 4 +++- tests/api/test_workfile.py | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/api/test_job.py b/tests/api/test_job.py index 6a4bb68..8ac9993 100644 --- a/tests/api/test_job.py +++ b/tests/api/test_job.py @@ -271,8 +271,9 @@ def test_delete_task(self): task_info = alpine_client.job.task.create(workspace_id, job_info['id'], workflow_id) tasks = alpine_client.job.task.get_list(workspace_id, job_info['id']) self.assertEqual(1, len(tasks)) + time.sleep(3) alpine_client.job.task.delete(workspace_id, job_info['id'], task_info['id']) - time.sleep(5) + time.sleep(3) new_tasks = alpine_client.job.task.get_list(workspace_id, job_info['id']) self.assertEqual(0, len(new_tasks)) try: @@ -300,6 +301,7 @@ def test_run_workflow_task(self): task_info = alpine_client.job.task.create(workspace_id, job_info['id'], workflow_id) self.assertIsNotNone(task_info) self.assertTrue(task_info['is_valid']) + time.sleep(1) s = alpine_client.job.run(job_info['id']) wait_interval_max = 300 print("Wait for max to {0} seconds for the scheduled job run finished".format(wait_interval_max)) diff --git a/tests/api/test_workfile.py b/tests/api/test_workfile.py index a6f8fab..bc1ea5f 100644 --- a/tests/api/test_workfile.py +++ b/tests/api/test_workfile.py @@ -157,6 +157,7 @@ def test_stop_workflow(self): variables = [{"name": "@min_credit_line", "value": "7"}] workfile_id = alpine_client.workfile.get_id(workfile_name, workspace_id) process_id = alpine_client.workfile.process.run(workfile_id, variables) + time.sleep(1) finish_state = alpine_client.workfile.process.stop(process_id) self.assertEqual(finish_state, "STOPPED") From 3fec2f6e382eb0f587790af6894080ca8eb49fd1 Mon Sep 17 00:00:00 2001 From: Alpine Release Date: Fri, 1 Jun 2018 20:40:04 +0800 Subject: [PATCH 4/7] update to support https --- alpine/apiclient.py | 21 ++++++++++----------- tests/api/alpineunittest.py | 13 ++++++++----- tests/api/test_alpine.py | 5 ++++- tests/api/test_dataSource.py | 5 ++++- tests/api/test_job.py | 5 ++++- tests/api/test_user.py | 5 ++++- tests/api/test_workfile.py | 28 ++++++++++++++++++++++++++-- tests/api/test_workspace.py | 5 ++++- 8 files changed, 64 insertions(+), 23 deletions(-) diff --git a/alpine/apiclient.py b/alpine/apiclient.py index 4231080..62706a0 100644 --- a/alpine/apiclient.py +++ b/alpine/apiclient.py @@ -51,7 +51,6 @@ def __init__(self, host=None, port=None, username=None, password=None, is_secure super(APIClient, self).__init__(token=token) self._setup_logging(default_level=logging_level) - self.is_secure = is_secure if is_secure: self.protocol = 'https' @@ -64,13 +63,20 @@ def __init__(self, host=None, port=None, username=None, password=None, is_secure self.host = host else: self.host = "{0}:{1}".format(host, port) - + ### disable InsecureRequestWarning + requests.packages.urllib3.disable_warnings() self.session = requests.Session() # instantiate a session for requests self.base_url = "{0}://{1}/api".format(self.protocol, self.host) - self.ca_certs = ca_certs - self.validate_certs = validate_certs + self.verify = False + if validate_certs == False or ca_certs is None: + self.verify = validate_certs + else: + self.verify = ca_certs + + self.session.verify = self.verify + self.user_id = None if username and password: self.login(username, password) @@ -95,19 +101,12 @@ def login(self, username, password): # url = self.base_url + "/sessions?session_id=NULL" body = {"username": username, "password": password} # TODO login with cert. - cert_path = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), - "../host_deploy/resource/ssl/certificates/test.crt") - - key_path = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), - "../host_deploy/resource/ssl/certificates/test.key") - self.session.headers.update({"Content-Type": "application/x-www-form-urlencoded"}) if self.protocol == 'http': login_response = self.session.post(url, data=body) else: login_response = self.session.post(url, data=body, - verify=self.validate_certs, cert=(cert_path, key_path), headers={'Connection': 'close'}) if login_response.status_code == 201: response = login_response.json() diff --git a/tests/api/alpineunittest.py b/tests/api/alpineunittest.py index 9834b55..7227c44 100644 --- a/tests/api/alpineunittest.py +++ b/tests/api/alpineunittest.py @@ -19,11 +19,14 @@ class AlpineTestCase(TestCase): def setUp(self): - self.host = "10.0.0.205" - self.port = "8080" - self.regex_alpine_version_string = "6.3.*" - self.username = "demoadmin" - self.password = "4*DemoAdmin" + self.is_secure = True + self.validate_certs = False + self.ca_certs = None + self.host = "alpineqa2.alpinenow.local" + self.port = "8443" + self.regex_alpine_version_string = "6.4.*" + self.username = "ggao" + self.password = "1*Alpine" def tearDown(self): pass diff --git a/tests/api/test_alpine.py b/tests/api/test_alpine.py index dc79f7d..22dbff6 100644 --- a/tests/api/test_alpine.py +++ b/tests/api/test_alpine.py @@ -11,7 +11,10 @@ def setUp(self): # Creating Alpine Client in setUp Function for tests global alpine_client global login_info - alpine_client = APIClient(self.host, self.port) + alpine_client = APIClient(self.host, self.port, + is_secure=self.is_secure, + validate_certs=self.validate_certs, + ca_certs=self.ca_certs) login_info = alpine_client.login(self.username, self.password) def tearDown(self): diff --git a/tests/api/test_dataSource.py b/tests/api/test_dataSource.py index cdcefb7..cdb7c3c 100644 --- a/tests/api/test_dataSource.py +++ b/tests/api/test_dataSource.py @@ -12,7 +12,10 @@ def setUp(self): # Creating Alpine Client in setUp Function for tests global alpine_client global login_info - alpine_client = APIClient(self.host, self.port) + alpine_client = APIClient(self.host, self.port, + is_secure=self.is_secure, + validate_certs=self.validate_certs, + ca_certs=self.ca_certs) login_info = alpine_client.login(self.username, self.password) global db_datasource_id diff --git a/tests/api/test_job.py b/tests/api/test_job.py index 8ac9993..64e55bc 100644 --- a/tests/api/test_job.py +++ b/tests/api/test_job.py @@ -16,7 +16,10 @@ def setUp(self): # Creating Alpine Client in setUp Function for tests global alpine_client global login_info - alpine_client = APIClient(self.host, self.port) + alpine_client = APIClient(self.host, self.port, + is_secure=self.is_secure, + validate_certs=self.validate_certs, + ca_certs=self.ca_certs) login_info = alpine_client.login(self.username, self.password) global workspace_id diff --git a/tests/api/test_user.py b/tests/api/test_user.py index 2115090..be06c4e 100644 --- a/tests/api/test_user.py +++ b/tests/api/test_user.py @@ -13,7 +13,10 @@ def setUp(self): # Creating Alpine Client in setUp Function for tests global alpine_client global login_info - alpine_client = APIClient(self.host, self.port) + alpine_client = APIClient(self.host, self.port, + is_secure=self.is_secure, + validate_certs=self.validate_certs, + ca_certs=self.ca_certs) login_info = alpine_client.login(self.username, self.password) def test_create_user(self): diff --git a/tests/api/test_workfile.py b/tests/api/test_workfile.py index bc1ea5f..e6bf64c 100644 --- a/tests/api/test_workfile.py +++ b/tests/api/test_workfile.py @@ -17,7 +17,10 @@ def setUp(self): # Creating Alpine Client in setUp Function for tests global alpine_client global login_info - alpine_client = APIClient(self.host, self.port) + alpine_client = APIClient(self.host, self.port, + is_secure=self.is_secure, + validate_certs=self.validate_certs, + ca_certs=self.ca_certs) login_info = alpine_client.login(self.username, self.password) global workspace_name @@ -126,6 +129,13 @@ def test_run_workflow_variable_quote(self): workfile_id = alpine_client.workfile.get_id(workfile_name, workspace_id) process_id = alpine_client.workfile.process.run(workfile_id, variables) alpine_client.workfile.process.wait_until_finished(workfile_id, process_id) + + def test_run_workflow_variable_single_quote_in_variable(self): + variables = [{"name": "@min_credit_line", "value": "7"}, {"name": "@outlook", "value": "'su\'nny'"}] + workfile_id = alpine_client.workfile.get_id(workfile_name, workspace_id) + process_id = alpine_client.workfile.process.run(workfile_id, variables) + alpine_client.workfile.process.wait_until_finished(workfile_id, process_id) + def test_query_workflow_status(self): valid_workfile_status = ["WORKING", "FINISHED"] @@ -151,7 +161,21 @@ def test_download_workflow_results(self): while workfile_status != "FINISHED": time.sleep(1) workfile_status = alpine_client.workfile.process.query_status(process_id) - response = alpine_client.workfile.process.download_results(workfile_id, process_id) + results = alpine_client.workfile.process.download_results(workfile_id, process_id) + results_metadata = alpine_client.workfile.process.get_metadata(results) + start_time = results_metadata['startTime'] #u'2018-03-14T06:15:42.828-0700' + end_time = results_metadata['endTime'] #u'2018-03-14T06:15:51.480-0700' + status = results_metadata['status'] #Could be either u'FAILURE' or u'SUCCESS' + print(status) + numberOfError = results_metadata['noOfError'] + if results_metadata['noOfError'] != 0: + for log_step in results["logs"]: + errorMessage = log_step["errMessage"] + if errorMessage != 'null': + nodeName = log_step["nodeName"] + uuid = log_step["uuid"] + print("Error Message of Node {0} is: {1}".format(uuid, errorMessage)) + print (status) def test_stop_workflow(self): variables = [{"name": "@min_credit_line", "value": "7"}] diff --git a/tests/api/test_workspace.py b/tests/api/test_workspace.py index f33d8d7..b2f67ad 100644 --- a/tests/api/test_workspace.py +++ b/tests/api/test_workspace.py @@ -12,7 +12,10 @@ def setUp(self): # Creating Alpine Client in setUp Function for tests global alpine_client global login_info - alpine_client = APIClient(self.host, self.port) + alpine_client = APIClient(self.host, self.port, + is_secure=self.is_secure, + validate_certs=self.validate_certs, + ca_certs=self.ca_certs) login_info = alpine_client.login(self.username, self.password) def test_create_new_workspace(self): From 7960c80352fbb0580dceefcc3122df76c0078132 Mon Sep 17 00:00:00 2001 From: Alpine Release Date: Fri, 1 Jun 2018 20:51:19 +0800 Subject: [PATCH 5/7] update to support https --- alpine/apiclient.py | 1 - tests/api/alpineunittest.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/alpine/apiclient.py b/alpine/apiclient.py index 62706a0..624bf66 100644 --- a/alpine/apiclient.py +++ b/alpine/apiclient.py @@ -100,7 +100,6 @@ def login(self, username, password): url = "{0}/sessions?session_id=NULL".format(self.base_url) # url = self.base_url + "/sessions?session_id=NULL" body = {"username": username, "password": password} - # TODO login with cert. self.session.headers.update({"Content-Type": "application/x-www-form-urlencoded"}) if self.protocol == 'http': diff --git a/tests/api/alpineunittest.py b/tests/api/alpineunittest.py index 7227c44..38de6b5 100644 --- a/tests/api/alpineunittest.py +++ b/tests/api/alpineunittest.py @@ -25,8 +25,8 @@ def setUp(self): self.host = "alpineqa2.alpinenow.local" self.port = "8443" self.regex_alpine_version_string = "6.4.*" - self.username = "ggao" - self.password = "1*Alpine" + self.username = "demoadmin" + self.password = "4*DemoAdmin" def tearDown(self): pass From 27a87f3129691a13de28dde0f7cda6ba18071d42 Mon Sep 17 00:00:00 2001 From: Alpine Release Date: Fri, 1 Jun 2018 21:01:08 +0800 Subject: [PATCH 6/7] update to support https --- alpine/apiclient.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alpine/apiclient.py b/alpine/apiclient.py index 624bf66..1521c42 100644 --- a/alpine/apiclient.py +++ b/alpine/apiclient.py @@ -41,8 +41,8 @@ def __init__(self, host=None, port=None, username=None, password=None, is_secure :param str username: Username to log in with. :param str password: Password to log in with. :param bool is_secure: True for HTTPS, else false. - :param bool validate_certs: - :param ca_certs: + :param bool validate_certs: True for SSL Verification, else false + :param ca_certs: If String, Path to SSL client certificate file(.pem). If Tuple, ('cert', 'key') pair :param str token: Alpine API authentication token. :param str logging_level: Use to set the logging level. See https://docs.python.org/2/howto/logging.html#logging-levels. From 0656f39bf88f3f0cd9dc8184878c8d9e9df93749 Mon Sep 17 00:00:00 2001 From: Alpine Release Date: Thu, 13 Sep 2018 10:07:51 +0800 Subject: [PATCH 7/7] update to TIBCO logo --- doc/logo.png | Bin 6218 -> 51768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/logo.png b/doc/logo.png index d8b6da430d0481d83ceedc2a9fe05f967caef76b..884a54749f4f44f50a5ec43251c281bdcf7112e6 100644 GIT binary patch literal 51768 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 Uk97%!s#i>H4P9`l+VhbA0pVj1$^ZZW