= ({ invocations }) => {
// formatter wraps the elements below in a tag.
<>
Invocation ID: {label}
- {invocationEntry?.workflow && (
-
- Workflow: {invocationEntry?.workflow}
-
- )}
- {invocationEntry?.job && (
-
- Job: {invocationEntry?.job}
-
- )}
- {invocationEntry?.action && (
-
- Action: {invocationEntry?.action}
-
- )}
+ {invocationEntry &&
+ columns.map((column) => (
+
+ {column.title}:{" "}
+
+ {invocationEntry.tags.find(
+ (tag) => tag.key === column.valueKey,
+ )?.value || "-"}
+
+
+ ))}
{invocationEntry?.timestamps[0] && (
Duration:
@@ -198,10 +204,7 @@ const InvocationTimeline: React.FC = ({ invocations }) => {
{invocationsInfo.map((entry) => (
|
))}
diff --git a/frontend/src/components/InvocationTimeline/types.ts b/frontend/src/components/InvocationTimeline/types.ts
index 5742092d..9c84f658 100644
--- a/frontend/src/components/InvocationTimeline/types.ts
+++ b/frontend/src/components/InvocationTimeline/types.ts
@@ -1,6 +1,8 @@
import type { SVGProps } from "react";
import type { CartesianTickItem } from "recharts/types/util/types";
+import type { InvocationTag } from "@/graphql/__generated__/graphql";
import type { CommandLineData } from "../CommandLine";
+import type { InvocationResult } from "../InvocationResultTag/enum";
export interface TickProps extends SVGProps {
payload: CartesianTickItem;
@@ -9,10 +11,7 @@ export interface TickProps extends SVGProps {
export interface InvocationInfo {
invocationId: string;
timestamps: number[];
- exitCodeName: string | undefined;
- timeSinceLastConnectionMillis: number | undefined;
+ invocationStatus: InvocationResult;
command?: CommandLineData;
- workflow?: string | null;
- job?: string | null;
- action?: string | null;
+ tags: Omit[];
}
diff --git a/frontend/src/components/InvocationTimeline/utils.tsx b/frontend/src/components/InvocationTimeline/utils.tsx
deleted file mode 100644
index 1ff7d40d..00000000
--- a/frontend/src/components/InvocationTimeline/utils.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { INVOCATION_RESULT_TAGS } from "../InvocationResultTag";
-import { getInvocationResultTagEnum } from "../InvocationResultTag/enum";
-
-export const getInvocationResultTagColor = (
- exitCodeName: string | undefined,
- timeSinceLastConnectionMillis: number | undefined,
-): string => {
- return INVOCATION_RESULT_TAGS[
- getInvocationResultTagEnum(exitCodeName, timeSinceLastConnectionMillis)
- ].color;
-};
diff --git a/frontend/src/components/OptionalLinkWrapper/index.tsx b/frontend/src/components/OptionalLinkWrapper/index.tsx
new file mode 100644
index 00000000..6626aed4
--- /dev/null
+++ b/frontend/src/components/OptionalLinkWrapper/index.tsx
@@ -0,0 +1,11 @@
+type Props = {
+ url?: string;
+ children: React.ReactNode;
+};
+
+export const OptionalLinkWrapper: React.FC = ({ url, children }) => {
+ if (url) {
+ return {children};
+ }
+ return children;
+};
diff --git a/frontend/src/components/SourceControlDisplay/index.tsx b/frontend/src/components/SourceControlDisplay/index.tsx
index c25d438d..7cc0a042 100644
--- a/frontend/src/components/SourceControlDisplay/index.tsx
+++ b/frontend/src/components/SourceControlDisplay/index.tsx
@@ -1,215 +1,47 @@
import { BranchesOutlined } from "@ant-design/icons";
-import { Descriptions, Row, Space } from "antd";
+import { Descriptions, Space } from "antd";
import type React from "react";
-import {
- type SourceControl,
- SourceControlProvider,
-} from "@/graphql/__generated__/graphql";
+import type { SourceControl } from "@/graphql/__generated__/graphql";
+import { OptionalLinkWrapper } from "../OptionalLinkWrapper";
import PortalCard from "../PortalCard";
-const getRepoUrl = (
- sc: SourceControl | undefined | null,
-): string | undefined => {
- if (
- sc?.instanceURL === null ||
- sc?.instanceURL === undefined ||
- sc?.instanceURL === "" ||
- sc?.repo === null ||
- sc?.repo === undefined ||
- sc?.repo === ""
- ) {
- return undefined;
- }
- return `${sc.instanceURL}/${sc.repo}`;
-};
-
-const getRefLabelAndUrl = (
- sc: SourceControl | undefined | null,
- repoUrl: string | undefined,
-): [string | undefined, string | undefined] => {
- if (
- sc?.refs === null ||
- sc?.refs === undefined ||
- sc?.refs === "" ||
- repoUrl === undefined
- ) {
- return [undefined, undefined];
- }
- switch (sc?.provider) {
- case SourceControlProvider.Github:
- if (sc.refs.startsWith("refs/heads/")) {
- return [
- "Branch",
- `${repoUrl}/tree/${sc.refs.substring("refs/heads/".length)}`,
- ];
- }
- if (sc.refs.startsWith("refs/tags/")) {
- return [
- "Tag",
- `${repoUrl}/tree/${sc.refs.substring("refs/tags/".length)}`,
- ];
- }
- if (sc.refs.startsWith("refs/pull/")) {
- const prNumber = sc.refs.substring("refs/pull/".length).split("/")[0];
- return ["Pull request", `${repoUrl}/pull/${prNumber}`];
- }
- return ["Ref", `${repoUrl}/tree/${sc.refs}`];
- case SourceControlProvider.Gitlab:
- return ["Branch", `${repoUrl}/-/tree/${sc.refs}`];
- default:
- return [undefined, undefined];
- }
-};
-
-const getCommitUrl = (
- sc: SourceControl | undefined | null,
- repoUrl: string | undefined,
-): string | undefined => {
- if (
- sc?.commitSha === null ||
- sc?.commitSha === undefined ||
- sc?.commitSha === "" ||
- repoUrl === undefined
- ) {
- return undefined;
- }
- switch (sc?.provider) {
- case SourceControlProvider.Github:
- return `${repoUrl}/commit/${sc.commitSha}`;
- case SourceControlProvider.Gitlab:
- return `${repoUrl}/-/commit/${sc.commitSha}`;
- default:
- return undefined;
- }
-};
-
-const getActorUrl = (
- sc: SourceControl | undefined | null,
-): string | undefined => {
- if (
- sc?.actor === null ||
- sc?.actor === undefined ||
- sc?.actor === "" ||
- sc?.instanceURL === null ||
- sc?.instanceURL === undefined ||
- sc?.instanceURL === ""
- ) {
- return undefined;
- }
- return `${sc.instanceURL}/${sc.actor}`;
-};
-
-const getRunUrl = (
- sc: SourceControl | undefined | null,
- repoUrl: string | undefined,
-): string | undefined => {
- if (
- sc?.runID === null ||
- sc?.runID === undefined ||
- sc?.runID === "" ||
- repoUrl === undefined
- ) {
- return undefined;
- }
- switch (sc?.provider) {
- case SourceControlProvider.Github:
- return `${repoUrl}/actions/runs/${sc.runID}`;
- case SourceControlProvider.Gitlab:
- return `${repoUrl}/-/jobs/${sc.runID}`;
- default:
- return undefined;
- }
-};
-
-type RepoLinkProps = {
- text: string;
- url?: string;
-};
-
-const RepoLink: React.FC = ({ text, url }) => {
- if (url) {
- return (
-
- {text}
-
- );
- }
- return <>{text}>;
-};
-
const SourceControlDisplay: React.FC<{
- stepLabel: string | undefined | null;
- sourceControlData: SourceControl | undefined | null;
+ sourceControlData: SourceControl[] | undefined | null;
}> = ({ sourceControlData }) => {
- const repoUrl = getRepoUrl(sourceControlData);
- const [refLabel, refUrl] = getRefLabelAndUrl(sourceControlData, repoUrl);
- const commitUrl = getCommitUrl(sourceControlData, repoUrl);
- const actorUrl = getActorUrl(sourceControlData);
- const runUrl = getRunUrl(sourceControlData, repoUrl);
-
- let workflowLabel = sourceControlData?.workflow || "";
- const runNumber = sourceControlData?.runNumber || "";
- if (workflowLabel !== "" && runNumber !== "") {
- workflowLabel = `${workflowLabel} #${runNumber}`;
- }
-
return (
}
- titleBits={["Source Control Information"]}
+ titleBits={[Source Control Information]}
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {sourceControlData?.eventName}
-
-
-
-
-
-
-
-
-
-
- {sourceControlData?.job}
-
-
- {sourceControlData?.action}
-
-
- {sourceControlData?.runnerName}
-
-
- {sourceControlData?.runnerArch}
-
-
- {sourceControlData?.runnerOs}
-
+
+ {sourceControlData?.map((sc) => (
+
+ {sc.repo ? (
+
+
+ {sc.repo || ""}
+
+
+ ) : undefined}
+ {sc.ref ? (
+
+
+ {sc.ref || ""}
+
+
+ ) : undefined}
+ {sc.commit ? (
+
+
+ {sc.commit || ""}
+
+
+ ) : undefined}
-
-
+ ))}
+
);
diff --git a/frontend/src/components/Uploader/index.tsx b/frontend/src/components/Uploader/index.tsx
index 1f673c71..c6b91a89 100644
--- a/frontend/src/components/Uploader/index.tsx
+++ b/frontend/src/components/Uploader/index.tsx
@@ -1,6 +1,5 @@
import { FileAddTwoTone } from "@ant-design/icons";
-import type { UploadProps } from "antd";
-import { Space, Typography, Upload } from "antd";
+import { Space, Typography, Upload, type UploadProps } from "antd";
import type React from "react";
const { Dragger } = Upload;
diff --git a/frontend/src/components/UserStatusIndicator/index.tsx b/frontend/src/components/UserStatusIndicator/index.tsx
index 95883c6c..4e36b58c 100644
--- a/frontend/src/components/UserStatusIndicator/index.tsx
+++ b/frontend/src/components/UserStatusIndicator/index.tsx
@@ -5,11 +5,14 @@ import type { BazelInvocationNodeFragment } from "@/graphql/__generated__/graphq
const { useToken } = theme;
interface Props {
- authenticatedUser: BazelInvocationNodeFragment["authenticatedUser"];
- user: BazelInvocationNodeFragment["user"];
+ authenticatedUser?: BazelInvocationNodeFragment["authenticatedUser"];
+ username?: string;
}
-const UserStatusIndicator: React.FC = ({ authenticatedUser, user }) => {
+const UserStatusIndicator: React.FC = ({
+ authenticatedUser,
+ username,
+}) => {
const { token } = useToken();
if (authenticatedUser) {
return (
@@ -38,7 +41,7 @@ const UserStatusIndicator: React.FC = ({ authenticatedUser, user }) => {
{" "}
- {user?.LDAP}
+ {username || No display name}
>
);
};
diff --git a/frontend/src/components/pages/BazelInvocationDetails/index.graphql.ts b/frontend/src/components/pages/BazelInvocationDetails/index.graphql.ts
index e8a38040..8fe28ce3 100644
--- a/frontend/src/components/pages/BazelInvocationDetails/index.graphql.ts
+++ b/frontend/src/components/pages/BazelInvocationDetails/index.graphql.ts
@@ -149,10 +149,7 @@ fragment BazelInvocationInfo on BazelInvocation {
sizeInBytes
digestFunction
}
- user {
- Email
- LDAP
- }
+ username
startedAt
endedAt
exitCodeName
@@ -166,26 +163,24 @@ fragment BazelInvocationInfo on BazelInvocation {
mnemonic
}
numFetches
- stepLabel
hostname
- isCiWorker
sourceControl {
id
- provider
- instanceURL
repo
- refs
- commitSha
- actor
- eventName
- workflow
- runID
- runNumber
- job
- action
- runnerName
- runnerArch
- runnerOs
+ repoURL
+ ref
+ refURL
+ commit
+ commitURL
+ }
+ tags(orderBy: { field: KEY, direction: ASC }) {
+ edges {
+ node {
+ id
+ key
+ value
+ }
+ }
}
}
`);
diff --git a/frontend/src/components/pages/BuildDetails/Columns.tsx b/frontend/src/components/pages/BuildDetails/Columns.tsx
index 57b76d56..3957a7aa 100644
--- a/frontend/src/components/pages/BuildDetails/Columns.tsx
+++ b/frontend/src/components/pages/BuildDetails/Columns.tsx
@@ -1,135 +1,168 @@
import { FilterOutlined, SearchOutlined } from "@ant-design/icons";
-import { Space, type TableColumnsType, Typography } from "antd";
+import { Space, Typography } from "antd";
+import type { FilterValue } from "antd/es/table/interface";
import { validate as uuidValidate } from "uuid";
import appbarStyles from "@/components/AppBar/index.module.css";
import { CodeLink } from "@/components/CodeLink";
import type { CommandLineData } from "@/components/CommandLine";
import CommandLinePreview from "@/components/CommandLinePreview";
import { InvocationResultTag } from "@/components/InvocationResultTag";
-import { invocationResultTagFilters } from "@/components/InvocationResultTag/filters";
+import {
+ applyInvocationResultTagFilter,
+ invocationResultTagFilters,
+} from "@/components/InvocationResultTag/filters";
+import { OptionalLinkWrapper } from "@/components/OptionalLinkWrapper";
import PortalDuration from "@/components/PortalDuration";
import SearchWidget, { SearchFilterIcon } from "@/components/SearchWidgets";
-import type { GetBuildInvocationFragment } from "@/graphql/__generated__/graphql";
+import type {
+ BazelInvocationWhereInput,
+ GetBuildInvocationFragment,
+} from "@/graphql/__generated__/graphql";
+import type { TableColumnTypeWithFilter } from "@/types/TableColumnTypeWithFilter";
+import { env } from "@/utils/env";
+import { parseGraphqlEdgeList } from "@/utils/parseGraphqlEdgeList";
import buildDetailsStyles from "./index.module.css";
-export const columns: TableColumnsType = [
- {
- key: "workflow",
- title: "Workflow",
- dataIndex: ["sourceControl", "workflow"],
- filterSearch: true,
- filterDropdown: (filterProps) => (
-
- ),
- filterIcon: (filtered) => (
- } filtered={filtered} />
- ),
- },
- {
- key: "job",
- title: "Job",
- dataIndex: ["sourceControl", "job"],
- filterSearch: true,
- filterDropdown: (filterProps) => (
-
- ),
- filterIcon: (filtered) => (
- } filtered={filtered} />
- ),
- },
- {
- key: "action",
- title: "Action",
- dataIndex: ["sourceControl", "action"],
- filterSearch: true,
- filterDropdown: (filterProps) => (
-
- ),
- filterIcon: (filtered) => (
- } filtered={filtered} />
- ),
- },
- {
- key: "command",
- title: "Command",
- filterSearch: false,
- className: buildDetailsStyles.commandColumnCell,
- render: (_, record) => (
-
-
-
- ),
- },
- {
- key: "invocationID",
- title: "Invocation ID",
- dataIndex: "invocationID",
- filterSearch: true,
- filterDropdown: (filterProps) => (
-
- ),
- filterIcon: (filtered) => (
- } filtered={filtered} />
- ),
- render: (_, record) => (
-
-
-
-
-
-
- ),
- },
- {
- key: "duration",
- title: "Duration",
- dataIndex: "startedAt",
- render: (_, record) => (
- [] => {
+ const columns: TableColumnTypeWithFilter<
+ GetBuildInvocationFragment,
+ BazelInvocationWhereInput
+ >[] = [];
+
+ const additionalColumns = env.additionalBuildInvocationColumns;
+ for (const column of additionalColumns) {
+ columns.push({
+ key: column.valueKey,
+ title: column.title,
+ filterSearch: true,
+ render: (_, record) => {
+ const tags = parseGraphqlEdgeList(record.tags);
+ const valueTag = tags.find((tag) => tag.key === column.valueKey);
+ const urlTag = tags.find((tag) => tag.key === column.urlKey);
+ return (
+
+ {valueTag?.value || ""}
+
+ );
+ },
+ filterDropdown: (filterProps) => (
+
+ ),
+ filterIcon: (filtered) => (
+ } filtered={filtered} />
+ ),
+ applyFilter: (value: FilterValue) => {
+ if (value.length === 0) {
+ return undefined;
}
- includeIcon
- includePopover
- formatConfig={{ smallestUnit: "s" }}
- />
- ),
- },
- {
- key: "status",
- title: "Status",
- dataIndex: "status",
- filterSearch: true,
- render: (_, record) => (
- (
+
+
+
+ ),
+ },
+ {
+ key: "invocationID",
+ title: "Invocation",
+ filterSearch: true,
+ filterDropdown: (filterProps) => (
+
+ ),
+ filterIcon: (filtered) => (
+ } filtered={filtered} />
+ ),
+ render: (_, record) => (
+
+
+
+
+
+
+ ),
+ applyFilter: (value: FilterValue) => {
+ if (value.length === 0) {
+ return undefined;
}
- />
- ),
- filters: invocationResultTagFilters,
- filterIcon: (filtered) => (
- } filtered={filtered} />
- ),
- },
-];
+ return [{ invocationID: value[0] as string }];
+ },
+ },
+ {
+ key: "duration",
+ title: "Duration",
+ dataIndex: "startedAt",
+ render: (_, record) => (
+
+ ),
+ },
+ {
+ key: "status",
+ title: "Status",
+ dataIndex: "status",
+ filterSearch: true,
+ render: (_, record) => (
+
+ ),
+ filters: invocationResultTagFilters,
+ applyFilter: applyInvocationResultTagFilter,
+ filterIcon: (filtered) => (
+ } filtered={filtered} />
+ ),
+ },
+ );
+
+ return columns;
+};
diff --git a/frontend/src/components/pages/BuildDetails/graphql.ts b/frontend/src/components/pages/BuildDetails/graphql.ts
index 8697096e..23c4cd4a 100644
--- a/frontend/src/components/pages/BuildDetails/graphql.ts
+++ b/frontend/src/components/pages/BuildDetails/graphql.ts
@@ -12,9 +12,17 @@ export const GET_BUILD_BY_UUID_QUERY = gql(/* GraphQL */ `
) {
getBuild(buildUUID: $buildUUID) {
id
- buildURL
buildUUID
timestamp
+ tags(orderBy: { field: KEY, direction: ASC }) {
+ edges {
+ node {
+ id
+ key
+ value
+ }
+ }
+ }
invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {
pageInfo {
startCursor
@@ -36,15 +44,18 @@ export const GET_BUILD_INVOCATION_FRAGMENT = gql(/* GraphQL */ `
fragment GetBuildInvocation on BazelInvocation {
id
invocationID
- userLdap
+ username
endedAt
startedAt
exitCodeName
- sourceControl{
- job
- action
- workflow
- runnerName
+ tags {
+ edges {
+ node {
+ id
+ key
+ value
+ }
+ }
}
connectionMetadata {
connectionLastOpenAt
diff --git a/frontend/src/components/pages/BuildDetails/index.tsx b/frontend/src/components/pages/BuildDetails/index.tsx
index 8e58f883..2f38b023 100644
--- a/frontend/src/components/pages/BuildDetails/index.tsx
+++ b/frontend/src/components/pages/BuildDetails/index.tsx
@@ -1,14 +1,13 @@
-import { DeploymentUnitOutlined } from "@ant-design/icons";
+import { DeploymentUnitOutlined, InfoCircleOutlined } from "@ant-design/icons";
import { useQuery } from "@apollo/client/react";
-import { Space, Typography } from "antd";
-import type { FilterValue } from "antd/es/table/interface";
+import { Flex, Popover, Space, Tag, Typography } from "antd";
import dayjs from "dayjs";
import type React from "react";
-import { useState } from "react";
-import { validate as uuidValidate } from "uuid";
+import { useMemo, useState } from "react";
import styles from "@/components/AppBar/index.module.css";
import CollapsableInvocationTimeline from "@/components/CollapsableInvocationTimeline";
import Content from "@/components/Content";
+import { OptionalLinkWrapper } from "@/components/OptionalLinkWrapper";
import PortalCard from "@/components/PortalCard";
import {
BazelInvocationOrderField,
@@ -16,15 +15,18 @@ import {
type FindBuildByUuidQuery,
type GetBuildInvocationFragment,
OrderDirection,
- type SourceControlWhereInput,
} from "@/graphql/__generated__/graphql";
-import { parseGraphqlEdgeListWithFragment } from "@/utils/parseGraphqlEdgeList";
+import { applyTableFilters } from "@/utils/applyColumnFilters";
+import { env } from "@/utils/env";
+import {
+ parseGraphqlEdgeList,
+ parseGraphqlEdgeListWithFragment,
+} from "@/utils/parseGraphqlEdgeList";
import { shouldPollInvocation } from "@/utils/shouldPollInvocation";
import { CursorTable, getNewPaginationVariables } from "../../CursorTable";
import type { PaginationVariables } from "../../CursorTable/types";
-import { applyInvocationResultTagFilter } from "../../InvocationResultTag/filters";
import PortalAlert from "../../PortalAlert";
-import { columns } from "./Columns";
+import { getColumns } from "./Columns";
import {
GET_BUILD_BY_UUID_QUERY,
GET_BUILD_INVOCATION_FRAGMENT,
@@ -36,28 +38,54 @@ const getTitleBits = (build: BuildType | undefined): React.ReactNode[] => {
if (!build) {
return [];
}
- return [
-
- Build ID:{" "}
-
- {build.buildUUID}
-
- ,
-
-
- ,
-
- Build URL:{" "}
-
+ {`Build ID:`}
+
- {build.buildURL}
-
- ,
- ];
+ {build.buildUUID}
+
+ ,
+ );
+
+ const tags = parseGraphqlEdgeList(build.tags);
+ const additionalColumns = env.additionalBuildColumns;
+ for (const column of additionalColumns) {
+ const valueTags = tags.filter((tag) => tag.key === column.valueKey);
+ const urlTags = tags.filter((tag) => tag.key === column.urlKey);
+ const urlTag = urlTags.length === 1 ? urlTags[0] : undefined;
+
+ titleBits.push(
+
+ {`${column.title}:`}
+
+
+
+ {valueTags.map((tag) => tag.value).join(", ")}
+
+
+ {urlTags.length > 1 && (
+ (
+
+ {tag.value}
+
+ ))}
+ >
+
+
+ )}
+
+ ,
+ );
+ }
+
+ return titleBits;
};
const getExtraBits = (build: BuildType | undefined): React.ReactNode[] => {
@@ -83,13 +111,14 @@ const BuildDetails: React.FC = ({ buildUUID }) => {
const [paginationVariables, setPaginationVariables] =
useState(getNewPaginationVariables());
- const [filterVariables, setFilterVariables] =
- useState({});
+ const [filterVariables, setFilterVariables] = useState<
+ BazelInvocationWhereInput[]
+ >([]);
const { data, loading, error } = useQuery(GET_BUILD_BY_UUID_QUERY, {
variables: {
...paginationVariables,
- where: filterVariables,
+ where: { and: filterVariables },
orderBy: {
direction: OrderDirection.Desc,
field: BazelInvocationOrderField.StartedAt,
@@ -98,7 +127,10 @@ const BuildDetails: React.FC = ({ buildUUID }) => {
},
});
+ const tableColumns = useMemo(getColumns, []);
+
const build = data?.getBuild ?? undefined;
+ const tags = parseGraphqlEdgeList(build?.tags);
const invocations = parseGraphqlEdgeListWithFragment(
GET_BUILD_INVOCATION_FRAGMENT,
data?.getBuild?.invocations,
@@ -121,52 +153,6 @@ const BuildDetails: React.FC = ({ buildUUID }) => {
pollInterval: 5000,
});
- const onFilterChange = (filters: Record) => {
- let newFilters: BazelInvocationWhereInput[] = [];
- const sourceControllFilters: SourceControlWhereInput[] = [];
- Object.entries(filters).forEach(([key, value]) => {
- if (value && value.length > 0) {
- switch (key) {
- case "workflow": {
- sourceControllFilters.push({
- workflowContainsFold: value[0] as string,
- });
- break;
- }
- case "job": {
- sourceControllFilters.push({ jobContainsFold: value[0] as string });
- break;
- }
- case "action": {
- sourceControllFilters.push({
- actionContainsFold: value[0] as string,
- });
- break;
- }
- case "invocationID": {
- const invocationID = value[0] as string;
- if (uuidValidate(invocationID)) {
- newFilters.push({ invocationID: invocationID });
- }
- break;
- }
- case "status": {
- newFilters = newFilters.concat(
- applyInvocationResultTagFilter(value),
- );
- break;
- }
- }
- }
- });
- if (sourceControllFilters.length > 0) {
- newFilters.push({
- hasSourceControlWith: sourceControllFilters,
- });
- }
- setFilterVariables({ and: newFilters });
- };
-
if (error) {
return (
} titleBits={["Build"]}>
@@ -202,18 +188,31 @@ const BuildDetails: React.FC = ({ buildUUID }) => {
extraBits={getExtraBits(build)}
>
+ {tags && tags.length > 0 && (
+
+ {tags?.map((tag) => (
+
+ {tag.key}: {tag.value}
+
+ ))}
+
+ )}
{invocations.length > 1 && (
)}
- columns={columns}
+ columns={tableColumns}
loading={loading}
size="small"
rowKey="id"
onChange={(_pagination, filters, _sorter, _extra) =>
- onFilterChange(filters)
+ applyTableFilters(tableColumns, filters, setFilterVariables)
}
dataSource={invocations}
pagination={{
diff --git a/frontend/src/graphql/__generated__/gql.ts b/frontend/src/graphql/__generated__/gql.ts
index 6f3176f3..c61efe39 100644
--- a/frontend/src/graphql/__generated__/gql.ts
+++ b/frontend/src/graphql/__generated__/gql.ts
@@ -15,9 +15,9 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
*/
type Documents = {
"\n query FindBazelInvocations(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n findBazelInvocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...BazelInvocationNode\n }\n }\n }\n }\n": typeof types.FindBazelInvocationsDocument,
- "\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n user {\n Email\n LDAP\n }\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n": typeof types.BazelInvocationNodeFragmentDoc,
+ "\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n username\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n": typeof types.BazelInvocationNodeFragmentDoc,
"\n query FindBuilds(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BuildOrder\n $where: BuildWhereInput\n ) {\n findBuilds(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...BuildNode\n }\n }\n }\n }\n": typeof types.FindBuildsDocument,
- "\n fragment BuildNode on Build {\n id\n buildUUID\n buildURL\n timestamp\n }\n": typeof types.BuildNodeFragmentDoc,
+ "\n fragment BuildNode on Build {\n id\n buildUUID\n timestamp\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n }\n": typeof types.BuildNodeFragmentDoc,
"\n query CheckIfInvocationExists(\n $invocationID: UUID!\n ){\n getBazelInvocation(invocationID: $invocationID){\n id\n }\n }\n": typeof types.CheckIfInvocationExistsDocument,
"\n query GetInvocationTargetsForInvocation(\n $invocationID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: InvocationTargetOrder\n $where: InvocationTargetWhereInput\n ){\n getBazelInvocation(invocationID: $invocationID) {\n id\n invocationTargets(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where){\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n success\n abortReason\n durationInMs\n failureMessage\n tags\n target {\n id\n label\n aspect\n targetKind\n instanceName {\n name\n }\n }\n }\n }\n }\n numTotal: invocationTargets {\n totalCount\n }\n numSuccessful: invocationTargets(where: { success: true }) {\n totalCount\n }\n numSkipped: invocationTargets(where: {abortReason: SKIPPED}) {\n totalCount\n }\n }\n }\n": typeof types.GetInvocationTargetsForInvocationDocument,
"\n query GetTargetsList(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $where: TargetWhereInput\n ){\n findTargets (after: $after, first: $first, before: $before, last: $last, where: $where){\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n label\n aspect\n targetKind\n instanceName {\n name\n }\n }\n }\n }\n }\n": typeof types.GetTargetsListDocument,
@@ -26,9 +26,9 @@ type Documents = {
"\n query GetTestsForTarget(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: TestSummaryOrder\n $where: TestSummaryWhereInput\n ){\n findTestSummaries(\n after: $after\n first: $first\n before: $before\n last: $last\n orderBy: $orderBy\n where: $where\n ) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n overallStatus\n invocationTarget {\n bazelInvocation {\n invocationID\n }\n }\n }\n }\n }\n}\n": typeof types.GetTestsForTargetDocument,
"\n query GetTestsForInvocation(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: TestSummaryOrder\n $where: TestSummaryWhereInput\n ) {\n findTestSummaries(\n after: $after\n first: $first\n before: $before\n last: $last\n orderBy: $orderBy\n where: $where\n ) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n overallStatus\n totalRunDurationInMs\n testResults {\n cachedLocally\n cachedRemotely\n }\n invocationTarget {\n target {\n id\n instanceName {\n name\n }\n label\n aspect\n targetKind\n }\n }\n }\n }\n }\n }\n": typeof types.GetTestsForInvocationDocument,
"\n query LoadFullBazelInvocationDetails($invocationID: UUID!) {\n getBazelInvocation(invocationID: $invocationID) {\n ...BazelInvocationInfo\n }\n }\n": typeof types.LoadFullBazelInvocationDetailsDocument,
- "\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n user {\n Email\n LDAP\n }\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n stepLabel\n hostname\n isCiWorker\n sourceControl {\n id\n provider\n instanceURL\n repo\n refs\n commitSha\n actor\n eventName\n workflow\n runID\n runNumber\n job\n action\n runnerName\n runnerArch\n runnerOs\n }\n}\n": typeof types.BazelInvocationInfoFragmentDoc,
- "\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildURL\n buildUUID\n timestamp\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n": typeof types.FindBuildByUuidDocument,
- "\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n userLdap\n endedAt\n startedAt\n exitCodeName\n sourceControl{\n job\n action\n workflow\n runnerName\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n": typeof types.GetBuildInvocationFragmentDoc,
+ "\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n username\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n hostname\n sourceControl {\n id\n repo\n repoURL\n ref\n refURL\n commit\n commitURL\n }\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n}\n": typeof types.BazelInvocationInfoFragmentDoc,
+ "\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildUUID\n timestamp\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n": typeof types.FindBuildByUuidDocument,
+ "\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n username\n endedAt\n startedAt\n exitCodeName\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n": typeof types.GetBuildInvocationFragmentDoc,
"\n query GetTargetDetails(\n $instanceName: String!\n $label: String!\n $aspect: String!\n $targetKind: String!\n\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: InvocationTargetOrder\n $where: InvocationTargetWhereInput\n ){\n getTarget (instanceName: $instanceName, label: $label, aspect: $aspect, targetKind: $targetKind){\n invocationTargetsTotalDurationMillis\n invocationTargets(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n totalCount\n edges {\n node {\n id\n success\n durationInMs\n abortReason\n failureMessage\n tags\n bazelInvocation {\n invocationID\n }\n }\n }\n }\n }\n }\n": typeof types.GetTargetDetailsDocument,
"\n query GetTestDetails(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: TestSummaryOrder\n $where: TestSummaryWhereInput\n ){\n findTestSummaries(\n after: $after\n first: $first\n before: $before\n last: $last\n orderBy: $orderBy\n where: $where\n ) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n overallStatus\n runCount\n attemptCount\n shardCount\n firstStartTime\n totalRunDurationInMs\n testResults {\n cachedLocally\n cachedRemotely\n }\n invocationTarget {\n bazelInvocation {\n invocationID\n }\n }\n }\n }\n }\n }\n": typeof types.GetTestDetailsDocument,
"\n query FindBuildTimes(\n $first: Int!\n \t$where: BazelInvocationWhereInput\n ) {\n findBazelInvocations(first: $first, where: $where ) {\n pageInfo{\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n\n }\n totalCount\n edges {\n node {\n invocationID\n startedAt\n endedAt\n }\n }\n }\n }\n": typeof types.FindBuildTimesDocument,
@@ -38,9 +38,9 @@ type Documents = {
};
const documents: Documents = {
"\n query FindBazelInvocations(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n findBazelInvocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...BazelInvocationNode\n }\n }\n }\n }\n": types.FindBazelInvocationsDocument,
- "\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n user {\n Email\n LDAP\n }\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n": types.BazelInvocationNodeFragmentDoc,
+ "\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n username\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n": types.BazelInvocationNodeFragmentDoc,
"\n query FindBuilds(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BuildOrder\n $where: BuildWhereInput\n ) {\n findBuilds(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...BuildNode\n }\n }\n }\n }\n": types.FindBuildsDocument,
- "\n fragment BuildNode on Build {\n id\n buildUUID\n buildURL\n timestamp\n }\n": types.BuildNodeFragmentDoc,
+ "\n fragment BuildNode on Build {\n id\n buildUUID\n timestamp\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n }\n": types.BuildNodeFragmentDoc,
"\n query CheckIfInvocationExists(\n $invocationID: UUID!\n ){\n getBazelInvocation(invocationID: $invocationID){\n id\n }\n }\n": types.CheckIfInvocationExistsDocument,
"\n query GetInvocationTargetsForInvocation(\n $invocationID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: InvocationTargetOrder\n $where: InvocationTargetWhereInput\n ){\n getBazelInvocation(invocationID: $invocationID) {\n id\n invocationTargets(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where){\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n success\n abortReason\n durationInMs\n failureMessage\n tags\n target {\n id\n label\n aspect\n targetKind\n instanceName {\n name\n }\n }\n }\n }\n }\n numTotal: invocationTargets {\n totalCount\n }\n numSuccessful: invocationTargets(where: { success: true }) {\n totalCount\n }\n numSkipped: invocationTargets(where: {abortReason: SKIPPED}) {\n totalCount\n }\n }\n }\n": types.GetInvocationTargetsForInvocationDocument,
"\n query GetTargetsList(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $where: TargetWhereInput\n ){\n findTargets (after: $after, first: $first, before: $before, last: $last, where: $where){\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n label\n aspect\n targetKind\n instanceName {\n name\n }\n }\n }\n }\n }\n": types.GetTargetsListDocument,
@@ -49,9 +49,9 @@ const documents: Documents = {
"\n query GetTestsForTarget(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: TestSummaryOrder\n $where: TestSummaryWhereInput\n ){\n findTestSummaries(\n after: $after\n first: $first\n before: $before\n last: $last\n orderBy: $orderBy\n where: $where\n ) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n overallStatus\n invocationTarget {\n bazelInvocation {\n invocationID\n }\n }\n }\n }\n }\n}\n": types.GetTestsForTargetDocument,
"\n query GetTestsForInvocation(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: TestSummaryOrder\n $where: TestSummaryWhereInput\n ) {\n findTestSummaries(\n after: $after\n first: $first\n before: $before\n last: $last\n orderBy: $orderBy\n where: $where\n ) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n overallStatus\n totalRunDurationInMs\n testResults {\n cachedLocally\n cachedRemotely\n }\n invocationTarget {\n target {\n id\n instanceName {\n name\n }\n label\n aspect\n targetKind\n }\n }\n }\n }\n }\n }\n": types.GetTestsForInvocationDocument,
"\n query LoadFullBazelInvocationDetails($invocationID: UUID!) {\n getBazelInvocation(invocationID: $invocationID) {\n ...BazelInvocationInfo\n }\n }\n": types.LoadFullBazelInvocationDetailsDocument,
- "\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n user {\n Email\n LDAP\n }\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n stepLabel\n hostname\n isCiWorker\n sourceControl {\n id\n provider\n instanceURL\n repo\n refs\n commitSha\n actor\n eventName\n workflow\n runID\n runNumber\n job\n action\n runnerName\n runnerArch\n runnerOs\n }\n}\n": types.BazelInvocationInfoFragmentDoc,
- "\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildURL\n buildUUID\n timestamp\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n": types.FindBuildByUuidDocument,
- "\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n userLdap\n endedAt\n startedAt\n exitCodeName\n sourceControl{\n job\n action\n workflow\n runnerName\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n": types.GetBuildInvocationFragmentDoc,
+ "\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n username\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n hostname\n sourceControl {\n id\n repo\n repoURL\n ref\n refURL\n commit\n commitURL\n }\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n}\n": types.BazelInvocationInfoFragmentDoc,
+ "\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildUUID\n timestamp\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n": types.FindBuildByUuidDocument,
+ "\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n username\n endedAt\n startedAt\n exitCodeName\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n": types.GetBuildInvocationFragmentDoc,
"\n query GetTargetDetails(\n $instanceName: String!\n $label: String!\n $aspect: String!\n $targetKind: String!\n\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: InvocationTargetOrder\n $where: InvocationTargetWhereInput\n ){\n getTarget (instanceName: $instanceName, label: $label, aspect: $aspect, targetKind: $targetKind){\n invocationTargetsTotalDurationMillis\n invocationTargets(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n totalCount\n edges {\n node {\n id\n success\n durationInMs\n abortReason\n failureMessage\n tags\n bazelInvocation {\n invocationID\n }\n }\n }\n }\n }\n }\n": types.GetTargetDetailsDocument,
"\n query GetTestDetails(\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: TestSummaryOrder\n $where: TestSummaryWhereInput\n ){\n findTestSummaries(\n after: $after\n first: $first\n before: $before\n last: $last\n orderBy: $orderBy\n where: $where\n ) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n id\n overallStatus\n runCount\n attemptCount\n shardCount\n firstStartTime\n totalRunDurationInMs\n testResults {\n cachedLocally\n cachedRemotely\n }\n invocationTarget {\n bazelInvocation {\n invocationID\n }\n }\n }\n }\n }\n }\n": types.GetTestDetailsDocument,
"\n query FindBuildTimes(\n $first: Int!\n \t$where: BazelInvocationWhereInput\n ) {\n findBazelInvocations(first: $first, where: $where ) {\n pageInfo{\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n\n }\n totalCount\n edges {\n node {\n invocationID\n startedAt\n endedAt\n }\n }\n }\n }\n": types.FindBuildTimesDocument,
@@ -81,7 +81,7 @@ export function gql(source: "\n query FindBazelInvocations(\n $after: Cursor
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
-export function gql(source: "\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n user {\n Email\n LDAP\n }\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n"): (typeof documents)["\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n user {\n Email\n LDAP\n }\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n"];
+export function gql(source: "\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n username\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n"): (typeof documents)["\n fragment BazelInvocationNode on BazelInvocation {\n id\n invocationID\n startedAt\n username\n authenticatedUser {\n userUUID\n displayName\n }\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n build {\n buildUUID\n }\n }\n"];
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -89,7 +89,7 @@ export function gql(source: "\n query FindBuilds(\n $after: Cursor\n $fir
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
-export function gql(source: "\n fragment BuildNode on Build {\n id\n buildUUID\n buildURL\n timestamp\n }\n"): (typeof documents)["\n fragment BuildNode on Build {\n id\n buildUUID\n buildURL\n timestamp\n }\n"];
+export function gql(source: "\n fragment BuildNode on Build {\n id\n buildUUID\n timestamp\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n }\n"): (typeof documents)["\n fragment BuildNode on Build {\n id\n buildUUID\n timestamp\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n }\n"];
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -125,15 +125,15 @@ export function gql(source: "\n query LoadFullBazelInvocationDetails($invocatio
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
-export function gql(source: "\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n user {\n Email\n LDAP\n }\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n stepLabel\n hostname\n isCiWorker\n sourceControl {\n id\n provider\n instanceURL\n repo\n refs\n commitSha\n actor\n eventName\n workflow\n runID\n runNumber\n job\n action\n runnerName\n runnerArch\n runnerOs\n }\n}\n"): (typeof documents)["\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n user {\n Email\n LDAP\n }\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n stepLabel\n hostname\n isCiWorker\n sourceControl {\n id\n provider\n instanceURL\n repo\n refs\n commitSha\n actor\n eventName\n workflow\n runID\n runNumber\n job\n action\n runnerName\n runnerArch\n runnerOs\n }\n}\n"];
+export function gql(source: "\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n username\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n hostname\n sourceControl {\n id\n repo\n repoURL\n ref\n refURL\n commit\n commitURL\n }\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n}\n"): (typeof documents)["\nfragment BazelInvocationInfo on BazelInvocation {\n metrics {\n id\n actionSummary {\n id\n actionsCreated\n actionsExecuted\n actionsCreatedNotIncludingAspects\n remoteCacheHits\n actionCacheStatistics {\n id\n loadTimeInMs\n saveTimeInMs\n hits\n misses\n sizeInBytes\n missDetails {\n id\n count\n reason\n }\n }\n runnerCount {\n id\n actionsExecuted\n name\n execKind\n }\n actionData {\n id\n mnemonic\n userTime\n systemTime\n lastEndedMs\n actionsCreated\n actionsExecuted\n firstStartedMs\n }\n }\n artifactMetrics {\n id\n sourceArtifactsReadCount\n sourceArtifactsReadSizeInBytes\n outputArtifactsSeenCount\n outputArtifactsSeenSizeInBytes\n outputArtifactsFromActionCacheCount\n outputArtifactsFromActionCacheSizeInBytes\n topLevelArtifactsCount\n topLevelArtifactsSizeInBytes\n }\n memoryMetrics {\n id\n usedHeapSizePostBuild\n peakPostGcHeapSize\n peakPostGcTenuredSpaceHeapSize\n garbageMetrics {\n id\n garbageCollected\n type\n }\n }\n targetMetrics {\n id\n targetsLoaded\n targetsConfigured\n targetsConfiguredNotIncludingAspects\n }\n timingMetrics {\n id\n cpuTimeInMs\n wallTimeInMs\n analysisPhaseTimeInMs\n executionPhaseTimeInMs\n actionsExecutionStartInMs\n }\n networkMetrics {\n id\n systemNetworkStats {\n id\n bytesSent\n bytesRecv\n packetsSent\n packetsRecv\n peakBytesSentPerSec\n peakBytesRecvPerSec\n peakPacketsSentPerSec\n peakPacketsRecvPerSec\n }\n }\n }\n canonicalCommandLine\n originalCommandLine\n optionsParsed\n id\n invocationID\n instanceName {\n name\n }\n authenticatedUser {\n displayName\n userUUID\n }\n bazelVersion\n build {\n id\n buildUUID\n }\n actions {\n id\n label\n type\n success\n exitCode\n commandLine\n startTime\n endTime\n failureCode\n failureMessage\n stdoutHash\n stdoutSizeBytes\n stdoutHashFunction\n stderrHash\n stderrSizeBytes\n stderrHashFunction\n configuration {\n id\n configurationID\n mnemonic\n platformName\n cpu\n makeVariables\n }\n }\n profile {\n id\n name\n digest\n sizeInBytes\n digestFunction\n }\n username\n startedAt\n endedAt\n exitCodeName\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n configurations {\n id\n cpu\n mnemonic\n }\n numFetches\n hostname\n sourceControl {\n id\n repo\n repoURL\n ref\n refURL\n commit\n commitURL\n }\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n}\n"];
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
-export function gql(source: "\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildURL\n buildUUID\n timestamp\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildURL\n buildUUID\n timestamp\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n"];
+export function gql(source: "\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildUUID\n timestamp\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query FindBuildByUUID(\n $buildUUID: UUID!\n $after: Cursor\n $first: Int\n $before: Cursor\n $last: Int\n $orderBy: BazelInvocationOrder\n $where: BazelInvocationWhereInput\n ) {\n getBuild(buildUUID: $buildUUID) {\n id\n buildUUID\n timestamp\n tags(orderBy: { field: KEY, direction: ASC }) {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n invocations(after: $after, first: $first, before: $before, last: $last, orderBy: $orderBy, where: $where) {\n pageInfo {\n startCursor\n endCursor\n hasNextPage\n hasPreviousPage\n }\n edges {\n node {\n ...GetBuildInvocation\n }\n }\n }\n }\n }\n"];
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
-export function gql(source: "\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n userLdap\n endedAt\n startedAt\n exitCodeName\n sourceControl{\n job\n action\n workflow\n runnerName\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n"): (typeof documents)["\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n userLdap\n endedAt\n startedAt\n exitCodeName\n sourceControl{\n job\n action\n workflow\n runnerName\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n"];
+export function gql(source: "\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n username\n endedAt\n startedAt\n exitCodeName\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n"): (typeof documents)["\n fragment GetBuildInvocation on BazelInvocation {\n id\n invocationID\n username\n endedAt\n startedAt\n exitCodeName\n tags {\n edges {\n node {\n id\n key\n value\n }\n }\n }\n connectionMetadata {\n connectionLastOpenAt\n timeSinceLastConnectionMillis\n }\n originalCommandLine\n }\n"];
/**
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
diff --git a/frontend/src/graphql/__generated__/graphql.ts b/frontend/src/graphql/__generated__/graphql.ts
index 3a2b001b..3b6d0e3c 100644
--- a/frontend/src/graphql/__generated__/graphql.ts
+++ b/frontend/src/graphql/__generated__/graphql.ts
@@ -771,7 +771,6 @@ export type BazelInvocation = Node & {
build?: Maybe;
/** JSON representation of the canonical command line options. */
canonicalCommandLine?: Maybe;
- changeNumber?: Maybe;
configurations?: Maybe>;
connectionMetadata?: Maybe;
endedAt?: Maybe;
@@ -782,21 +781,17 @@ export type BazelInvocation = Node & {
instanceName: InstanceName;
invocationID: Scalars['UUID']['output'];
invocationTargets: InvocationTargetConnection;
- isCiWorker?: Maybe;
metrics?: Maybe;
numFetches?: Maybe;
/** JSON representation of the parsed command line options */
optionsParsed?: Maybe;
/** JSON representation of the original command line options. */
originalCommandLine?: Maybe;
- patchsetNumber?: Maybe;
profile?: Maybe;
- sourceControl?: Maybe;
+ sourceControl?: Maybe>;
startedAt?: Maybe;
- stepLabel?: Maybe;
- user?: Maybe;
- userEmail?: Maybe;
- userLdap?: Maybe;
+ tags: InvocationTagConnection;
+ username?: Maybe;
};
@@ -809,6 +804,16 @@ export type BazelInvocationInvocationTargetsArgs = {
where?: InputMaybe;
};
+
+export type BazelInvocationTagsArgs = {
+ after?: InputMaybe;
+ before?: InputMaybe;
+ first?: InputMaybe;
+ last?: InputMaybe;
+ orderBy?: InputMaybe;
+ where?: InputMaybe;
+};
+
/** A connection to a list of items. */
export type BazelInvocationConnection = {
__typename?: 'BazelInvocationConnection';
@@ -840,7 +845,7 @@ export type BazelInvocationOrder = {
/** Properties by which BazelInvocation connections can be ordered. */
export enum BazelInvocationOrderField {
StartedAt = 'STARTED_AT',
- UserLdap = 'USER_LDAP'
+ Username = 'USERNAME'
}
/**
@@ -868,17 +873,6 @@ export type BazelInvocationWhereInput = {
/** bep_completed field predicates */
bepCompleted?: InputMaybe;
bepCompletedNEQ?: InputMaybe;
- /** change_number field predicates */
- changeNumber?: InputMaybe;
- changeNumberGT?: InputMaybe;
- changeNumberGTE?: InputMaybe;
- changeNumberIn?: InputMaybe>;
- changeNumberIsNil?: InputMaybe;
- changeNumberLT?: InputMaybe;
- changeNumberLTE?: InputMaybe;
- changeNumberNEQ?: InputMaybe;
- changeNumberNotIn?: InputMaybe>;
- changeNumberNotNil?: InputMaybe;
/** ended_at field predicates */
endedAt?: InputMaybe;
endedAtGT?: InputMaybe;
@@ -944,6 +938,9 @@ export type BazelInvocationWhereInput = {
/** source_control edge predicates */
hasSourceControl?: InputMaybe;
hasSourceControlWith?: InputMaybe>;
+ /** tags edge predicates */
+ hasTags?: InputMaybe;
+ hasTagsWith?: InputMaybe>;
/** hostname field predicates */
hostname?: InputMaybe;
hostnameContains?: InputMaybe;
@@ -978,11 +975,6 @@ export type BazelInvocationWhereInput = {
invocationIDLTE?: InputMaybe;
invocationIDNEQ?: InputMaybe;
invocationIDNotIn?: InputMaybe>;
- /** is_ci_worker field predicates */
- isCiWorker?: InputMaybe;
- isCiWorkerIsNil?: InputMaybe;
- isCiWorkerNEQ?: InputMaybe;
- isCiWorkerNotNil?: InputMaybe;
not?: InputMaybe;
/** num_fetches field predicates */
numFetches?: InputMaybe;
@@ -996,17 +988,6 @@ export type BazelInvocationWhereInput = {
numFetchesNotIn?: InputMaybe>;
numFetchesNotNil?: InputMaybe;
or?: InputMaybe>;
- /** patchset_number field predicates */
- patchsetNumber?: InputMaybe;
- patchsetNumberGT?: InputMaybe;
- patchsetNumberGTE?: InputMaybe;
- patchsetNumberIn?: InputMaybe>;
- patchsetNumberIsNil?: InputMaybe;
- patchsetNumberLT?: InputMaybe;
- patchsetNumberLTE?: InputMaybe;
- patchsetNumberNEQ?: InputMaybe;
- patchsetNumberNotIn?: InputMaybe>;
- patchsetNumberNotNil?: InputMaybe;
/** profile_name field predicates */
profileName?: InputMaybe;
profileNameContains?: InputMaybe;
@@ -1034,63 +1015,31 @@ export type BazelInvocationWhereInput = {
startedAtNEQ?: InputMaybe;
startedAtNotIn?: InputMaybe>;
startedAtNotNil?: InputMaybe;
- /** step_label field predicates */
- stepLabel?: InputMaybe;
- stepLabelContains?: InputMaybe;
- stepLabelContainsFold?: InputMaybe;
- stepLabelEqualFold?: InputMaybe;
- stepLabelGT?: InputMaybe;
- stepLabelGTE?: InputMaybe;
- stepLabelHasPrefix?: InputMaybe;
- stepLabelHasSuffix?: InputMaybe;
- stepLabelIn?: InputMaybe>;
- stepLabelIsNil?: InputMaybe;
- stepLabelLT?: InputMaybe;
- stepLabelLTE?: InputMaybe;
- stepLabelNEQ?: InputMaybe;
- stepLabelNotIn?: InputMaybe>;
- stepLabelNotNil?: InputMaybe;
- /** user_email field predicates */
- userEmail?: InputMaybe;
- userEmailContains?: InputMaybe;
- userEmailContainsFold?: InputMaybe;
- userEmailEqualFold?: InputMaybe;
- userEmailGT?: InputMaybe;
- userEmailGTE?: InputMaybe;
- userEmailHasPrefix?: InputMaybe;
- userEmailHasSuffix?: InputMaybe;
- userEmailIn?: InputMaybe>;
- userEmailIsNil?: InputMaybe;
- userEmailLT?: InputMaybe;
- userEmailLTE?: InputMaybe;
- userEmailNEQ?: InputMaybe;
- userEmailNotIn?: InputMaybe>;
- userEmailNotNil?: InputMaybe;
- /** user_ldap field predicates */
- userLdap?: InputMaybe;
- userLdapContains?: InputMaybe;
- userLdapContainsFold?: InputMaybe;
- userLdapEqualFold?: InputMaybe;
- userLdapGT?: InputMaybe;
- userLdapGTE?: InputMaybe;
- userLdapHasPrefix?: InputMaybe;
- userLdapHasSuffix?: InputMaybe;
- userLdapIn?: InputMaybe>;
- userLdapIsNil?: InputMaybe;
- userLdapLT?: InputMaybe;
- userLdapLTE?: InputMaybe;
- userLdapNEQ?: InputMaybe;
- userLdapNotIn?: InputMaybe>;
- userLdapNotNil?: InputMaybe;
+ /** username field predicates */
+ username?: InputMaybe;
+ usernameContains?: InputMaybe;
+ usernameContainsFold?: InputMaybe;
+ usernameEqualFold?: InputMaybe;
+ usernameGT?: InputMaybe;
+ usernameGTE?: InputMaybe;
+ usernameHasPrefix?: InputMaybe;
+ usernameHasSuffix?: InputMaybe;
+ usernameIn?: InputMaybe>;
+ usernameIsNil?: InputMaybe;
+ usernameLT?: InputMaybe;
+ usernameLTE?: InputMaybe;
+ usernameNEQ?: InputMaybe;
+ usernameNotIn?: InputMaybe>;
+ usernameNotNil?: InputMaybe;
};
export type Build = Node & {
__typename?: 'Build';
- buildURL: Scalars['String']['output'];
buildUUID: Scalars['UUID']['output'];
id: Scalars['ID']['output'];
instanceName: InstanceName;
invocations: BazelInvocationConnection;
+ tags: BuildTagConnection;
timestamp: Scalars['Time']['output'];
};
@@ -1104,6 +1053,16 @@ export type BuildInvocationsArgs = {
where?: InputMaybe;
};
+
+export type BuildTagsArgs = {
+ after?: InputMaybe;
+ before?: InputMaybe;
+ first?: InputMaybe;
+ last?: InputMaybe;
+ orderBy?: InputMaybe;
+ where?: InputMaybe;
+};
+
/** A connection to a list of items. */
export type BuildConnection = {
__typename?: 'BuildConnection';
@@ -1273,26 +1232,103 @@ export enum BuildOrderField {
Timestamp = 'TIMESTAMP'
}
+export type BuildTag = Node & {
+ __typename?: 'BuildTag';
+ build: Build;
+ id: Scalars['ID']['output'];
+ key: Scalars['String']['output'];
+ value: Scalars['String']['output'];
+};
+
+/** A connection to a list of items. */
+export type BuildTagConnection = {
+ __typename?: 'BuildTagConnection';
+ /** A list of edges. */
+ edges?: Maybe>>;
+ /** Information to aid in pagination. */
+ pageInfo: PageInfo;
+ /** Identifies the total count of items in the connection. */
+ totalCount: Scalars['Int']['output'];
+};
+
+/** An edge in a connection. */
+export type BuildTagEdge = {
+ __typename?: 'BuildTagEdge';
+ /** A cursor for use in pagination. */
+ cursor: Scalars['Cursor']['output'];
+ /** The item at the end of the edge. */
+ node?: Maybe;
+};
+
+/** Ordering options for BuildTag connections */
+export type BuildTagOrder = {
+ /** The ordering direction. */
+ direction?: OrderDirection;
+ /** The field by which to order BuildTags. */
+ field: BuildTagOrderField;
+};
+
+/** Properties by which BuildTag connections can be ordered. */
+export enum BuildTagOrderField {
+ Key = 'KEY'
+}
+
+/**
+ * BuildTagWhereInput is used for filtering BuildTag objects.
+ * Input was generated by ent.
+ */
+export type BuildTagWhereInput = {
+ and?: InputMaybe>;
+ /** build edge predicates */
+ hasBuild?: InputMaybe;
+ hasBuildWith?: InputMaybe>;
+ /** id field predicates */
+ id?: InputMaybe;
+ idGT?: InputMaybe;
+ idGTE?: InputMaybe;
+ idIn?: InputMaybe>;
+ idLT?: InputMaybe;
+ idLTE?: InputMaybe;
+ idNEQ?: InputMaybe;
+ idNotIn?: InputMaybe>;
+ /** key field predicates */
+ key?: InputMaybe;
+ keyContains?: InputMaybe;
+ keyContainsFold?: InputMaybe;
+ keyEqualFold?: InputMaybe;
+ keyGT?: InputMaybe;
+ keyGTE?: InputMaybe;
+ keyHasPrefix?: InputMaybe;
+ keyHasSuffix?: InputMaybe;
+ keyIn?: InputMaybe>;
+ keyLT?: InputMaybe;
+ keyLTE?: InputMaybe;
+ keyNEQ?: InputMaybe;
+ keyNotIn?: InputMaybe>;
+ not?: InputMaybe;
+ or?: InputMaybe>;
+ /** value field predicates */
+ value?: InputMaybe;
+ valueContains?: InputMaybe;
+ valueContainsFold?: InputMaybe;
+ valueEqualFold?: InputMaybe;
+ valueGT?: InputMaybe;
+ valueGTE?: InputMaybe;
+ valueHasPrefix?: InputMaybe;
+ valueHasSuffix?: InputMaybe;
+ valueIn?: InputMaybe>;
+ valueLT?: InputMaybe;
+ valueLTE?: InputMaybe;
+ valueNEQ?: InputMaybe;
+ valueNotIn?: InputMaybe>;
+};
+
/**
* BuildWhereInput is used for filtering Build objects.
* Input was generated by ent.
*/
export type BuildWhereInput = {
and?: InputMaybe>;
- /** build_url field predicates */
- buildURL?: InputMaybe;
- buildURLContains?: InputMaybe;
- buildURLContainsFold?: InputMaybe;
- buildURLEqualFold?: InputMaybe;
- buildURLGT?: InputMaybe;
- buildURLGTE?: InputMaybe;
- buildURLHasPrefix?: InputMaybe;
- buildURLHasSuffix?: InputMaybe;
- buildURLIn?: InputMaybe>;
- buildURLLT?: InputMaybe;
- buildURLLTE?: InputMaybe;
- buildURLNEQ?: InputMaybe;
- buildURLNotIn?: InputMaybe>;
/** build_uuid field predicates */
buildUUID?: InputMaybe;
buildUUIDGT?: InputMaybe;
@@ -1308,6 +1344,9 @@ export type BuildWhereInput = {
/** invocations edge predicates */
hasInvocations?: InputMaybe;
hasInvocationsWith?: InputMaybe>;
+ /** tags edge predicates */
+ hasTags?: InputMaybe;
+ hasTagsWith?: InputMaybe>;
/** id field predicates */
id?: InputMaybe