Remove old trash

This commit is contained in:
Alexey Milovidov 2021-12-27 12:50:21 +03:00
parent caad89b7cf
commit 8ec4547c17
14 changed files with 0 additions and 4384 deletions

View File

@ -1,5 +0,0 @@
## Build with debug mode and without many libraries
This job is intended as first check that build is not broken on wide variety of platforms.
Results of this build are not intended for production usage.

View File

@ -1,30 +0,0 @@
#!/usr/bin/env bash
set -e -x
# How to run:
# From "ci" directory:
# jobs/quick-build/run.sh
# or:
# ./run-with-docker.sh ubuntu:bionic jobs/quick-build/run.sh
cd "$(dirname $0)"/../..
. default-config
SOURCES_METHOD=local
COMPILER=clang
COMPILER_INSTALL_METHOD=packages
COMPILER_PACKAGE_VERSION=6.0
BUILD_METHOD=normal
BUILD_TARGETS=clickhouse
BUILD_TYPE=Debug
ENABLE_EMBEDDED_COMPILER=0
CMAKE_FLAGS="-D CMAKE_C_FLAGS_ADD=-g0 -D CMAKE_CXX_FLAGS_ADD=-g0 -D ENABLE_JEMALLOC=0 -D ENABLE_CAPNP=0 -D ENABLE_RDKAFKA=0 -D ENABLE_UNWIND=0 -D ENABLE_ICU=0 -D ENABLE_POCO_MONGODB=0 -D ENABLE_POCO_REDIS=0 -D ENABLE_POCO_NETSSL=0 -D ENABLE_ODBC=0 -D ENABLE_MYSQL=0 -D ENABLE_SSL=0 -D ENABLE_POCO_NETSSL=0 -D ENABLE_CASSANDRA=0 -D ENABLE_LDAP=0"
[[ $(uname) == "FreeBSD" ]] && COMPILER_PACKAGE_VERSION=devel && export COMPILER_PATH=/usr/local/bin
. get-sources.sh
. prepare-toolchain.sh
. install-libraries.sh
. build-normal.sh

View File

@ -1 +0,0 @@
.vagrant

View File

@ -1,3 +0,0 @@
Vagrant.configure("2") do |config|
config.vm.box = "generic/freebsd11"
end

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,41 +0,0 @@
How to use Fuzzer
===
The fuzzer consists of auto-generated files:
ClickHouseUnlexer.py
ClickHouseUnparser.py
They are generated from grammar files (.g4) using Grammarinator:
pip3 install grammarinator
grammarinator-process ClickHouseLexer.g4 ClickHouseParser.g4 -o fuzzer/
Then you can generate test input for ClickHouse client:
cd fuzzer
grammarinator-generate \
-r query_list \ # top-level rule
-o /tmp/sql_test_%d.sql \ # template for output test names
-n 10 \ # number of tests
-c 0.3 \
-d 20 \ # depth of recursion
-p ClickHouseUnparser.py -l ClickHouseUnlexer.py \ # auto-generated unparser and unlexer
--test-transformers SpaceTransformer.single_line_whitespace \ # transform function to insert whitespace
For more details see `grammarinator-generate --help`. As a test-transformer function also can be used `SpaceTransformer.multi_line_transformer` - both functions reside in `fuzzer/SpaceTransformer.py` file.
Parsing steps
===
1. Replace all operators with corresponding functions.
2. Replace all asterisks with columns - if it's inside function call, then expand it as multiple arguments. Warn about undeterministic invocations when functions have positional arguments.
Old vs. new parser
===
- `a as b [c]` - accessing aliased array expression is not possible.
- `a as b . 1` - accessing aliased tuple expression is not possible.
- `between a is not null and b` - `between` operator should have lower priority than `is null`.
- `*.1` - accessing asterisk tuple expression is not possible.

View File

@ -1,38 +0,0 @@
# -*- coding: utf-8 -*-
from grammarinator.runtime.tree import *
from itertools import tee, islice, zip_longest
import random
def single_line_whitespace(node):
return _whitespace(node, ' \t')
def multi_line_whitespace(node):
return _whitespace(node, ' \t\r\n')
def _whitespace(node, symbols):
for child in node.children:
_whitespace(child, symbols)
# helper function to look ahead one child
def with_next(iterable):
items, nexts = tee(iterable, 2)
nexts = islice(nexts, 1, None)
return zip_longest(items, nexts)
if isinstance(node, UnparserRule):
new_children = []
for child, next_child in with_next(node.children):
if (not next_child or
next_child and isinstance(next_child, UnlexerRule) and next_child.name == 'DOT' or
isinstance(child, UnlexerRule) and child.name == 'DOT'):
new_children.append(child)
else:
new_children.extend([child, UnlexerRule(src=random.choice(symbols))])
node.children = new_children
return node

View File

@ -1 +0,0 @@
# -*- coding: utf-8 -*-

View File

@ -1,390 +0,0 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:lxslt="http://xml.apache.org/xslt"
xmlns:stringutils="xalan://org.apache.tools.ant.util.StringUtils">
<xsl:output method="html" indent="yes" encoding="UTF-8"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" />
<xsl:decimal-format decimal-separator="." grouping-separator="," />
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<xsl:template match="testsuites">
<html>
<head>
<title>Test Results</title>
<style type="text/css">
body {
font:normal 68% verdana,arial,helvetica;
color:#000000;
}
table.details tr th{
font-weight: bold;
text-align:left;
background:#ffcc00;
}
table.details tr td{
background:#eeeeef;
}
p {
line-height:1.5em;
margin-top:0.5em; margin-bottom:1.0em;
}
h1 {
margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
}
h2 {
margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
}
h3 {
margin-bottom: 0.5em; color:#0077ff; font: bold 115% verdana,arial,helvetica
}
h4 {
margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
}
h5 {
margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
}
h6 {
margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
}
.Error {
font-weight:bold; color:#ff3333;
}
.Failure {
font-weight:bold; color:#0077ff;
}
.Properties {
text-align:right;
}
</style>
<!--
<script type="text/javascript" language="JavaScript">
var Projects = new Array();
var cur;
<xsl:for-each select="./testsuite">
<xsl:apply-templates select="properties"/>
</xsl:for-each>
</script>
<script type="text/javascript" language="JavaScript"><![CDATA[
function displayProperties (name) {
var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
var doc = win.document;
doc.open();
doc.write("<html><head><title>Properties of " + name + "</title>");
doc.write("<style>")
doc.write("body {font:normal 68% verdana,arial,helvetica; color:#000000; }");
doc.write("table tr td, table tr th { font-size: 68%; }");
doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
doc.write("</style>");
doc.write("</head><body>");
doc.write("<h3>Properties of " + name + "</h3>");
doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
doc.write("<table class='properties'>");
doc.write("<tr><th>Name</th><th>Value</th></tr>");
for (prop in Projects[name]) {
doc.write("<tr><th>" + prop + "</th><td>" + Projects[name][prop] + "</td></tr>");
}
doc.write("</table>");
doc.write("</body></html>");
doc.close();
win.focus();
}
]]>
</script>
-->
</head>
<body>
<a name="top"></a>
<xsl:call-template name="pageHeader"/>
<!-- Summary part -->
<xsl:call-template name="summary"/>
<hr size="1" width="95%" align="left"/>
<!-- For each class create the part -->
<xsl:call-template name="classes"/>
</body>
</html>
</xsl:template>
<xsl:template name="classes">
<!-- Сначала упавшие -->
<xsl:for-each select="testsuite[count(testcase/failure) > 0]">
<xsl:call-template name="testsuite"/>
</xsl:for-each>
<xsl:for-each select="testsuite[count(testcase/failure) = 0]">
<xsl:call-template name="testsuite"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="testsuite">
<!-- create an anchor to this class name -->
<a href="#{@name}">
<h3 id="{@name}"><xsl:value-of select="@name"/></h3>
</a>
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<xsl:call-template name="testcase.test.header"/>
<!--
test can even not be started at all (failure to load the class)
so report the error directly
-->
<xsl:if test="./error">
<tr class="Error">
<td colspan="4"><xsl:apply-templates select="./error"/></td>
</tr>
</xsl:if>
<xsl:apply-templates select="./testcase" mode="print.test"/>
</table>
<p/>
<a href="#top">Back to top</a>
</xsl:template>
<xsl:template name="summary">
<h2>Summary</h2>
<xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
<xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
<xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
<xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
<xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<tr valign="top">
<th>Tests</th>
<th>Failures</th>
<th>Errors</th>
<th>Success rate</th>
<th>Time</th>
</tr>
<tr valign="top">
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
</xsl:choose>
</xsl:attribute>
<td><xsl:value-of select="$testCount"/></td>
<td><xsl:value-of select="$failureCount"/></td>
<td><xsl:value-of select="$errorCount"/></td>
<td>
<xsl:call-template name="display-percent">
<xsl:with-param name="value" select="$successRate"/>
</xsl:call-template>
</td>
<td>
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$timeCount"/>
</xsl:call-template>
</td>
</tr>
</table>
<table border="0" width="95%">
<tr>
<td style="text-align: justify;">
Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated.
</td>
</tr>
</table>
</xsl:template>
<!--
Write properties into a JavaScript data structure.
This is based on the original idea by Erik Hatcher (ehatcher@apache.org)
-->
<!--
<xsl:template match="properties">
cur = Projects['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
<xsl:for-each select="property">
<xsl:sort select="@name"/>
cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
</xsl:for-each>
</xsl:template>
-->
<!-- Page HEADER -->
<xsl:template name="pageHeader">
<h1>Test Results</h1>
<hr size="1"/>
</xsl:template>
<xsl:template match="testsuite" mode="header">
<tr valign="top">
<th width="80%">Name</th>
<th>Tests</th>
<th>Errors</th>
<th>Failures</th>
<th nowrap="nowrap">Time(s)</th>
</tr>
</xsl:template>
<!-- class header -->
<xsl:template name="testsuite.test.header">
<tr valign="top">
<th width="80%">Name</th>
<th>Tests</th>
<th>Errors</th>
<th>Failures</th>
<th nowrap="nowrap">Time(s)</th>
<th nowrap="nowrap">Time Stamp</th>
<th>Host</th>
</tr>
</xsl:template>
<!-- method header -->
<xsl:template name="testcase.test.header">
<tr valign="top">
<th>Name</th>
<th>Status</th>
<th width="80%">Type</th>
<th nowrap="nowrap">Time(s)</th>
</tr>
</xsl:template>
<!-- class information -->
<xsl:template match="testsuite" mode="print.test">
<tr valign="top">
<!-- set a nice color depending if there is an error/failure -->
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="failures/text()[.&gt; 0]">Failure</xsl:when>
<xsl:when test="errors/text()[.&gt; 0]">Error</xsl:when>
</xsl:choose>
</xsl:attribute>
<!-- print testsuite information -->
<td><a href="#{@name}"><xsl:value-of select="@name"/></a></td>
<td><xsl:value-of select="tests/text()"/></td>
<td><xsl:value-of select="errors/text()"/></td>
<td><xsl:value-of select="failures/text()"/></td>
<td>
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="time/text()"/>
</xsl:call-template>
</td>
<td><xsl:apply-templates select="@timestamp"/></td>
<td><xsl:apply-templates select="@hostname"/></td>
</tr>
</xsl:template>
<xsl:template match="testcase" mode="print.test">
<tr valign="top">
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="error">Error</xsl:when>
<xsl:when test="failure">Failure</xsl:when>
<xsl:otherwise>TableRowColor</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<td><xsl:value-of select="@name"/></td>
<xsl:choose>
<xsl:when test="failure">
<td>Failure</td>
<td><xsl:apply-templates select="failure"/></td>
</xsl:when>
<xsl:when test="error">
<td>Error</td>
<td><xsl:apply-templates select="error"/></td>
</xsl:when>
<xsl:otherwise>
<td>Success</td>
<td></td>
</xsl:otherwise>
</xsl:choose>
<td>
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="@time"/>
</xsl:call-template>
</td>
</tr>
</xsl:template>
<xsl:template match="failure">
<xsl:call-template name="display-failures"/>
<br/><br/>
<code>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="."/>
</xsl:call-template>
</code>
</xsl:template>
<xsl:template match="error">
<xsl:call-template name="display-failures"/>
<!-- display the stacktrace -->
<br/><br/>
<code>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="."/>
</xsl:call-template>
</code>
</xsl:template>
<!-- Style for the error and failure in the testcase template -->
<xsl:template name="display-failures">
<xsl:choose>
<xsl:when test="not(@message)">N/A</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@message"/>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="@linenumber">
<br></br>
at line <xsl:value-of select="@linenumber"/>
<xsl:choose>
<xsl:when test="@columnnumber">
, column <xsl:value-of select="@columnnumber"/>
</xsl:when>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="JS-escape">
<xsl:param name="string"/>
<xsl:param name="tmp1" select="stringutils:replace(string($string),'\','\\')"/>
<xsl:param name="tmp2" select="stringutils:replace(string($tmp1),&quot;'&quot;,&quot;\&apos;&quot;)"/>
<xsl:value-of select="$tmp2"/>
</xsl:template>
<!--
template that will convert a carriage return into a br tag
@param word the text from which to convert CR to BR tag
-->
<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:param name="splitlimit">32</xsl:param>
<xsl:variable name="secondhalflen" select="(string-length($word)+(string-length($word) mod 2)) div 2"/>
<xsl:variable name="secondhalfword" select="substring($word, $secondhalflen)"/>
<!-- When word is very big, a recursive replace is very heap/stack expensive, so subdivide on line break after middle of string -->
<xsl:choose>
<xsl:when test="(string-length($word) > $splitlimit) and (contains($secondhalfword, '&#xa;'))">
<xsl:variable name="secondhalfend" select="substring-after($secondhalfword, '&#xa;')"/>
<xsl:variable name="firsthalflen" select="string-length($word) - $secondhalflen"/>
<xsl:variable name="firsthalfword" select="substring($word, 1, $firsthalflen)"/>
<xsl:variable name="firsthalfend" select="substring-before($secondhalfword, '&#xa;')"/>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="concat($firsthalfword,$firsthalfend)"/>
</xsl:call-template>
<br/>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="$secondhalfend"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="contains($word, '&#xa;')">
<xsl:value-of select="substring-before($word, '&#xa;')"/>
<br/>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="substring-after($word, '&#xa;')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$word"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="display-time">
<xsl:param name="value"/>
<xsl:value-of select="format-number($value,'0.000')"/>
</xsl:template>
<xsl:template name="display-percent">
<xsl:param name="value"/>
<xsl:value-of select="format-number($value,'0.00%')"/>
</xsl:template>
</xsl:stylesheet>

View File

@ -1,86 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import lxml.etree as etree
import json
import argparse
def export_testcases_json(report, path):
with open(os.path.join(path, "cases.jer"), "w") as testcases_file:
for testsuite in report.getroot():
for testcase in testsuite:
row = {}
row["hostname"] = testsuite.get("hostname")
row["suite"] = testsuite.get("name")
row["suite_duration"] = testsuite.get("time")
row["timestamp"] = testsuite.get("timestamp")
row["testname"] = testcase.get("name")
row["classname"] = testcase.get("classname")
row["file"] = testcase.get("file")
row["line"] = testcase.get("line")
row["duration"] = testcase.get("time")
for el in testcase:
if el.tag == "system-err":
row["stderr"] = el.text
else:
row["stderr"] = ""
if el.tag == "system-out":
row["stdout"] = el.text
else:
row["stdout"] = ""
json.dump(row, testcases_file)
testcases_file.write("\n")
def export_testsuites_json(report, path):
with open(os.path.join(path, "suites.jer"), "w") as testsuites_file:
for testsuite in report.getroot():
row = {}
row["suite"] = testsuite.get("name")
row["errors"] = testsuite.get("errors")
row["failures"] = testsuite.get("failures")
row["hostname"] = testsuite.get("hostname")
row["skipped"] = testsuite.get("skipped")
row["duration"] = testsuite.get("time")
row["timestamp"] = testsuite.get("timestamp")
json.dump(row, testsuites_file)
testsuites_file.write("\n")
def _convert_junit_to_html(junit_path, result_path, export_cases, export_suites):
with open(os.path.join(os.path.dirname(__file__), "junit-noframes.xsl")) as xslt_file:
junit_to_html_xslt = etree.parse(xslt_file)
if not os.path.exists(result_path):
os.makedirs(result_path)
with open(junit_path) as junit_file:
junit_xml = etree.parse(junit_file)
if export_suites:
export_testsuites_json(junit_xml, result_path)
if export_cases:
export_testcases_json(junit_xml, result_path)
transform = etree.XSLT(junit_to_html_xslt)
html = etree.tostring(transform(junit_xml), encoding="utf-8")
with open(os.path.join(result_path, "result.html"), "w") as html_file:
html_file.write(html)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Convert JUnit XML.')
parser.add_argument('junit', help='path to junit.xml report')
parser.add_argument('result_dir', nargs='?', help='directory for result files. Default to junit.xml directory')
parser.add_argument('--export-cases', help='Export JSONEachRow result for testcases to upload in CI', action='store_true')
parser.add_argument('--export-suites', help='Export JSONEachRow result for testsuites to upload in CI', action='store_true')
args = parser.parse_args()
junit_path = args.junit
if args.result_dir:
result_path = args.result_dir
else:
result_path = os.path.dirname(junit_path)
print("junit_path: {}, result_path: {}, export cases:{}, export suites: {}".format(junit_path, result_path, args.export_cases, args.export_suites))
_convert_junit_to_html(junit_path, result_path, args.export_cases, args.export_suites)

View File

@ -1,42 +0,0 @@
#/bin/sh
#
# This script is used to validate the shared libraries
#
# Authors: FoundationDB team, https://github.com/apple/foundationdb/blame/master/build/link-validate.sh
# License: Apache License 2.0
verlte() {
[ "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ]
}
ALLOWED_SHARED_LIBS=("libdl.so.2" "libpthread.so.0" "librt.so.1" "libm.so.6" "libc.so.6" "ld-linux-x86-64.so.2")
if [ "$#" -lt 1 ]; then
echo "USAGE: link-validate.sh BINNAME GLIBC_VERSION"
exit 1
fi
# Step 1: glibc version
for i in $(objdump -T "$1" | awk '{print $5}' | grep GLIBC | sed 's/ *$//g' | sed 's/GLIBC_//' | sort | uniq); do
if ! verlte "$i" "${2:-2.10}"; then
echo "Dependency on newer libc detected: $i"
exit 1
fi
done
# Step 2: Other dynamic dependencies
for j in $(objdump -p "$1" | grep NEEDED | awk '{print $2}'); do
PRESENT=0
for k in ${ALLOWED_SHARED_LIBS[@]}; do
if [[ "$k" == "$j" ]]; then
PRESENT=1
break
fi
done
if ! [[ $PRESENT == 1 ]]; then
echo "Unexpected shared object dependency detected: $j"
exit 1
fi
done

View File

@ -1,34 +0,0 @@
## Tool to upload results to CI ClickHouse
Currently allows to upload results from `junit_to_html` tool to ClickHouse CI
```
usage: upload_test_results [-h] --sha SHA --pr PR --file FILE --type
{suites,cases} [--user USER] --password PASSWORD
[--ca-cert CA_CERT] [--host HOST] [--db DB]
Upload test result to CI ClickHouse.
optional arguments:
-h, --help show this help message and exit
--sha SHA sha of current commit
--pr PR pr of current commit. 0 for master
--file FILE file to upload
--type {suites,cases}
Export type
--user USER user name
--password PASSWORD password
--ca-cert CA_CERT CA certificate path
--host HOST CI ClickHouse host
--db DB CI ClickHouse database name
```
$ ./upload_test_results --sha "cf7eaee3301d4634acdacbfa308ddbe0cc6a061d" --pr "0" --file xyz/cases.jer --type cases --password $PASSWD
CI checks has single commit sha and pr identifier.
While uploading your local results for testing purposes try to use correct sha and pr.
CA Certificate for ClickHouse CI can be obtained from Yandex.Cloud where CI database is hosted
``` bash
wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O YandexInternalRootCA.crt
```

View File

@ -1,127 +0,0 @@
#!/usr/bin/env python3
import requests
import argparse
# CREATE TABLE test_suites
# (
# sha String,
# pr UInt16,
# suite String,
# errors UInt16,
# failures UInt16,
# hostname String,
# skipped UInt16,
# duration Double,
# timestamp DateTime
# ) ENGINE = MergeTree ORDER BY tuple(timestamp, suite);
QUERY_SUITES="INSERT INTO test_suites "\
"SELECT '{sha}' AS sha, "\
"{pr} AS pr, "\
"suite, "\
"errors, "\
"failures, "\
"hostname, "\
"skipped, "\
"duration, "\
"timestamp "\
"FROM input('"\
"suite String, "\
"errors UInt16, "\
"failures UInt16, "\
"hostname String, "\
"skipped UInt16, "\
"duration Double, "\
"timestamp DateTime"\
"') FORMAT JSONEachRow"
# CREATE TABLE test_cases
# (
# sha String,
# pr UInt16,
# hostname String,
# suite String,
# timestamp DateTime,
# testname String,
# classname String,
# file String,
# line UInt16,
# duration Double,
# suite_duration Double,
# stderr String,
# stdout String
# ) ENGINE = MergeTree ORDER BY tuple(timestamp, testname);
QUERY_CASES="INSERT INTO test_cases "\
"SELECT '{sha}' AS sha, "\
"{pr} AS pr, "\
"hostname, "\
"suite, "\
"timestamp, "\
"testname, "\
"classname, "\
"file, "\
"line, "\
"duration, "\
"suite_duration, "\
"stderr,"\
"stdout "\
"FROM input('"\
"hostname String, "\
"suite String, "\
"timestamp DateTime, "\
"testname String, "\
"classname String, "\
"file String, "\
"line UInt16, "\
"duration Double, "\
"suite_duration Double, "\
"stderr String, "\
"stdout String"\
"') FORMAT JSONEachRow"
def upload_request(sha, pr, file, q_type, user, password, ca_cert, host, db):
with open(file) as upload_f:
query = QUERY_SUITES if q_type=="suites" else QUERY_CASES
query = query.format(sha=sha, pr=pr)
url = 'https://{host}:8443/?database={db}&query={query}&date_time_input_format=best_effort'.format(
host=host,
db=db,
query=query
)
data=upload_f
auth = {
'X-ClickHouse-User': user,
'X-ClickHouse-Key': password,
}
print(query);
res = requests.post(
url,
data=data,
headers=auth,
verify=ca_cert)
res.raise_for_status()
return res.text
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Upload test result to CI ClickHouse.')
parser.add_argument('--sha', help='sha of current commit', type=str, required=True)
parser.add_argument('--pr', help='pr of current commit. 0 for master', type=int, required=True)
parser.add_argument('--file', help='file to upload', required=True)
parser.add_argument('--type', help='Export type', choices=['suites', 'cases'] , required=True)
parser.add_argument('--user', help='user name', type=str, default="clickhouse-ci")
parser.add_argument('--password', help='password', type=str, required=True)
parser.add_argument('--ca-cert', help='CA certificate path', type=str, default="/usr/local/share/ca-certificates/YandexInternalRootCA.crt")
parser.add_argument('--host', help='CI ClickHouse host', type=str, default="c1a-ity5agjmuhyu6nu9.mdb.yandexcloud.net")
parser.add_argument('--db', help='CI ClickHouse database name', type=str, default="clickhouse-ci")
args = parser.parse_args()
print((upload_request(args.sha, args.pr, args.file, args.type, args.user, args.password, args.ca_cert, args.host, args.db)))