Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions pkg/api/componentreadiness/query/querygenerators.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,15 @@ func BuildComponentReportQuery(
Value: reqOptions.Capabilities,
})
}
if isSample && len(reqOptions.Lifecycles) > 0 {
// filter by lifecycle : only applied to sample, not basis
// treat NULL or empty lifecycle as "blocking"
queryString += ` AND COALESCE(NULLIF(lifecycle, ''), 'blocking') IN UNNEST(@Lifecycles)`
commonParams = append(commonParams, bigquery.QueryParameter{
Name: "Lifecycles",
Value: reqOptions.Lifecycles,
})
}

// In this context, a component report, multiple test ID options should not be specified. Thus
// here we assume just one for the filtering purposes here. This code triggers as you drill down
Expand Down
3 changes: 2 additions & 1 deletion pkg/api/componentreadiness/utils/queryparamparser.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ func ParseComponentReportRequest(

// free-form, not "safe" - used in query filters
opts.TestFilters.Capabilities = req.URL.Query()["testCapabilities"]
opts.TestFilters.Lifecycles = req.URL.Query()["testLifecycles"]

var variantWarnings []string
if opts.VariantOption, variantWarnings, err = parseVariantOptions(req, allJobVariants, overrides); err != nil {
Expand Down Expand Up @@ -159,7 +160,7 @@ func getRequestedView(req *http.Request, views []crview.View) (*crview.View, err
"includeVariant", "compareVariant", "variantCrossCompare", // variants
"confidence", "pity", "minFail", "passRateNewTests", "passRateAllTests",
"ignoreMissing", "ignoreDisruption", // advanced opts
"testCapabilities", // test filters
"testCapabilities", "testLifecycles", // test filters
}
found := []string{}
for _, p := range incompatible {
Expand Down
33 changes: 33 additions & 0 deletions pkg/api/tests.go
Original file line number Diff line number Diff line change
Expand Up @@ -543,3 +543,36 @@ func GetTestCapabilitiesFromDB(bqClient *bq.Client) ([]string, error) {

return row.Capabilities, nil
}

// GetTestLifecyclesFromDB returns a sorted list of lifecycles from the BQ junit table
func GetTestLifecyclesFromDB(bqClient *bq.Client) ([]string, error) {
if bqClient == nil || bqClient.BQ == nil {
return []string{}, nil
}

// Query recent data (last 7 days) to satisfy partition filter requirement on modified_time
qFmt := `SELECT ARRAY_AGG(DISTINCT lifecycle ORDER BY lifecycle) AS lifecycles
FROM %s.junit
WHERE modified_time >= DATETIME_SUB(CURRENT_DATETIME(), INTERVAL 7 DAY)
AND lifecycle IS NOT NULL AND lifecycle != ''`
q := bqClient.BQ.Query(fmt.Sprintf(qFmt, bqClient.Dataset))

log.Infof("Fetching test lifecycles with:\n%s\n", q.Q)

it, err := q.Read(context.Background())
if err != nil {
log.WithError(err).Error("error querying test lifecycles from bigquery")
return []string{}, err
}

var row struct {
Lifecycles []string `bigquery:"lifecycles"`
}
err = it.Next(&row)
if err != nil {
log.WithError(err).Error("error retrieving test lifecycles from bigquery")
return []string{}, errors.Wrap(err, "error retrieving test lifecycles from bigquery")
}

return row.Lifecycles, nil
}
2 changes: 1 addition & 1 deletion pkg/apis/api/componentreport/reqopts/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ type RelativeRelease struct {
// TestFilters are query filters on attributes of the tests themselves, as opposed to the jobs they run in
type TestFilters struct {
Capabilities []string `json:"capabilities,omitempty" yaml:"capabilities,omitempty"`
// we will likely have more later
Lifecycles []string `json:"lifecycles,omitempty" yaml:"lifecycles,omitempty"`
}

// TestIdentification handles options used in the test details report when we focus in
Expand Down
18 changes: 18 additions & 0 deletions pkg/sippyserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -895,6 +895,17 @@ func (s *Server) jsonTestCapabilitiesFromDB(w http.ResponseWriter, req *http.Req
api.RespondWithJSON(http.StatusOK, w, capabilities)
}

func (s *Server) jsonTestLifecyclesFromDB(w http.ResponseWriter, req *http.Request) {
lifecycles, err := api.GetTestLifecyclesFromDB(s.bigQueryClient)
if err != nil {
log.WithError(err).Error("error querying test lifecycles")
failureResponse(w, http.StatusInternalServerError, "error querying test lifecycles")
return
}

api.RespondWithJSON(http.StatusOK, w, lifecycles)
}

func (s *Server) jsonHealthReportFromDB(w http.ResponseWriter, req *http.Request) {
release := s.getParamOrFail(w, req, "release")
if release != "" {
Expand Down Expand Up @@ -2150,6 +2161,13 @@ func (s *Server) Serve() {
CacheTime: 1 * time.Hour,
HandlerFunc: s.jsonTestCapabilitiesFromDB,
},
{
EndpointPath: "/api/tests/lifecycles",
Description: "Returns list of available test lifecycles",
Capabilities: []string{ComponentReadinessCapability},
CacheTime: 1 * time.Hour,
HandlerFunc: s.jsonTestLifecyclesFromDB,
},
{
EndpointPath: "/api/install",
Description: "Reports on installations",
Expand Down
5 changes: 4 additions & 1 deletion sippy-ng/src/component_readiness/CompReadyEnvCapabilities.js
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,10 @@ export default function CompReadyEnvCapabilities(props) {

return (
<Fragment>
<Sidebar theme={theme} controlsOpts={{ filterByCapabilities: true }} />
<Sidebar
theme={theme}
controlsOpts={{ filterByCapabilities: true, filterByLifecycles: true }}
/>
<CompReadyPageTitle pageTitle={pageTitle} apiCallStr={apiCallStr} />
<WarningsBanner warnings={warnings} />
<h2>
Expand Down
3 changes: 3 additions & 0 deletions sippy-ng/src/component_readiness/CompReadyUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,9 @@ export function getUpdatedUrlParts(vars) {
vars.testCapabilities.forEach((item) => {
queryParams.append('testCapabilities', item)
})
vars.testLifecycles.forEach((item) => {
queryParams.append('testLifecycles', item)
})

// Stringify and put the begin param character.
queryParams.sort() // ensure they always stay in sorted order to prevent url history changes
Expand Down
6 changes: 6 additions & 0 deletions sippy-ng/src/component_readiness/CompReadyVars.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ export const CompReadyVarsProvider = ({ children }) => {
environment: StringParam,
capability: StringParam,
testCapabilities: ArrayParam, // Multiple capabilities selected for filtering
testLifecycles: ArrayParam, // Multiple lifecycles selected for filtering
testId: StringParam,
testName: StringParam,
testBasisRelease: StringParam,
Expand Down Expand Up @@ -224,6 +225,7 @@ export const CompReadyVarsProvider = ({ children }) => {
const [environment, setEnvironment] = React.useState(undefined)
const [capability, setCapability] = React.useState(undefined)
const [testCapabilities, setTestCapabilities] = React.useState([])
const [testLifecycles, setTestLifecycles] = React.useState([])
const [testId, setTestId] = React.useState(undefined)
const [testName, setTestName] = React.useState(undefined)
const [testBasisRelease, setTestBasisRelease] = React.useState(undefined)
Expand Down Expand Up @@ -322,6 +324,7 @@ export const CompReadyVarsProvider = ({ children }) => {
setEnvironment(params.environment)
setCapability(params.capability)
setTestCapabilities(params.testCapabilities || [])
setTestLifecycles(params.testLifecycles || [])
setTestId(params.testId)
setTestName(params.testName)
setTestBasisRelease(params.testBasisRelease)
Expand Down Expand Up @@ -362,6 +365,7 @@ export const CompReadyVarsProvider = ({ children }) => {
environment,
capability,
testCapabilities,
testLifecycles,
testId,
testName,
testBasisRelease,
Expand Down Expand Up @@ -611,6 +615,8 @@ export const CompReadyVarsProvider = ({ children }) => {
environment,
testCapabilities,
setTestCapabilities,
testLifecycles,
setTestLifecycles,
testId,
testName,
testBasisRelease,
Expand Down
Loading