// Copyright 2022 Acme Gating, LLC
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
import React, { useEffect, useState } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { useHistory, useLocation } from 'react-router-dom'
import {
PageSection,
PageSectionVariants,
Text,
TextContent,
} from '@patternfly/react-core'
import ReactJson from 'react-json-view'
import FreezeJobToolbar from '../containers/freezejob/FreezeJobToolbar'
import { makeFreezeJobKey, fetchFreezeJobIfNeeded } from '../actions/freezejob'
function FreezeJobPage(props) {
const { tenant, fetchFreezeJobIfNeeded } = props
const [currentPipeline, setCurrentPipeline] = useState()
const [currentProject, setCurrentProject] = useState()
const [currentBranch, setCurrentBranch] = useState()
const [currentJob, setCurrentJob] = useState()
const history = useHistory()
const location = useLocation()
if (!currentBranch) {
const urlParams = new URLSearchParams(location.search)
const pipeline = urlParams.get('pipeline')
const project = urlParams.get('project')
const branch = urlParams.get('branch')
const job = urlParams.get('job')
if (pipeline && branch && project && job) {
setCurrentPipeline(pipeline)
setCurrentProject(project)
setCurrentBranch(branch)
setCurrentJob(job)
}
}
useEffect(() => {
document.title = 'Zuul Frozen Job'
if (currentPipeline && currentProject && currentBranch && currentJob) {
fetchFreezeJobIfNeeded(tenant, currentPipeline, currentProject,
currentBranch, currentJob)
}
}, [fetchFreezeJobIfNeeded, tenant, currentPipeline, currentProject,
currentBranch, currentJob])
function onChange(pipeline, project, branch, job) {
setCurrentPipeline(pipeline)
setCurrentProject(project)
setCurrentBranch(branch)
setCurrentJob(job)
const searchParams = new URLSearchParams('')
searchParams.append('pipeline', pipeline)
searchParams.append('project', project)
searchParams.append('branch', branch)
searchParams.append('job', job)
history.push({
pathname: location.pathname,
search: searchParams.toString(),
})
if (currentPipeline && currentProject && currentBranch && currentJob) {
fetchFreezeJobIfNeeded(tenant, currentPipeline, currentProject,
currentBranch, currentJob)
}
}
const tenantJobs = props.freezejob.freezeJobs[tenant.name]
const freezeJobKey = makeFreezeJobKey(currentPipeline,
currentProject,
currentBranch,
currentJob)
const job = tenantJobs ? tenantJobs[freezeJobKey] : undefined
function renderFrozenJob() {
return (
)
}
return (
<>
Freeze Job
Freezing a job asks Zuul to combine all the
project and job configuration
stanzas for a job as if a change for a given
project and branch were to be enqueued into
a specific pipeline. The resulting job
configuration is displayed below.
{job && renderFrozenJob(job)}
>
)
}
FreezeJobPage.propTypes = {
fetchFreezeJobIfNeeded: PropTypes.func,
tenant: PropTypes.object,
freezejob: PropTypes.object,
preferences: PropTypes.object,
}
function mapStateToProps(state) {
return {
tenant: state.tenant,
freezejob: state.freezejob,
preferences: state.preferences,
}
}
const mapDispatchToProps = {
fetchFreezeJobIfNeeded
}
export default connect(mapStateToProps, mapDispatchToProps)(FreezeJobPage)