mirror of
https://github.com/servo/servo.git
synced 2025-08-07 14:35:33 +01:00
chore: Remove some stale files (#37401)
Stale files in root dir are really annoying. We could probably remove more stuff in etc/ci, but I was very conservative. Testing: Just removing old as earth files Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
parent
8e1cf31db3
commit
8a14dd318a
7 changed files with 0 additions and 824 deletions
121
.clang-format
121
.clang-format
|
@ -1,121 +0,0 @@
|
||||||
---
|
|
||||||
Language: Cpp
|
|
||||||
BasedOnStyle: Mozilla
|
|
||||||
AccessModifierOffset: -2
|
|
||||||
AlignAfterOpenBracket: Align
|
|
||||||
AlignConsecutiveAssignments: false
|
|
||||||
AlignConsecutiveDeclarations: false
|
|
||||||
AlignEscapedNewlines: Right
|
|
||||||
AlignOperands: true
|
|
||||||
AlignTrailingComments: true
|
|
||||||
AllowAllParametersOfDeclarationOnNextLine: true
|
|
||||||
AllowShortBlocksOnASingleLine: false
|
|
||||||
AllowShortCaseLabelsOnASingleLine: false
|
|
||||||
AllowShortFunctionsOnASingleLine: All
|
|
||||||
AllowShortIfStatementsOnASingleLine: false
|
|
||||||
AllowShortLoopsOnASingleLine: false
|
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
|
||||||
AlwaysBreakAfterReturnType: None
|
|
||||||
AlwaysBreakBeforeMultilineStrings: false
|
|
||||||
AlwaysBreakTemplateDeclarations: MultiLine
|
|
||||||
BinPackArguments: true
|
|
||||||
BinPackParameters: true
|
|
||||||
BraceWrapping:
|
|
||||||
AfterClass: false
|
|
||||||
AfterControlStatement: false
|
|
||||||
AfterEnum: false
|
|
||||||
AfterFunction: false
|
|
||||||
AfterNamespace: false
|
|
||||||
AfterObjCDeclaration: false
|
|
||||||
AfterStruct: false
|
|
||||||
AfterUnion: false
|
|
||||||
AfterExternBlock: false
|
|
||||||
BeforeCatch: false
|
|
||||||
BeforeElse: false
|
|
||||||
IndentBraces: false
|
|
||||||
SplitEmptyFunction: true
|
|
||||||
SplitEmptyRecord: true
|
|
||||||
SplitEmptyNamespace: true
|
|
||||||
BreakBeforeBinaryOperators: None
|
|
||||||
BreakBeforeBraces: Attach
|
|
||||||
BreakBeforeInheritanceComma: false
|
|
||||||
BreakInheritanceList: BeforeColon
|
|
||||||
BreakBeforeTernaryOperators: true
|
|
||||||
BreakConstructorInitializersBeforeComma: false
|
|
||||||
BreakConstructorInitializers: BeforeColon
|
|
||||||
BreakAfterJavaFieldAnnotations: false
|
|
||||||
BreakStringLiterals: true
|
|
||||||
ColumnLimit: 80
|
|
||||||
CommentPragmas: '^ IWYU pragma:'
|
|
||||||
CompactNamespaces: false
|
|
||||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
|
||||||
ConstructorInitializerIndentWidth: 4
|
|
||||||
ContinuationIndentWidth: 4
|
|
||||||
Cpp11BracedListStyle: true
|
|
||||||
DerivePointerAlignment: false
|
|
||||||
DisableFormat: false
|
|
||||||
ExperimentalAutoDetectBinPacking: false
|
|
||||||
FixNamespaceComments: true
|
|
||||||
ForEachMacros:
|
|
||||||
- foreach
|
|
||||||
- Q_FOREACH
|
|
||||||
- BOOST_FOREACH
|
|
||||||
IncludeBlocks: Preserve
|
|
||||||
IncludeCategories:
|
|
||||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
|
||||||
Priority: 2
|
|
||||||
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
|
||||||
Priority: 3
|
|
||||||
- Regex: '.*'
|
|
||||||
Priority: 1
|
|
||||||
IncludeIsMainRegex: '(Test)?$'
|
|
||||||
IndentCaseLabels: false
|
|
||||||
IndentPPDirectives: None
|
|
||||||
IndentWidth: 2
|
|
||||||
IndentWrappedFunctionNames: false
|
|
||||||
JavaScriptQuotes: Leave
|
|
||||||
JavaScriptWrapImports: true
|
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
|
||||||
MacroBlockBegin: ''
|
|
||||||
MacroBlockEnd: ''
|
|
||||||
MaxEmptyLinesToKeep: 1
|
|
||||||
NamespaceIndentation: None
|
|
||||||
ObjCBinPackProtocolList: Auto
|
|
||||||
ObjCBlockIndentWidth: 2
|
|
||||||
ObjCSpaceAfterProperty: false
|
|
||||||
ObjCSpaceBeforeProtocolList: true
|
|
||||||
PenaltyBreakAssignment: 2
|
|
||||||
PenaltyBreakBeforeFirstCallParameter: 19
|
|
||||||
PenaltyBreakComment: 300
|
|
||||||
PenaltyBreakFirstLessLess: 120
|
|
||||||
PenaltyBreakString: 1000
|
|
||||||
PenaltyBreakTemplateDeclaration: 10
|
|
||||||
PenaltyExcessCharacter: 1000000
|
|
||||||
PenaltyReturnTypeOnItsOwnLine: 60
|
|
||||||
PointerAlignment: Right
|
|
||||||
ReflowComments: true
|
|
||||||
SortIncludes: false
|
|
||||||
SortUsingDeclarations: true
|
|
||||||
SpaceAfterCStyleCast: false
|
|
||||||
SpaceAfterTemplateKeyword: true
|
|
||||||
SpaceBeforeAssignmentOperators: true
|
|
||||||
SpaceBeforeCpp11BracedList: false
|
|
||||||
SpaceBeforeCtorInitializerColon: true
|
|
||||||
SpaceBeforeInheritanceColon: true
|
|
||||||
SpaceBeforeParens: ControlStatements
|
|
||||||
SpaceBeforeRangeBasedForLoopColon: true
|
|
||||||
SpaceInEmptyParentheses: false
|
|
||||||
SpacesBeforeTrailingComments: 1
|
|
||||||
SpacesInAngles: false
|
|
||||||
SpacesInContainerLiterals: true
|
|
||||||
SpacesInCStyleCastParentheses: false
|
|
||||||
SpacesInParentheses: false
|
|
||||||
SpacesInSquareBrackets: false
|
|
||||||
Standard: Cpp11
|
|
||||||
StatementMacros:
|
|
||||||
- Q_UNUSED
|
|
||||||
- QT_REQUIRE_VERSION
|
|
||||||
TabWidth: 8
|
|
||||||
UseTab: Never
|
|
||||||
...
|
|
||||||
|
|
8
CLOBBER
8
CLOBBER
|
@ -1,8 +0,0 @@
|
||||||
# To trigger a clobber replace ALL of the textual description below,
|
|
||||||
# giving a pull request number and a one line description of why a clobber is
|
|
||||||
# required.
|
|
||||||
#
|
|
||||||
# Modifying this file will now automatically clobber the buildbot machines \o/
|
|
||||||
#
|
|
||||||
|
|
||||||
Pull 16722 - Added CLOBBER file
|
|
|
@ -1,177 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import csv
|
|
||||||
from datetime import datetime, date
|
|
||||||
import json
|
|
||||||
from math import floor
|
|
||||||
import os
|
|
||||||
from urllib.request import urlopen, HTTPError
|
|
||||||
|
|
||||||
SCRIPT_PATH = os.path.split(__file__)[0]
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
default_output_dir = os.path.join(SCRIPT_PATH, "output")
|
|
||||||
default_cache_dir = os.path.join(SCRIPT_PATH, ".cache")
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description="Download buildbot metadata")
|
|
||||||
parser.add_argument(
|
|
||||||
"--index-url",
|
|
||||||
type=str,
|
|
||||||
default="https://build.servo.org/json",
|
|
||||||
help="the URL to get the JSON index data index from. Default: https://build.servo.org/json",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--build-url",
|
|
||||||
type=str,
|
|
||||||
default="https://build.servo.org/json/builders/{}/builds/{}",
|
|
||||||
help="the URL to get the JSON build data from. Default: https://build.servo.org/json/builders/{}/builds/{}",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--cache-dir",
|
|
||||||
type=str,
|
|
||||||
default=default_cache_dir,
|
|
||||||
help="the directory to cache JSON files in. Default: " + default_cache_dir,
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--cache-name",
|
|
||||||
type=str,
|
|
||||||
default="build-{}-{}.json",
|
|
||||||
help="the filename to cache JSON data in. Default: build-{}-{}.json",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--output-dir",
|
|
||||||
type=str,
|
|
||||||
default=default_output_dir,
|
|
||||||
help="the directory to save the CSV data to. Default: " + default_output_dir,
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--output-name",
|
|
||||||
type=str,
|
|
||||||
default="builds-{}-{}.csv",
|
|
||||||
help="the filename to save the CSV data to. Default: builds-{}-{}.csv",
|
|
||||||
)
|
|
||||||
parser.add_argument("--verbose", "-v", action="store_true", help="print every HTTP request")
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
os.makedirs(args.cache_dir, exist_ok=True)
|
|
||||||
os.makedirs(args.output_dir, exist_ok=True)
|
|
||||||
|
|
||||||
# Get the index to find out the list of builder names
|
|
||||||
# Note: this isn't cached
|
|
||||||
if args.verbose:
|
|
||||||
print("Downloading index {}.".format(args.index_url))
|
|
||||||
with urlopen(args.index_url) as response:
|
|
||||||
index = json.loads(response.read().decode("utf-8"))
|
|
||||||
|
|
||||||
builds = []
|
|
||||||
|
|
||||||
for builder in sorted(index["builders"]):
|
|
||||||
# The most recent build is at offset -1
|
|
||||||
# Fetch it to find out the build number
|
|
||||||
# Note: this isn't cached
|
|
||||||
recent_build_url = args.build_url.format(builder, -1)
|
|
||||||
if args.verbose:
|
|
||||||
print("Downloading recent build {}.".format(recent_build_url))
|
|
||||||
with urlopen(recent_build_url) as response:
|
|
||||||
recent_build = json.loads(response.read().decode("utf-8"))
|
|
||||||
recent_build_number = recent_build["number"]
|
|
||||||
|
|
||||||
# Download each build, and convert to CSV
|
|
||||||
for build_number in range(0, recent_build_number):
|
|
||||||
# Rather annoyingly, we can't just use the Python http cache,
|
|
||||||
# because it doesn't cache 404 responses. So we roll our own.
|
|
||||||
cache_json_name = args.cache_name.format(builder, build_number)
|
|
||||||
cache_json = os.path.join(args.cache_dir, cache_json_name)
|
|
||||||
if os.path.isfile(cache_json):
|
|
||||||
with open(cache_json) as f:
|
|
||||||
build = json.load(f)
|
|
||||||
|
|
||||||
else:
|
|
||||||
# Get the build data
|
|
||||||
build_url = args.build_url.format(builder, build_number)
|
|
||||||
if args.verbose:
|
|
||||||
print("Downloading build {}.".format(build_url))
|
|
||||||
try:
|
|
||||||
with urlopen(build_url) as response:
|
|
||||||
build = json.loads(response.read().decode("utf-8"))
|
|
||||||
except HTTPError as e:
|
|
||||||
if e.code == 404:
|
|
||||||
build = {}
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
# Don't cache current builds.
|
|
||||||
if build.get("currentStep"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
with open(cache_json, "w+") as f:
|
|
||||||
json.dump(build, f)
|
|
||||||
|
|
||||||
if "times" in build:
|
|
||||||
builds.append(build)
|
|
||||||
|
|
||||||
years = {}
|
|
||||||
for build in builds:
|
|
||||||
build_date = date.fromtimestamp(build["times"][0])
|
|
||||||
years.setdefault(build_date.year, {}).setdefault(build_date.month, []).append(build)
|
|
||||||
|
|
||||||
for year, months in years.items():
|
|
||||||
for month, builds in months.items():
|
|
||||||
output_name = args.output_name.format(year, month)
|
|
||||||
output = os.path.join(args.output_dir, output_name)
|
|
||||||
|
|
||||||
# Create the CSV file.
|
|
||||||
if args.verbose:
|
|
||||||
print("Creating file {}.".format(output))
|
|
||||||
with open(output, "w+") as output_file:
|
|
||||||
output_csv = csv.writer(output_file)
|
|
||||||
|
|
||||||
# The CSV column names
|
|
||||||
output_csv.writerow(
|
|
||||||
[
|
|
||||||
"builder",
|
|
||||||
"buildNumber",
|
|
||||||
"buildTimestamp",
|
|
||||||
"stepName",
|
|
||||||
"stepText",
|
|
||||||
"stepNumber",
|
|
||||||
"stepStart",
|
|
||||||
"stepFinish",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
for build in builds:
|
|
||||||
builder = build["builderName"]
|
|
||||||
build_number = build["number"]
|
|
||||||
build_timestamp = datetime.fromtimestamp(build["times"][0]).replace(microsecond=0)
|
|
||||||
|
|
||||||
# Write out the timing data for each step
|
|
||||||
for step in build["steps"]:
|
|
||||||
if step["isFinished"]:
|
|
||||||
step_name = step["name"]
|
|
||||||
step_text = " ".join(step["text"])
|
|
||||||
step_number = step["step_number"]
|
|
||||||
step_start = floor(step["times"][0])
|
|
||||||
step_finish = floor(step["times"][1])
|
|
||||||
output_csv.writerow(
|
|
||||||
[
|
|
||||||
builder,
|
|
||||||
build_number,
|
|
||||||
build_timestamp,
|
|
||||||
step_name,
|
|
||||||
step_text,
|
|
||||||
step_number,
|
|
||||||
step_start,
|
|
||||||
step_finish,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
|
@ -1,51 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import boto3
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description=(
|
|
||||||
"Set the policy of the servo-perf bucket. Remember to set your S3 credentials https://github.com/boto/boto3"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
parser.parse_args()
|
|
||||||
|
|
||||||
s3 = boto3.resource("s3")
|
|
||||||
BUCKET = "servo-perf"
|
|
||||||
POLICY = """{
|
|
||||||
"Version":"2012-10-17",
|
|
||||||
"Statement":[
|
|
||||||
{
|
|
||||||
"Effect":"Allow",
|
|
||||||
"Principal":"*",
|
|
||||||
"Action":[
|
|
||||||
"s3:ListBucket",
|
|
||||||
"s3:GetBucketLocation"
|
|
||||||
],
|
|
||||||
"Resource":"arn:aws:s3:::servo-perf"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Effect":"Allow",
|
|
||||||
"Principal":"*",
|
|
||||||
"Action":[
|
|
||||||
"s3:GetObject",
|
|
||||||
"s3:GetObjectAcl"
|
|
||||||
],
|
|
||||||
"Resource":"arn:aws:s3:::servo-perf/*"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}"""
|
|
||||||
|
|
||||||
s3.BucketPolicy(BUCKET).put(Policy=POLICY)
|
|
||||||
|
|
||||||
print("Done!")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
|
@ -1,312 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
from functools import partial, reduce
|
|
||||||
import json
|
|
||||||
import operator
|
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import string
|
|
||||||
from thclient import TreeherderClient, TreeherderResultSetCollection, TreeherderJobCollection
|
|
||||||
import time
|
|
||||||
|
|
||||||
from runner import format_result_summary
|
|
||||||
|
|
||||||
|
|
||||||
def geometric_mean(iterable):
|
|
||||||
filtered = list(filter(lambda x: x > 0, iterable))
|
|
||||||
return (reduce(operator.mul, filtered)) ** (1.0 / len(filtered))
|
|
||||||
|
|
||||||
|
|
||||||
def format_testcase_name(name):
|
|
||||||
temp = name.replace("http://localhost:8000/page_load_test/", "")
|
|
||||||
temp = temp.replace("http://localhost:8000/tp6/", "")
|
|
||||||
temp = temp.split("/")[0]
|
|
||||||
temp = temp[0:80]
|
|
||||||
return temp
|
|
||||||
|
|
||||||
|
|
||||||
def format_perf_data(perf_json, engine="servo"):
|
|
||||||
suites = []
|
|
||||||
measurement = "domComplete" # Change this to an array when we have more
|
|
||||||
|
|
||||||
def get_time_from_nav_start(timings, measurement):
|
|
||||||
return timings[measurement] - timings["navigationStart"]
|
|
||||||
|
|
||||||
measurementFromNavStart = partial(get_time_from_nav_start, measurement=measurement)
|
|
||||||
|
|
||||||
if engine == "gecko":
|
|
||||||
name = "gecko.{}".format(measurement)
|
|
||||||
else:
|
|
||||||
name = measurement
|
|
||||||
|
|
||||||
suite = {"name": name, "value": geometric_mean(map(measurementFromNavStart, perf_json)), "subtests": []}
|
|
||||||
for testcase in perf_json:
|
|
||||||
if measurementFromNavStart(testcase) < 0:
|
|
||||||
value = -1
|
|
||||||
# print('Error: test case has negative timing. Test timeout?')
|
|
||||||
else:
|
|
||||||
value = measurementFromNavStart(testcase)
|
|
||||||
|
|
||||||
suite["subtests"].append({"name": format_testcase_name(testcase["testcase"]), "value": value})
|
|
||||||
|
|
||||||
suites.append(suite)
|
|
||||||
|
|
||||||
return {
|
|
||||||
"performance_data": {
|
|
||||||
# https://bugzilla.mozilla.org/show_bug.cgi?id=1271472
|
|
||||||
"framework": {"name": "servo-perf"},
|
|
||||||
"suites": suites,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def create_resultset_collection(dataset):
|
|
||||||
print("[DEBUG] ResultSet Collection:")
|
|
||||||
print(dataset)
|
|
||||||
trsc = TreeherderResultSetCollection()
|
|
||||||
|
|
||||||
for data in dataset:
|
|
||||||
trs = trsc.get_resultset()
|
|
||||||
|
|
||||||
trs.add_push_timestamp(data["push_timestamp"])
|
|
||||||
trs.add_revision(data["revision"])
|
|
||||||
trs.add_author(data["author"])
|
|
||||||
# TODO: figure out where type is used
|
|
||||||
# trs.add_type(data['type'])
|
|
||||||
|
|
||||||
revisions = []
|
|
||||||
for rev in data["revisions"]:
|
|
||||||
tr = trs.get_revision()
|
|
||||||
|
|
||||||
tr.add_revision(rev["revision"])
|
|
||||||
tr.add_author(rev["author"])
|
|
||||||
tr.add_comment(rev["comment"])
|
|
||||||
tr.add_repository(rev["repository"])
|
|
||||||
|
|
||||||
revisions.append(tr)
|
|
||||||
trs.add_revisions(revisions)
|
|
||||||
|
|
||||||
trsc.add(trs)
|
|
||||||
|
|
||||||
return trsc
|
|
||||||
|
|
||||||
|
|
||||||
def create_job_collection(dataset):
|
|
||||||
print("[DEBUG] Job Collection:")
|
|
||||||
print(dataset)
|
|
||||||
|
|
||||||
tjc = TreeherderJobCollection()
|
|
||||||
|
|
||||||
for data in dataset:
|
|
||||||
tj = tjc.get_job()
|
|
||||||
|
|
||||||
tj.add_revision(data["revision"])
|
|
||||||
tj.add_project(data["project"])
|
|
||||||
tj.add_coalesced_guid(data["job"]["coalesced"])
|
|
||||||
tj.add_job_guid(data["job"]["job_guid"])
|
|
||||||
tj.add_job_name(data["job"]["name"])
|
|
||||||
tj.add_job_symbol(data["job"]["job_symbol"])
|
|
||||||
tj.add_group_name(data["job"]["group_name"])
|
|
||||||
tj.add_group_symbol(data["job"]["group_symbol"])
|
|
||||||
tj.add_description(data["job"]["desc"])
|
|
||||||
tj.add_product_name(data["job"]["product_name"])
|
|
||||||
tj.add_state(data["job"]["state"])
|
|
||||||
tj.add_result(data["job"]["result"])
|
|
||||||
tj.add_reason(data["job"]["reason"])
|
|
||||||
tj.add_who(data["job"]["who"])
|
|
||||||
tj.add_tier(data["job"]["tier"])
|
|
||||||
tj.add_submit_timestamp(data["job"]["submit_timestamp"])
|
|
||||||
tj.add_start_timestamp(data["job"]["start_timestamp"])
|
|
||||||
tj.add_end_timestamp(data["job"]["end_timestamp"])
|
|
||||||
tj.add_machine(data["job"]["machine"])
|
|
||||||
|
|
||||||
tj.add_build_info(
|
|
||||||
data["job"]["build_platform"]["os_name"],
|
|
||||||
data["job"]["build_platform"]["platform"],
|
|
||||||
data["job"]["build_platform"]["architecture"],
|
|
||||||
)
|
|
||||||
|
|
||||||
tj.add_machine_info(
|
|
||||||
data["job"]["machine_platform"]["os_name"],
|
|
||||||
data["job"]["machine_platform"]["platform"],
|
|
||||||
data["job"]["machine_platform"]["architecture"],
|
|
||||||
)
|
|
||||||
|
|
||||||
tj.add_option_collection(data["job"]["option_collection"])
|
|
||||||
|
|
||||||
for artifact_data in data["job"]["artifacts"]:
|
|
||||||
tj.add_artifact(artifact_data["name"], artifact_data["type"], artifact_data["blob"])
|
|
||||||
tjc.add(tj)
|
|
||||||
|
|
||||||
return tjc
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: refactor this big function to smaller chunks
|
|
||||||
def submit(perf_data, failures, revision, summary, engine):
|
|
||||||
print("[DEBUG] failures:")
|
|
||||||
print(list(map(lambda x: x["testcase"], failures)))
|
|
||||||
|
|
||||||
author = "{} <{}>".format(revision["author"]["name"], revision["author"]["email"])
|
|
||||||
|
|
||||||
dataset = [
|
|
||||||
{
|
|
||||||
# The top-most revision in the list of commits for a push.
|
|
||||||
"revision": revision["commit"],
|
|
||||||
"author": author,
|
|
||||||
"push_timestamp": int(revision["author"]["timestamp"]),
|
|
||||||
"type": "push",
|
|
||||||
# a list of revisions associated with the resultset. There should
|
|
||||||
# be at least one.
|
|
||||||
"revisions": [
|
|
||||||
{
|
|
||||||
"comment": revision["subject"],
|
|
||||||
"revision": revision["commit"],
|
|
||||||
"repository": "servo",
|
|
||||||
"author": author,
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
trsc = create_resultset_collection(dataset)
|
|
||||||
|
|
||||||
result = "success"
|
|
||||||
# TODO: verify a failed test won't affect Perfherder visualization
|
|
||||||
# if len(failures) > 0:
|
|
||||||
# result = "testfailed"
|
|
||||||
|
|
||||||
hashlen = len(revision["commit"])
|
|
||||||
job_guid = "".join(random.choice(string.ascii_letters + string.digits) for i in range(hashlen))
|
|
||||||
|
|
||||||
if engine == "gecko":
|
|
||||||
project = "servo"
|
|
||||||
job_symbol = "PLG"
|
|
||||||
group_symbol = "SPG"
|
|
||||||
group_name = "Servo Perf on Gecko"
|
|
||||||
else:
|
|
||||||
project = "servo"
|
|
||||||
job_symbol = "PL"
|
|
||||||
group_symbol = "SP"
|
|
||||||
group_name = "Servo Perf"
|
|
||||||
|
|
||||||
dataset = [
|
|
||||||
{
|
|
||||||
"project": project,
|
|
||||||
"revision": revision["commit"],
|
|
||||||
"job": {
|
|
||||||
"job_guid": job_guid,
|
|
||||||
"product_name": project,
|
|
||||||
"reason": "scheduler",
|
|
||||||
# TODO: What is `who` for?
|
|
||||||
"who": "Servo",
|
|
||||||
"desc": "Servo Page Load Time Tests",
|
|
||||||
"name": "Servo Page Load Time",
|
|
||||||
# The symbol representing the job displayed in
|
|
||||||
# treeherder.allizom.org
|
|
||||||
"job_symbol": job_symbol,
|
|
||||||
# The symbol representing the job group in
|
|
||||||
# treeherder.allizom.org
|
|
||||||
"group_symbol": group_symbol,
|
|
||||||
"group_name": group_name,
|
|
||||||
# TODO: get the real timing from the test runner
|
|
||||||
"submit_timestamp": str(int(time.time())),
|
|
||||||
"start_timestamp": str(int(time.time())),
|
|
||||||
"end_timestamp": str(int(time.time())),
|
|
||||||
"state": "completed",
|
|
||||||
"result": result, # "success" or "testfailed"
|
|
||||||
"machine": "local-machine",
|
|
||||||
# TODO: read platform from test result
|
|
||||||
"build_platform": {"platform": "linux64", "os_name": "linux", "architecture": "x86_64"},
|
|
||||||
"machine_platform": {"platform": "linux64", "os_name": "linux", "architecture": "x86_64"},
|
|
||||||
"option_collection": {"opt": True},
|
|
||||||
# jobs can belong to different tiers
|
|
||||||
# setting the tier here will determine which tier the job
|
|
||||||
# belongs to. However, if a job is set as Tier of 1, but
|
|
||||||
# belongs to the Tier 2 profile on the server, it will still
|
|
||||||
# be saved as Tier 2.
|
|
||||||
"tier": 1,
|
|
||||||
# the ``name`` of the log can be the default of "buildbot_text"
|
|
||||||
# however, you can use a custom name. See below.
|
|
||||||
# TODO: point this to the log when we have them uploaded to S3
|
|
||||||
"log_references": [{"url": "TBD", "name": "test log"}],
|
|
||||||
# The artifact can contain any kind of structured data
|
|
||||||
# associated with a test.
|
|
||||||
"artifacts": [
|
|
||||||
{
|
|
||||||
"type": "json",
|
|
||||||
"name": "performance_data",
|
|
||||||
# TODO: include the job_guid when the runner actually
|
|
||||||
# generates one
|
|
||||||
# 'job_guid': job_guid,
|
|
||||||
"blob": perf_data,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "json",
|
|
||||||
"name": "Job Info",
|
|
||||||
# 'job_guid': job_guid,
|
|
||||||
"blob": {
|
|
||||||
"job_details": [{"content_type": "raw_html", "title": "Result Summary", "value": summary}]
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
# List of job guids that were coalesced to this job
|
|
||||||
"coalesced": [],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
tjc = create_job_collection(dataset)
|
|
||||||
|
|
||||||
# TODO: extract this read credential code out of this function.
|
|
||||||
cred = {"client_id": os.environ["TREEHERDER_CLIENT_ID"], "secret": os.environ["TREEHERDER_CLIENT_SECRET"]}
|
|
||||||
|
|
||||||
client = TreeherderClient(
|
|
||||||
server_url="https://treeherder.mozilla.org", client_id=cred["client_id"], secret=cred["secret"]
|
|
||||||
)
|
|
||||||
|
|
||||||
# data structure validation is automatically performed here, if validation
|
|
||||||
# fails a TreeherderClientError is raised
|
|
||||||
client.post_collection("servo", trsc)
|
|
||||||
client.post_collection("servo", tjc)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description=(
|
|
||||||
"Submit Servo performance data to Perfherder. "
|
|
||||||
"Remember to set your Treeherder credential as environment"
|
|
||||||
" variable 'TREEHERDER_CLIENT_ID' and "
|
|
||||||
"'TREEHERDER_CLIENT_SECRET'"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
parser.add_argument("perf_json", help="the output json from runner")
|
|
||||||
parser.add_argument("revision_json", help="the json containing the servo revision data")
|
|
||||||
parser.add_argument(
|
|
||||||
"--engine",
|
|
||||||
type=str,
|
|
||||||
default="servo",
|
|
||||||
help=("The engine to run the tests on. Currently only servo and gecko are supported."),
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
with open(args.perf_json, "r") as f:
|
|
||||||
result_json = json.load(f)
|
|
||||||
|
|
||||||
with open(args.revision_json, "r") as f:
|
|
||||||
revision = json.load(f)
|
|
||||||
|
|
||||||
perf_data = format_perf_data(result_json, args.engine)
|
|
||||||
failures = list(filter(lambda x: x["domComplete"] == -1, result_json))
|
|
||||||
summary = format_result_summary(result_json).replace("\n", "<br/>")
|
|
||||||
|
|
||||||
submit(perf_data, failures, revision, summary, args.engine)
|
|
||||||
print("Done!")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
|
@ -1,29 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import boto3
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description=(
|
|
||||||
"Submit Servo performance data to S3. Remember to set your S3 credentials https://github.com/boto/boto3"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
parser.add_argument("perf_file", help="the output CSV file from runner")
|
|
||||||
parser.add_argument("perf_key", help="the S3 key to upload to")
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
s3 = boto3.client("s3")
|
|
||||||
BUCKET = "servo-perf"
|
|
||||||
s3.upload_file(args.perf_file, BUCKET, args.perf_key)
|
|
||||||
|
|
||||||
print("Done!")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
|
@ -1,126 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
import submit_to_perfherder
|
|
||||||
|
|
||||||
|
|
||||||
def test_format_testcase_name():
|
|
||||||
assert "about:blank" == submit_to_perfherder.format_testcase_name("about:blank")
|
|
||||||
assert "163.com" == submit_to_perfherder.format_testcase_name(
|
|
||||||
("http://localhost:8000/page_load_test/163.com/p.mail.163.com/mailinfo/shownewmsg_www_1222.htm.html")
|
|
||||||
)
|
|
||||||
assert (
|
|
||||||
"12345678902234567890323456789042345678905234567890623456789072345678908234567890"
|
|
||||||
) == submit_to_perfherder.format_testcase_name(
|
|
||||||
("123456789022345678903234567890423456789052345678906234567890723456789082345678909234567890")
|
|
||||||
)
|
|
||||||
assert "news.ycombinator.com" == submit_to_perfherder.format_testcase_name(
|
|
||||||
"http://localhost:8000/tp6/news.ycombinator.com/index.html"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_format_perf_data():
|
|
||||||
mock_result = [
|
|
||||||
{
|
|
||||||
"unloadEventStart": None,
|
|
||||||
"domLoading": 1460444930000,
|
|
||||||
"fetchStart": None,
|
|
||||||
"responseStart": None,
|
|
||||||
"loadEventEnd": None,
|
|
||||||
"connectStart": None,
|
|
||||||
"domainLookupStart": None,
|
|
||||||
"redirectStart": None,
|
|
||||||
"domContentLoadedEventEnd": 1460444930000,
|
|
||||||
"requestStart": None,
|
|
||||||
"secureConnectionStart": None,
|
|
||||||
"connectEnd": None,
|
|
||||||
"navigationStart": 1460444930000,
|
|
||||||
"loadEventStart": None,
|
|
||||||
"domInteractive": 1460444930000,
|
|
||||||
"domContentLoadedEventStart": 1460444930000,
|
|
||||||
"redirectEnd": None,
|
|
||||||
"domainLookupEnd": None,
|
|
||||||
"unloadEventEnd": None,
|
|
||||||
"responseEnd": None,
|
|
||||||
"testcase": "about:blank",
|
|
||||||
"domComplete": 1460444931000,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"unloadEventStart": None,
|
|
||||||
"domLoading": 1460444934000,
|
|
||||||
"fetchStart": None,
|
|
||||||
"responseStart": None,
|
|
||||||
"loadEventEnd": None,
|
|
||||||
"connectStart": None,
|
|
||||||
"domainLookupStart": None,
|
|
||||||
"redirectStart": None,
|
|
||||||
"domContentLoadedEventEnd": 1460444946000,
|
|
||||||
"requestStart": None,
|
|
||||||
"secureConnectionStart": None,
|
|
||||||
"connectEnd": None,
|
|
||||||
"navigationStart": 1460444934000,
|
|
||||||
"loadEventStart": None,
|
|
||||||
"domInteractive": 1460444946000,
|
|
||||||
"domContentLoadedEventStart": 1460444946000,
|
|
||||||
"redirectEnd": None,
|
|
||||||
"domainLookupEnd": None,
|
|
||||||
"unloadEventEnd": None,
|
|
||||||
"responseEnd": None,
|
|
||||||
"testcase": (
|
|
||||||
"http://localhost:8000/page_load_test/163.com/p.mail.163.com/mailinfo/shownewmsg_www_1222.htm.html"
|
|
||||||
),
|
|
||||||
"domComplete": 1460444948000,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
expected = {
|
|
||||||
"performance_data": {
|
|
||||||
"framework": {"name": "servo-perf"},
|
|
||||||
"suites": [
|
|
||||||
{
|
|
||||||
"name": "domComplete",
|
|
||||||
"value": 3741.657386773941,
|
|
||||||
"subtests": [
|
|
||||||
{"name": "about:blank", "value": 1000},
|
|
||||||
{"name": "163.com", "value": 14000},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = submit_to_perfherder.format_perf_data(mock_result)
|
|
||||||
assert expected == result
|
|
||||||
|
|
||||||
|
|
||||||
def test_format_bad_perf_data():
|
|
||||||
mock_result = [
|
|
||||||
{"navigationStart": 1460444930000, "testcase": "about:blank", "domComplete": 0},
|
|
||||||
{
|
|
||||||
"navigationStart": 1460444934000,
|
|
||||||
"testcase": (
|
|
||||||
"http://localhost:8000/page_load_test/163.com/p.mail.163.com/mailinfo/shownewmsg_www_1222.htm.html"
|
|
||||||
),
|
|
||||||
"domComplete": 1460444948000,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
expected = {
|
|
||||||
"performance_data": {
|
|
||||||
"framework": {"name": "servo-perf"},
|
|
||||||
"suites": [
|
|
||||||
{
|
|
||||||
"name": "domComplete",
|
|
||||||
"value": 14000.0,
|
|
||||||
"subtests": [
|
|
||||||
{"name": "about:blank", "value": -1}, # Timeout
|
|
||||||
{"name": "163.com", "value": 14000},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = submit_to_perfherder.format_perf_data(mock_result)
|
|
||||||
assert expected == result
|
|
Loading…
Add table
Add a link
Reference in a new issue