Skip to content

Commit

Permalink
Adds new endpoint for jenkins jobs (#17)
Browse files Browse the repository at this point in the history
* Adds new endpoint for jenkins jobs

Adds new tab for Jenkins jobs
Abstracts logic to reuse methods when fetching data from ES

Signed-off-by: Vicente Zepeda Mas <[email protected]>

* Dropping errored runs from the results

Signed-off-by: Vicente Zepeda Mas <[email protected]>

---------

Signed-off-by: Vicente Zepeda Mas <[email protected]>
  • Loading branch information
chentex authored Sep 1, 2023
1 parent e40aa43 commit 0b6b7ae
Show file tree
Hide file tree
Showing 10 changed files with 121 additions and 82 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.idea
backend/ocpperf.toml
2 changes: 2 additions & 0 deletions backend/app/api/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
from app.api.endpoints import results
from app.api.endpoints import airflow
from app.api.endpoints import jobs
from app.api.endpoints import jenkins

api_router = APIRouter()
api_router.include_router(results.router, tags=['perfscale'])
api_router.include_router(airflow.router, tags=['perfscale'])
api_router.include_router(jobs.router, tags=['perfscale'])
api_router.include_router(jenkins.router, tags=['perfscale'])
77 changes: 77 additions & 0 deletions backend/app/api/endpoints/common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
from datetime import datetime,timedelta
import trio
import semver
import pandas as pd
from app.services.search import ElasticService

from app.async_util import trio_run_with_asyncio


async def getData(type):
query = {
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "ciSystem == " + type
}
},
{
"range": {
"timestamp": {
"gte": "now-10d"
}
}
}
]
}
}
}

es = ElasticService()
response = await es.post(query)
await es.close()
tasks = [item['_source'] for item in response["hits"]["hits"]]
jobs = pd.json_normalize(tasks)
cleanJobs = jobs[jobs['platform'] != ""]

drop = ['endDate','clusterName','upstreamJobBuild','executionDate',
'startDate','buildTag','upstreamJob','releaseStream','timestamp',
'jobDuration','networkType','workerNodesType','infraNodesType','masterNodesType',
'workerNodesCount','infraNodesCount','masterNodesCount']
cleanJobs = cleanJobs.drop(columns=drop)
cleanJobs['shortVersion'] = cleanJobs['ocpVersion'].str.slice(0,4)

df = {'response': group_by_platform(cleanJobs)}

return df

def group_by_platform(data_frame: pd.DataFrame):
return [
get_table(group[0], group[1].drop(columns=['platform']))
for group in data_frame.groupby(by=['platform'])
]


def get_table(title: str, data_frame: pd.DataFrame):
return {
'title': title,
'data' : get_framelist(data_frame)
}

def get_framelist(data_frame: pd.DataFrame):
return [
get_frame(group[0], (group[1].drop(
columns=['nodeName', 'ocpVersion'])))
for group in data_frame.groupby(by=['shortVersion'])
]


def get_frame(title: str, data_frame: pd.DataFrame):
return {
'version' : title.title(),
'cloud_data': data_frame.values.tolist(),
'columns' : [name.replace('_', ' ').title()
for name in data_frame.columns.tolist()]
}
11 changes: 11 additions & 0 deletions backend/app/api/endpoints/jenkins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from .common import getData
from fastapi import APIRouter

from app.async_util import trio_run_with_asyncio

router = APIRouter()

@router.post('/api/jenkins')
@router.get('/api/jenkins')
async def jobs():
return await getData("JENKINS")
79 changes: 2 additions & 77 deletions backend/app/api/endpoints/jobs.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
from datetime import datetime,timedelta
import trio
import semver
import pprint
import pandas as pd
from .common import getData
from fastapi import APIRouter
from app.services.search import ElasticService

from app.async_util import trio_run_with_asyncio

Expand All @@ -13,74 +8,4 @@
@router.post('/api/jobs')
@router.get('/api/jobs')
async def jobs():
query = {
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "ciSystem == PROW || ciSystem == JENKINS"
}
},
{
"range": {
"timestamp": {
"gte": "now-10d"
}
}
}
]
}
}
}

es = ElasticService()
response = await es.post(query)
await es.close()
tasks = [item['_source'] for item in response["hits"]["hits"]]
jobs = pd.json_normalize(tasks)


drop = ['endDate','clusterName','upstreamJobBuild','executionDate',
'startDate','buildTag','upstreamJob','releaseStream','timestamp',
'jobDuration','networkType','workerNodesType','infraNodesType','masterNodesType',
'workerNodesCount','infraNodesCount','masterNodesCount']
jobs = jobs.drop(columns=drop)
jobs['shortVersion'] = jobs['ocpVersion'].str.slice(0,4)

pprint.pprint(jobs)

cloud_data = []

df = {'response': group_by_platform(jobs) }

return df

def group_by_platform(data_frame: pd.DataFrame):
return [
get_table(group[0], group[1].drop(columns=['platform']))
for group in data_frame.groupby(by=['platform'])
]


def get_table(title: str, data_frame: pd.DataFrame):
return {
'title': title,
'data' : get_framelist(data_frame)
}

def get_framelist(data_frame: pd.DataFrame):
return [
get_frame(group[0], (group[1].drop(
columns=['nodeName', 'ocpVersion'])))
for group in data_frame.groupby(by=['shortVersion'])
]


def get_frame(title: str, data_frame: pd.DataFrame):
return {
'version' : title.title(),
'cloud_data': data_frame.values.tolist(),
'columns' : [name.replace('_', ' ').title()
for name in data_frame.columns.tolist()]
}
return await getData("PROW")
7 changes: 7 additions & 0 deletions frontend/src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
} from "react-router-dom";
import PlatformView from './components/Platform/PlatformView';
import JobView from './components/Platform/JobView';
import JenkinsView from './components/Platform/JenkinsView';
import { Nav, NavItem, NavList, PageHeader } from '@patternfly/react-core';
import {
Page,
Expand All @@ -32,6 +33,9 @@ export default function App() {
<NavItem>
<Link to="/jobs">Prow</Link>
</NavItem>
<NavItem>
<Link to="/jenkins">Jenkins</Link>
</NavItem>
<NavItem>
<Link to="/platform">Airflow</Link>
</NavItem>
Expand Down Expand Up @@ -61,6 +65,9 @@ export default function App() {
<Route path="/jobs">
<JobView />
</Route>
<Route path="/jenkins">
<JenkinsView />
</Route>
<Route path="/platform">
<PlatformView />
</Route>
Expand Down
18 changes: 18 additions & 0 deletions frontend/src/components/Platform/JenkinsView.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import './PlatformView.css';
import "@patternfly/react-core/dist/styles/base.css";
import PlatformTabs from './Tabs/Platform';
import useESPerfData from '../../hooks/useESPerfData';
import React from 'react';


export default function JenkinsView() {
const perfData = useESPerfData("jenkins")
return (
<>
<div className="PlatformView">
<PlatformTabs id="PlatformTabs" data={perfData} />
</div>
</>
);
}

4 changes: 2 additions & 2 deletions frontend/src/components/Platform/JobView.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import './PlatformView.css';
import "@patternfly/react-core/dist/styles/base.css";
import PlatformTabs from './Tabs/Platform';
import useProwPerfData from '../../hooks/useProwPerfData';
import useESPerfData from '../../hooks/useESPerfData';
import React from 'react';


export default function JobView() {
const perfData = useProwPerfData()
const perfData = useESPerfData("jobs")
return (
<>
<div className="PlatformView">
Expand Down
1 change: 0 additions & 1 deletion frontend/src/components/Platform/PlatformView.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import './PlatformView.css';
import "@patternfly/react-core/dist/styles/base.css";
import PlatformTabs from './Tabs/Platform';
import usePerfData from '../../hooks/usePerfData';
import useProwPerfData from '../../hooks/useProwPerfData';
import React from 'react';


Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react';

export default function useProwPerfData() {
export default function useESPerfData(endpoint) {
const [perfData, setPerfData ] = useState([]);
const query = {
"query": {
Expand All @@ -20,7 +20,6 @@ export default function useProwPerfData() {
// body: JSON.stringify(query)
}
var hostname = window.location.hostname
var endpoint = "jobs"
if (hostname == "localhost") {
var host = "http://localhost:8000/api/"+endpoint;
} else {
Expand Down

0 comments on commit 0b6b7ae

Please sign in to comment.