Skip to content

Instantly share code, notes, and snippets.

@wynemo
Last active April 23, 2018 04:38
Show Gist options
  • Save wynemo/27617eec4a258133af1938b8c88e025c to your computer and use it in GitHub Desktop.
Save wynemo/27617eec4a258133af1938b8c88e025c to your computer and use it in GitHub Desktop.
test.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
" wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\n",
" sh Anaconda2-4.2.0-Linux-x86_64.sh\n",
" ~/miniconda3/bin/conda create -vv -n py3k python=3\n",
" ~/miniconda3/bin/conda install -n py3k requests pyquery sqlalchemy matplotlib numpy flask tenjin\n",
" ~/miniconda3/envs/py3k/bin/python\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2 % 2 = 0\n",
"3 % 3 = 0\n",
"4 % 2 = 0\n",
"6 % 3 = 0\n",
"8 % 2 = 0\n",
"9 % 3 = 0\n",
"10 % 2 = 0\n",
"12 % 3 = 0\n",
"14 % 2 = 0\n",
"15 % 3 = 0\n",
"0\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n",
"8\n",
"9\n",
"10\n",
"11\n",
"12\n",
"13\n",
"14\n",
"/home/user/miniconda3/envs/py3k/lib/python3.6/site-packages/ipykernel_launcher.py\n"
]
}
],
"source": [
"import sys\n",
"\n",
"\n",
"def test_yield():\n",
" for i in range(0, 15):\n",
" yield i\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" i = 0\n",
" while 1:\n",
" i += 1\n",
" if i % 3 == 0:\n",
" print('%s %% 3 = 0' % i)\n",
" elif i % 2 == 0:\n",
" print('%s %% 2 = 0' % i)\n",
" else:\n",
" continue\n",
" if i == 15:\n",
" break\n",
" \n",
" for each in test_yield():\n",
" print(each)\n",
" \n",
" print(sys.argv[0])\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<div class=\"contentLayout2\">\n",
"<div class=\"columnLayout single\" data-layout=\"single\">\n",
"<div class=\"cell normal\" data-type=\"normal\">\n",
"<div class=\"innerCell\">\n",
"<h2 id=\"RoadDBR&amp;DTrainingSessions(ONTVmonitor)-April\"><em><strong>April</strong></em></h2></div>\n",
"</div>\n",
"</div>\n",
"<div class=\"columnLayout single\" data-layout=\"single\">\n",
"<div class=\"cell normal\" data-type=\"normal\">\n",
"<div class=\"innerCell\">\n",
"<div class=\"table-wrap\"><table class=\"confluenceTable\"><tbody><tr><th class=\"confluenceTh\">Team</th><th class=\"confluenceTh\">Time</th><th class=\"confluenceTh\">Session</th><th colspan=\"1\" class=\"confluenceTh\">Content</th><th colspan=\"1\" class=\"confluenceTh\">Lecturer</th></tr><tr><td class=\"confluenceTd\">SAM</td><td class=\"confluenceTd\"><time datetime=\"2018-04-04\" class=\"date-past\">04 Apr 2018</time> </td><td class=\"confluenceTd\"><span>非线性最小二乘优化(Powell’s Dog Leg)</span></td><td colspan=\"1\" class=\"confluenceTd\"> </td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-us\n"
]
},
{
"data": {
"text/html": [
"\n",
"<div class=\"columnLayout single\" data-layout=\"single\">\n",
"<div class=\"cell normal\" data-type=\"normal\">\n",
"<div class=\"innerCell\">\n",
"<h2 id=\"RoadDBR&amp;DTrainingSessions(ONTVmonitor)-April\"><em><strong>April</strong></em></h2></div>\n",
"</div>\n",
"</div>\n",
"<div class=\"columnLayout single\" data-layout=\"single\">\n",
"<div class=\"cell normal\" data-type=\"normal\">\n",
"<div class=\"innerCell\">\n",
"<div class=\"table-wrap\"><table class=\"confluenceTable table-dark\" style=\"width: 100%\"><tbody><tr><th class=\"confluenceTh\">Team</th><th class=\"confluenceTh\">Time</th><th class=\"confluenceTh\">Session</th><th colspan=\"1\" class=\"confluenceTh\">Content</th><th colspan=\"1\" class=\"confluenceTh\">Lecturer</th></tr><tr><td class=\"confluenceTd\">SAM</td><td class=\"confluenceTd\"><time datetime=\"2018-04-04\" class=\"date-past\">04 Apr 2018</time> </td><td class=\"confluenceTd\"><span>非线性最小二乘优化(Powell’s Dog Leg)</span></td><td colspan=\"1\" class=\"confluenceTd\"> </td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Jie.Feng\" href=\"/display/~Jie.Feng\" data-linked-resource-id=\"19641093\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Jie Feng</a></td></tr><tr><td class=\"confluenceTd\">STORM</td><td class=\"confluenceTd\"><time datetime=\"2018-04-09\" class=\"date-past\">09 Apr 2018</time> </td><td class=\"confluenceTd\">Atlassian 系列产品使用技巧与规范</td><td colspan=\"1\" class=\"confluenceTd\"><p>Confluence / JIRA 使用技巧与规范</p><p>Stash / Sourcetree 使用技巧与规范</p></td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Zhixun.Xia\" href=\"/display/~Zhixun.Xia\" data-linked-resource-id=\"9863543\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Zhixun Xia</a></td></tr><tr><td class=\"confluenceTd\"><span>STORM</span></td><td class=\"confluenceTd\"><time datetime=\"2018-04-12\" class=\"date-upcoming\">12 Apr 2018</time> </td><td class=\"confluenceTd\">算法开发过程</td><td colspan=\"1\" class=\"confluenceTd\"><p>算法调研;</p><p>算法仿真与实验报告;</p><p>算法实现与维护</p></td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Yao.Chen\" href=\"/display/~Yao.Chen\" data-linked-resource-id=\"12754278\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Yao Chen</a></td></tr><tr><td class=\"confluenceTd\"><span>STORM</span></td><td class=\"confluenceTd\"><time datetime=\"2018-04-16\" class=\"date-upcoming\">16 Apr 2018</time> </td><td class=\"confluenceTd\">提高研发效率</td><td colspan=\"1\" class=\"confluenceTd\">工作计划,时间统筹,风险控制</td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Zhixun.Xia\" href=\"/display/~Zhixun.Xia\" data-linked-resource-id=\"9863543\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Zhixun Xia</a></td></tr></tbody></table></div></div>\n",
"</div>\n",
"</div>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import requests\n",
"from pyquery import PyQuery as pq\n",
"from IPython.core.display import HTML\n",
"\n",
"\n",
"bamboo_name = 'roaddb_devops'\n",
"bamboo_pw = '******'\n",
"auth = (bamboo_name, bamboo_pw,)\n",
"r = requests.get('https://confluence.ygomi.com:8443/rest/api/content/40928055?expand=body.view', auth=auth)\n",
"info = r.json()\n",
"html = info['body']['view']['value']\n",
"print(html[:1000])\n",
"doc = pq(html)\n",
"element = doc('table')\n",
"element.css('width', '100%')\n",
"element.toggle_class('table-dark')\n",
"display(HTML(doc.html()))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2018-04-11 12:46:32,692 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'\n",
"2018-04-11 12:46:32,694 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:46:33,365 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()\n",
"2018-04-11 12:46:33,367 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:46:34,706 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1\n",
"2018-04-11 12:46:34,707 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:46:35,378 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1\n",
"2018-04-11 12:46:35,380 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:46:36,048 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)\n",
"2018-04-11 12:46:36,383 INFO sqlalchemy.engine.base.Engine \n",
"SELECT sum(x.checked), sum(x.covered), x.team, x.date1 from\n",
" (select sum(uaf.lines_check) as checked, sum(uaf.cov_lines) as covered, uaf.team as team, CAST(uaf.date_time as date) as date1\n",
" from ut_all_files uaf\n",
" left JOIN ut_details utd on uaf.src_file = utd.src_file and uaf.team = utd.team and uaf.buildnum = utd.buildnum\n",
" left join ut_exclude_head_file uehf on uaf.src_file = uehf.file_name and uaf.team = uehf.team and CAST(uaf.date_time as date) = CAST(uehf.date as date)\n",
" WHERE IS_UT_FILE(uaf.src_file, uaf.team) = 0 and utd.src_file is NULL and uehf.file_name is NULL and uaf.date_time >= %s and uaf.date_time < %s \n",
" GROUP BY uaf.team, date1\n",
" union\n",
" select sum(utd.lines_check) as checked, sum(utd.cov_lines) as covered, utd.team as team, CAST(utd.date_time as date) as date1\n",
" from ut_details utd\n",
" left join ut_exclude_head_file uehf on utd.src_file = uehf.file_name and utd.team = uehf.team and CAST(utd.date_time as date) = CAST(uehf.date as date)\n",
" WHERE IS_UT_FILE(utd.src_file, utd.team) = 0 and uehf.file_name is NULL and utd.date_time >= %s and utd.date_time < %s\n",
" GROUP BY utd.team, date1) x\n",
"GROUP BY x.team, x.date1\n",
"\n",
"2018-04-11 12:46:36,385 INFO sqlalchemy.engine.base.Engine ('2018-04-01', '2018-04-06', '2018-04-01', '2018-04-06')\n",
"DB 37328 32416 2018-04-01\n",
"DB 37328 32416 2018-04-02\n",
"DB 27996 24312 2018-04-03\n",
"DB 37328 32416 2018-04-04\n",
"FWS 87244 65065 2018-04-01\n",
"FWS 87653 65355 2018-04-02\n",
"FWS 67344 50275 2018-04-03\n",
"FWS 89792 67022 2018-04-04\n",
"FWV 143312 116991 2018-04-01\n",
"FWV 143312 116965 2018-04-02\n",
"FWV 107484 87749 2018-04-03\n",
"FWV 143399 116958 2018-04-04\n",
"SAM 85424 48571 2018-04-01\n",
"SAM 84811 53431 2018-04-02\n",
"SAM 63642 40313 2018-04-03\n",
"SAM 84858 53754 2018-04-04\n",
"SLAM 84508 42768 2018-04-01\n",
"SLAM 84508 42768 2018-04-02\n",
"SLAM 63381 32076 2018-04-03\n",
"SLAM 84508 42768 2018-04-04\n",
"STORM 43912 24388 2018-04-01\n",
"STORM 43912 24388 2018-04-02\n",
"STORM 32934 18291 2018-04-03\n",
"STORM 43912 24388 2018-04-04\n",
"SYS 76040 60502 2018-04-01\n",
"SYS 76040 60488 2018-04-02\n",
"SYS 57030 45371 2018-04-03\n",
"SYS 76040 60466 2018-04-04\n",
"2018-04-11 12:47:04,362 INFO sqlalchemy.engine.base.Engine COMMIT\n"
]
}
],
"source": [
"#!/usr/bin/env python3\n",
"import json\n",
"import sys\n",
"\n",
"from sqlalchemy import create_engine\n",
"\n",
"query = '''\n",
"SELECT sum(x.checked), sum(x.covered), x.team, x.date1 from\n",
" (select sum(uaf.lines_check) as checked, sum(uaf.cov_lines) as covered, uaf.team as team, CAST(uaf.date_time as date) as date1\n",
" from ut_all_files uaf\n",
" left JOIN ut_details utd on uaf.src_file = utd.src_file and uaf.team = utd.team and uaf.buildnum = utd.buildnum\n",
" left join ut_exclude_head_file uehf on uaf.src_file = uehf.file_name and uaf.team = uehf.team and CAST(uaf.date_time as date) = CAST(uehf.date as date)\n",
" WHERE IS_UT_FILE(uaf.src_file, uaf.team) = 0 and utd.src_file is NULL and uehf.file_name is NULL and uaf.date_time >= %s and uaf.date_time < %s \n",
" GROUP BY uaf.team, date1\n",
" union\n",
" select sum(utd.lines_check) as checked, sum(utd.cov_lines) as covered, utd.team as team, CAST(utd.date_time as date) as date1\n",
" from ut_details utd\n",
" left join ut_exclude_head_file uehf on utd.src_file = uehf.file_name and utd.team = uehf.team and CAST(utd.date_time as date) = CAST(uehf.date as date)\n",
" WHERE IS_UT_FILE(utd.src_file, utd.team) = 0 and uehf.file_name is NULL and utd.date_time >= %s and utd.date_time < %s\n",
" GROUP BY utd.team, date1) x\n",
"GROUP BY x.team, x.date1\n",
"'''\n",
"\n",
"\n",
"def connection_str():\n",
" conn_str = 'mysql+mysqlconnector://%s:%s@%s/%s' % ('devops', '****',\n",
" '10.74.16.252', 'cm_data')\n",
" return conn_str\n",
"\n",
"\n",
"def create_mysql_engine():\n",
" global engine\n",
" conn_str = connection_str()\n",
" engine = create_engine(conn_str, echo=True, pool_size=20, pool_recycle=3600)\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" begin = '2018-04-01'\n",
" end = '2018-04-06'\n",
" create_mysql_engine()\n",
" with engine.begin() as connection:\n",
" r1 = connection.execute(query, begin, end, begin, end)\n",
" if r1:\n",
" for checked, covered, team, date, in r1:\n",
" print(team, checked, covered, date)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2018-04-11 12:52:51,359 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'\n",
"2018-04-11 12:52:51,361 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:52,032 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()\n",
"2018-04-11 12:52:52,035 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:53,373 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1\n",
"2018-04-11 12:52:53,375 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:54,043 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1\n",
"2018-04-11 12:52:54,044 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:55,047 INFO sqlalchemy.engine.base.Engine SHOW FULL TABLES FROM `cm_data`\n",
"2018-04-11 12:52:55,048 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:55,720 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_billing`\n",
"2018-04-11 12:52:55,721 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:56,409 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_cpu_utilization`\n",
"2018-04-11 12:52:56,410 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:57,082 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_instances_daily`\n",
"2018-04-11 12:52:57,082 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:57,752 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_resource_name`\n",
"2018-04-11 12:52:57,753 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:58,425 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_error_team`\n",
"2018-04-11 12:52:58,427 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:59,099 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_incremental_dependencies_info`\n",
"2018-04-11 12:52:59,101 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:52:59,773 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_incremental_job_info`\n",
"2018-04-11 12:52:59,775 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:00,447 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_incremental_plan_info`\n",
"2018-04-11 12:53:00,449 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:01,121 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_package_size`\n",
"2018-04-11 12:53:01,123 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:01,799 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_plan_duration`\n",
"2018-04-11 12:53:01,800 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:02,475 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_repos_file_size`\n",
"2018-04-11 12:53:02,476 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:03,147 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_repos_size`\n",
"2018-04-11 12:53:03,149 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:03,820 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_dates`\n",
"2018-04-11 12:53:03,822 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:04,493 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_names`\n",
"2018-04-11 12:53:04,496 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:05,166 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_paths`\n",
"2018-04-11 12:53:05,168 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:05,838 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_size_check_paths`\n",
"2018-04-11 12:53:05,840 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:06,511 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_total_lines`\n",
"2018-04-11 12:53:06,512 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:07,183 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `test_1`\n",
"2018-04-11 12:53:07,185 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:07,854 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_all_files`\n",
"2018-04-11 12:53:07,857 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:08,530 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_coverage_tmp`\n",
"2018-04-11 12:53:08,531 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:09,201 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_details`\n",
"2018-04-11 12:53:09,202 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:09,873 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_exclude_head_file`\n",
"2018-04-11 12:53:09,875 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:10,549 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `weekly_remain_instance`\n",
"2018-04-11 12:53:10,551 INFO sqlalchemy.engine.base.Engine {}\n",
"2018-04-11 12:53:11,256 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)\n",
"2018-04-11 12:53:11,591 INFO sqlalchemy.engine.base.Engine SELECT bamboo_error_team.plan_key AS bamboo_error_team_plan_key, bamboo_error_team.build_num AS bamboo_error_team_build_num \n",
"FROM bamboo_error_team \n",
"WHERE bamboo_error_team.state = %(state_1)s AND bamboo_error_team.end_date + %(end_date_1)s < %(param_1)s\n",
"2018-04-11 12:53:11,592 INFO sqlalchemy.engine.base.Engine {'state_1': 0, 'end_date_1': 7200, 'param_1': 1523422391.255745}\n",
"set()\n",
"2018-04-11 12:53:11,930 INFO sqlalchemy.engine.base.Engine COMMIT\n"
]
}
],
"source": [
"#!/usr/bin/env python3\n",
"from contextlib import contextmanager\n",
"import datetime\n",
"import json\n",
"import sys\n",
"\n",
"from sqlalchemy.ext.automap import automap_base\n",
"from sqlalchemy.orm import sessionmaker\n",
"from sqlalchemy import create_engine\n",
"\n",
"@contextmanager\n",
"def session_scope():\n",
" \"\"\"Provide a transactional scope around a series of operations.\"\"\"\n",
" Session = sessionmaker(bind=engine)\n",
" session = Session()\n",
" try:\n",
" yield session\n",
" session.commit()\n",
" except:\n",
" session.rollback()\n",
" raise\n",
" finally:\n",
" session.close()\n",
" \n",
" \n",
"def connection_str():\n",
" conn_str = 'mysql+mysqlconnector://%s:%s@%s/%s' % ('devops', '*******',\n",
" '10.74.16.252', 'cm_data')\n",
" return conn_str\n",
"\n",
"def get_class_bamboo_failures():\n",
" global engine, BambooFailures\n",
" conn_str = connection_str()\n",
" Base = automap_base()\n",
" engine = create_engine(conn_str, echo=True, pool_size=20, pool_recycle=3600)\n",
" Base.prepare(engine, reflect=True)\n",
" BambooFailures = Base.classes.bamboo_error_team\n",
"\n",
"\n",
"def create_mysql_engine():\n",
" global engine\n",
" conn_str = connection_str()\n",
" engine = create_engine(conn_str, echo=True, pool_size=20, pool_recycle=3600)\n",
"\n",
"\n",
"def main():\n",
" get_class_bamboo_failures()\n",
"\n",
" now = datetime.datetime.utcnow()\n",
" now_stamp = (now - datetime.datetime(1970, 1, 1)).total_seconds()\n",
" with session_scope() as session:\n",
" failures = session.query(BambooFailures.plan_key, BambooFailures.build_num).filter(\n",
" BambooFailures.state == 0, BambooFailures.end_date + 7200 < now_stamp)\n",
"\n",
" to_check_list = set()\n",
" for each in failures:\n",
" print(each)\n",
" to_check_list.add(each)\n",
" \n",
" print(to_check_list)\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" main() "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import datetime\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.dates import DayLocator, HourLocator, DateFormatter, drange\n",
"from numpy import arange, array\n",
"\n",
"\n",
"def generate_chart(start_day, end_day):\n",
" delta = datetime.timedelta(hours=24)\n",
" dates = drange(start_day, end_day, delta)\n",
"\n",
" costs = [1, 2, 3, 4, 5, 6, 7]\n",
" y1 = array(costs)\n",
" costs = [7, 9, 31, 14, 15, 1, 7]\n",
" y2 = array(costs)\n",
"\n",
" fig, ax = plt.subplots()\n",
" end_day = end_day - datetime.timedelta(days=1)\n",
" ax.set_title('Cost Chart from %s to %s' % (start_day.strftime('%Y-%m-%d'), end_day.strftime('%Y-%m-%d')))\n",
" font = {\n",
" 'size': '16'\n",
" }\n",
" ax.set_ylabel('cost($)', fontdict=font)\n",
" ax.plot_date(dates, y1, '-')\n",
" ax.plot_date(dates, y2, '-')\n",
" plt.legend(['cost1', 'cost2'], loc='upper left')\n",
" fig.set_figwidth(12)\n",
"\n",
" # this is superfluous, since the autoscaler should get it right, but\n",
" # use date2num and num2date to convert between dates and floats if\n",
" # you want; both date2num and num2date convert an instance or sequence\n",
" ax.set_xlim(dates[0], dates[-1])\n",
"\n",
" # The hour locator takes the hour or sequence of hours you want to\n",
" # tick, not the base multiple\n",
"\n",
" ax.xaxis.set_major_locator(DayLocator())\n",
" ax.xaxis.set_minor_locator(HourLocator(arange(0, 25, 6)))\n",
" ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))\n",
"\n",
" ax.fmt_xdata = DateFormatter('%Y-%m-%d %H:%M:%S')\n",
" fig.autofmt_xdate()\n",
"\n",
" plt.plot()\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" start_day = datetime.datetime.strptime('2018-04-01', '%Y-%m-%d')\n",
" end_day = datetime.datetime.strptime('2018-04-08', '%Y-%m-%d')\n",
" generate_chart(start_day, end_day)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-1\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA68AAAGrCAYAAAAvlqHWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xu4XWV9L/rvLyEQIBH3xoBAjMGtRWiAgBGpCgSxRyy06lGLCFr0eGJlW/EWobvytHTrKSpWrBXdqGyrlUsLRSpaKz1AgUrlogkXUy+ksQa8AC2Va8Tw7j/mDC4WSVhZWWuuMZPP53nWkznHeMd4f3PlfeZc3/mOS7XWAgAAAF02baoLAAAAgCcivAIAANB5wisAAACdJ7wCAADQecIrAAAAnSe8AgAA0HnCKwAMkaq6r6qesZH1q6rqxYOsCQAGQXgFgE0wUeGwqk6oqmueoM2VVfWmkctaa7Naayv76z9bVe/b3FoAYBgIrwAAAHSe8AoAY1RVn08yL8mX+ofvvqe//OCq+npV3VNVy6tq8YhtTqiqlVV1b1X9a1UdV1V7J/lkkl/r7+ee9fT1/iSHJPnzfps/7y9vVfXMqlqS5Lgk7+mv/9J69jGtqk6pqtuq6u6q+quq+q+T8KsBgElXrbWprgEAhkZVrUryptbaP/Sf75HkpiSvS/LVJEckOT/Js5M8kORHSZ7bWvtOVe2W5L+21m6tqhP6+3nhRvq6MslfttY+PWJZS/Ks1tr3q+qzSVa31t67vvqq6qQkxyZ5VZI7k/xZkie11o6diN8FAAySmVcA2DzHJ/lKa+0rrbVHWmuXJbkhyW/01z+SZEFVbd9a+1Fr7dYB1va7Sf6gtba6tbYmyR8leVVVbTPAGgBgQgivALB5np7k1f1Dhu/pHwL8wiS7tdbuT3JMeiHyR1X15ap69oBru3hEXSuSrE2y6wBrAIAJIbwCwKYZfb7ND5N8vrX25BE/O7bWTk+S1trft9Z+PcluSf4lyac2sJ+x9LWp63+Y5KWjapvZWrt9DH0DQKcIrwCwaX6SZOR9Vv8yyW9W1UuqanpVzayqxVU1t6p2raqXVdWOSdYkuS+9w4jX7WduVW27CX1t6vpPJnl/VT09SapqTlW9bOMvDwC6SXgFgE3zJ0ne2z8U992ttR8meVmS/5HeRZF+mGRpep+x05K8M8kdSf49yWFJ3tLfz+VJbk3y46q6awN9fTS9c1T/o6r+bD3rP5Nkn34tX9zA9n+b5GtVdW+Sf07yvE1+xQDQAa42DAAAQOeZeQUAAKDzhFcAAAA6T3gFAACg84RXAAAAOm+bqS7giTzlKU9p8+fPn+oyAAAAmGA33njjXa21OWNp2/nwOn/+/Nxwww1TXQYAAAATrKp+MNa2DhsGAACg84RXAAAAOk94BQAAoPM6f87r+jz88MNZvXp1HnrooakupfNmzpyZuXPnZsaMGVNdCgAAwLgNZXhdvXp1Zs+enfnz56eqprqczmqt5e67787q1auz5557TnU5AAAA4zaUhw0/9NBD2XnnnQXXJ1BV2Xnnnc1QAwAAQ28ow2sSwXWM/J4AAIAtwdCGVwAAALYeQ3nO62i7XLLHhO7vpy+7fUL3tyne9KY35Z3vfGf22WefKasBAACga7aI8DqVWmtprWXatImZxP70pz89IfsBAADYkjhseBxWrVqVvfbaK69//euzYMGCTJ8+/dF1F154YU444YQkyQknnJC3ve1tef7zn59nPOMZufDCC5MkV155ZRYvXpxXvepVefazn53jjjsurbUkyeLFi3PDDTckSWbNmpU/+IM/yP7775+DDz44P/nJT5Ikt912Ww4++ODsu+++ee9735tZs2YN8NUDAAAMnvA6Tt/73vdy4okn5tZbb82OO+64wXY/+tGPcs011+TSSy/NKaec8ujyb33rWznzzDPz7W9/OytXrsw//dM/PW7b+++/PwcffHCWL1+eQw89NJ/61KeSJCeddFJOOumk3HzzzZk7d+7EvzgAAICOEV7H6elPf3oOPvjgJ2z38pe/PNOmTcs+++zz6Mxpkhx00EGZO3dupk2bloULF2bVqlWP23bbbbfN0UcfnSR5znOe82iba6+9Nq9+9auTJK997Ws3/8UAAAB03MDDa1U9uaourKp/qaoVVfVrg65hIoycbR15O5rR91TdbrvtHn287tDg0cunT5+eX/ziF4/rY8aMGY/ue0NtAAAAtgZTMfP60SRfba09O8n+SVZMQQ0Tatddd82KFSvyyCOP5OKLL570/g4++OBcdNFFSZLzzz9/0vsDAACYagO92nBV7ZTk0CQnJElr7edJfr65+53KW9skyemnn56jjz46c+bMyaJFi3LfffdNan9nnnlmjj/++Lz//e/PkUcemZ122mlS+wMAAJhqNfJQ1knvrGphkrOTfDu9Wdcbk5zUWrt/VLslSZYkybx5857zgx/84DH7WbFiRfbee++B1NxFDzzwQLbffvtUVc4///ycd955ueSSSzbYfmv/fQEAwOba5ZI9xr3tqbefPO5t37xy6bi3TZJtz1izWdtPtqq6sbW2aCxtB33Y8DZJDkzyidbaAUnuT3LK6EattbNba4taa4vmzJkz4BK778Ybb8zChQuz33775ayzzsqHP/zhqS4JAABgUg30sOEkq5Osbq19o//8wqwnvLJxhxxySJYvXz7VZQAAAAzMQGdeW2s/TvLDqtqrv+iI9A4hBgAAgA0a9Mxrkvxeki9U1bZJViZ5wxTUAAAAwBAZeHhtrS1LMqYTcgEAACCZmvu8AgAAwCaZisOGJ9zHzvqzCd3f7534tk3e5swzz8ySJUuyww47TGgtY7V48eKcccYZWbTIpDYAALDlMfM6Qc4888w88MADU10GAADAFkl4HYf7778/Rx11VPbff/8sWLAgp512Wu64444cfvjhOfzww5Mk5513Xvbdd98sWLAgJ5/8y5sSz5o1K+94xzvyq7/6qzniiCNy5513JunNnJ500klZuHBhFixYkOuuu+7Rvt74xjfmoIMOygEHHJBLLrkkSfLggw/mNa95Tfbee++84hWvyIMPPjjg3wIAAMDgCK/j8NWvfjW77757li9fnltuuSVvf/vbs/vuu+eKK67IFVdckTvuuCMnn3xyLr/88ixbtizXX399vvjFLybphdFFixbl1ltvzWGHHZbTTjvt0f0+8MADWbZsWc4666y88Y1vTJK8//3vz4te9KJcd911ueKKK7J06dLcf//9+cQnPpEddtghK1asyGmnnZYbb7xxSn4XAAAAgyC8jsO+++6byy67LCeffHKuvvrq7LTTTo9Zf/3112fx4sWZM2dOttlmmxx33HG56qqrkiTTpk3LMccckyQ5/vjjc8011zy63bHHHpskOfTQQ/Ozn/0s99xzT772ta/l9NNPz8KFC7N48eI89NBD+bd/+7dcddVVOf7445Mk++23X/bbb79BvHQAAIApsUVcsGnQfuVXfiXf/OY385WvfCXvfe97c8QRR4x7X1W13sfrnrfWctFFF2WvvfYadx8AAADDzszrONxxxx3ZYYcdcvzxx2fp0qX55je/mdmzZ+fee+9Nkhx00EH5x3/8x9x1111Zu3ZtzjvvvBx22GFJkkceeSQXXnhhkuTcc8/NC1/4wkf3e8EFFyRJrrnmmuy0007Zaaed8pKXvCQf+9jH0lpLknzrW99K0pudPffcc5Mkt9xyS2666abBvHgAAIApsEXMvI7n1jab4+abb87SpUszbdq0zJgxI5/4xCdy7bXX5sgjj3z03NfTTz89hx9+eFprOeqoo/Kyl70sSbLjjjvmuuuuy/ve977ssssujwbWJJk5c2YOOOCAPPzwwznnnHOSJKeeemre/va3Z7/99ssjjzySPffcM5deemne8pa35A1veEP23nvv7L333nnOc54z0N8BAADAINW6Gb2uWrRoUbvhhhses2zFihXZe++9p6iizTNr1qzcd999j1s+mfdpHebfFwAAdMEul+wx7m1Pvf3kJ260AW9euXTc2ybJtmes2aztJ1tV3dhaG1MIctgwAAAAnbdFHDY8TNY365okV1555WALAQAAGCJmXgEAAOg84RUAAIDOE14BAADoPOEVAACAztsiLtj083dvN6H7e6LLSd9zzz0599xzc+KJJ26wzapVq/L1r389r33taze6r1WrVuXoo4/OLbfcMq5aAQAAtgZmXsfhnnvuyVlnnbXRNqtWrcq55547oIoAAAC2bMLrOJxyyim57bbbsnDhwixdujRLly7NggULsu++++aCCy54tM3VV1+dhQsX5iMf+UhWrVqVQw45JAceeGAOPPDAfP3rX5/iVwEAADA8tojDhgft9NNPzy233JJly5bloosuyic/+cksX748d911V5773Ofm0EMPzemnn54zzjgjl156aZLkgQceyGWXXZaZM2fme9/7Xo499tjccMMNU/xKAAAAhoPwupmuueaaHHvssZk+fXp23XXXHHbYYbn++uvzpCc96THtHn744bz1rW/NsmXLMn369Hz3u9+doooBAACGj/A6IB/5yEey6667Zvny5XnkkUcyc+bMqS4JAABgaDjndRxmz56de++9N0lyyCGH5IILLsjatWtz55135qqrrspBBx30mDZJ8p//+Z/ZbbfdMm3atHz+85/P2rVrp6p8AACAobNFzLw+0a1tJtrOO++cF7zgBVmwYEFe+tKXZr/99sv++++fqsoHP/jBPPWpT83OO++c6dOnZ//9988JJ5yQ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\n",
"text/plain": [
"<Figure size 1152x504 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def generate_group_bar_chart(title, ylabel, teams, *other):\n",
" fig, ax = plt.subplots()\n",
" ax.set_title('test title')\n",
" font = {\n",
" 'size': '16'\n",
" }\n",
" ax.set_ylabel(ylabel, fontdict=font)\n",
"\n",
" x = arange(len(teams))\n",
"\n",
" width = 0.1\n",
" i = -int(len(other) / 2)\n",
" print(i)\n",
" for y, label, color in other:\n",
" ax.bar(x + i * width, y, width=width, align='center', color=color, label=label)\n",
" i += 1\n",
"\n",
" plt.legend()\n",
"\n",
" ax.autoscale_view()\n",
" fig.set_figwidth(16)\n",
" fig.set_figheight(7)\n",
"\n",
" plt.xticks(x + (i - 1) * width, teams)\n",
"\n",
" plt.plot()\n",
" \n",
"if __name__ == '__main__':\n",
" teams = ['TEST', 'SYS', 'DELIVERY', 'SAM', 'SLAM', 'STORM']\n",
" num1s = [1, 2, 3, 4, 5, 6]\n",
" num2s = [1, 2, 3, 4, 5, 6]\n",
" num3s = [1, 2, 3, 4, 5, 6]\n",
" y, z, k = (num1s, 'running', 'xkcd:green'), (num2s, 'stopped', 'xkcd:grey'), (num3s, 'total', 'xkcd:orange') \n",
" generate_group_bar_chart('test title', 'y data', teams, y, z, k)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"from flask import Flask, request\n",
"import jinja2\n",
"import requests\n",
"from pyquery import PyQuery as pq\n",
"\n",
"@app.route(\"/flask/api/training\")\n",
"def training():\n",
" bamboo_name = config['bamboo_name']\n",
" bamboo_pw = config['bamboo_pw']\n",
" auth = (bamboo_name, bamboo_pw,)\n",
" r = requests.get('https://confluence.ygomi.com:8443/rest/api/content/40928055?expand=body.view', auth=auth)\n",
" info = r.json()\n",
" html = info['body']['view']['value']\n",
" doc = pq(html)\n",
" element = doc('table')\n",
" element.css('width', '100%')\n",
" element.toggle_class('table-dark')\n",
"\n",
" rv = '''<link rel=\"stylesheet\" href=\"http://dashboard.ygomi.com/public/build/grafana.dark.css?v5.0.1\">\n",
" <div class=\"markdown-html panel-text-content\">''' + doc.html() + '</div>'\n",
" return rv\n",
"\n",
"\n",
"@app.route(\"/flask/bamboo.html\")\n",
"def bamboo_html():\n",
" plan_name = request.args.get('plan_name')\n",
" s = render('templates/bamboo.html', {'plan_name': plan_name})\n",
" return s\n",
"\n",
"\n",
"if __name__ == \"__main__\":\n",
" port = int(os.environ.get(\"PORT\", 5000))\n",
" app = Flask(__name__)\n",
" if len(sys.argv) > 1:\n",
" config_file = sys.argv[1]\n",
" else:\n",
" config_file = 'config.json'\n",
" with open(config_file, 'rb') as f:\n",
" config = json.load(f)\n",
" app.run(host='0.0.0.0', port=port)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"<html>\n",
"<head>\n",
" <link rel=\"stylesheet\" href=\"http://dashboard.ygomi.com/public/build/grafana.dark.css?v5.0.1\">\n",
" <script type=\"text/javascript\" src=\"http://cdn.jsdelivr.net/jquery/1/jquery.min.js\"></script>\n",
"</head>\n",
"<script>\n",
" window.onload = function () {\n",
" $.ajax({\n",
" url: \"/flask/api/bamboo?plan_name={{ plan_name }}\",\n",
" }).done(function (msg) {\n",
" let data = JSON.parse(msg);\n",
" let data_len = data['contents'].length;\n",
" let contents = data['contents'];\n",
" console.log(data_len);\n",
" if (data_len > 1) {\n",
" let count = data_len < 9 ? data_len : 9;\n",
" for (let i = 0; i < count; i++) {\n",
" var s = '<li><a class=\"table-panel-page-link pointer \">' + (i + 1).toString() + '</a></li>'\n",
" $('.table-panel-footer ul').append($(s));\n",
" $('.table-panel-footer ul').children().first().children().addClass('active');\n",
" }\n",
" }\n",
" if (data_len > 0) {\n",
" var s = '<table style=\"width: 100%\"><tbody><tr><th>num</th><th>status</th><th>date</th><th>duration</th></tr>';\n",
" if (\"{{ plan_name }}\" === \"0_L1_rdb_2_0_build\") {\n",
" s = '<table style=\"width: 100%\"><tbody><tr><th>num</th><th>status</th><th>date</th><th>duration</th><th>ut</th><th>e2e</th></tr>';\n",
" }\n",
" for (let i = 0; i < 20; i++) {\n",
" let line = contents[i];\n",
" s += '<tr>' + '<td>' + line['num'] + '</td>' + '<td>' + line['status'] + '</td>' + '<td>' + line['date'] + '</td>' + '<td>' + line['duration'] + '</td>';\n",
" if (\"{{ plan_name }}\" === \"0_L1_rdb_2_0_build\") {\n",
" let link = \"https://bamboo-aws.ygomi.com:8443/browse/TOOL-UT-\" + line['num'] + \"/artifact/shared/Coverage_Report/ut_group_details\";\n",
" let text = 'ut_' + line['num'];\n",
" s += '<td><a target=\"_blank\" href=\"' + link + '\">' + text + '</a></td>';\n",
" link = \"http://10.69.130.22/RDB20/\" + line['num'];\n",
" text = 'e2e_' + line['num'];\n",
" s += '<td><a target=\"_blank\" href=\"' + link + '\">' + text + '</a></td>';\n",
" }\n",
" s += '</tr>';\n",
" }\n",
" s += '</tbody></table>';\n",
" $('div.markdown-html.panel-text-content').append($(s));\n",
" }\n",
" });\n",
" };\n",
"</script>\n",
"<body>\n",
"<div class=\"markdown-html panel-text-content\">\n",
"\n",
"</div>\n",
"\n",
"<div class=\"table-panel-footer\">\n",
" <ul>\n",
" </ul>\n",
"</div>\n",
"</body>\n",
"</html>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment