Skip to content

Commit 829e707

Browse files
authored
Add option to cancel release (#161)
1 parent ed269e0 commit 829e707

File tree

3 files changed

+72
-3
lines changed

3 files changed

+72
-3
lines changed

dashboard/src/actions/index.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -823,4 +823,24 @@ export const fetchServiceSpecServices = (slug) => {
823823
types: [ SERVICE_SPEC_SERVICES_FETCH_REQUEST, SERVICE_SPEC_SERVICES_FETCH_SUCCESS, SERVICE_SPEC_SERVICES_FETCH_FAILURE ]
824824
}
825825
}
826-
}
826+
}
827+
828+
export const PROJECT_CANCEL_RELEASE_REQUEST = 'PROJECT_CANCEL_RELEASE_REQUEST'
829+
export const PROJECT_CANCEL_RELEASE_SUCCESS = 'PROJECT_CANCEL_RELEASE_SUCCESS'
830+
export const PROJECT_CANCEL_RELEASE_FAILURE = 'PROJECT_CANCEL_RELEASE_FAILURE'
831+
832+
export const cancelRelease = (project_slug, payload) => {
833+
return {
834+
[CALL_API]: {
835+
endpoint: `${API_ROOT}/projects/${project_slug}/releases/cancel`,
836+
method: 'POST',
837+
body: postBody(payload),
838+
headers: {
839+
'Accept': 'application/json',
840+
'Content-Type': 'application/json',
841+
'Authorization': `Bearer ${authToken()}`
842+
},
843+
types: [ PROJECT_CANCEL_RELEASE_REQUEST, PROJECT_CANCEL_RELEASE_SUCCESS, PROJECT_CANCEL_RELEASE_FAILURE ]
844+
}
845+
}
846+
}

dashboard/src/components/project/Deploy.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { Component } from 'react'
22
import { isEmpty, map } from 'lodash'
33
import { connect } from 'react-redux'
44
import { Alert } from 'reactstrap'
5-
import { fetchProjectFeatures, createProjectRelease, createProjectRollbackTo, fetchProjectReleases, fetchProjectCurrentRelease } from '../../actions'
5+
import { fetchProjectFeatures, createProjectRelease, createProjectRollbackTo, fetchProjectReleases, fetchProjectCurrentRelease, cancelRelease } from '../../actions'
66
import moment from 'moment'
77
import Pagination from '../Pagination'
88
import DockerImage from '../workflows/DockerImage'
@@ -59,6 +59,11 @@ class ProjectDeploy extends Component {
5959
this.props.createProjectRollbackTo(this.props.project.slug, release)
6060
}
6161

62+
onCancelRelease(release, e) {
63+
e.preventDefault()
64+
this.props.cancelRelease(this.props.project.slug, release)
65+
}
66+
6267
renderFeatureHash(feature) {
6368
if(feature.externalLink && feature.externalLink !== '' && feature.externalLink.startsWith('http')) {
6469
return (<a href={feature.externalLink} target="_blank">{feature.hash.substring(0,8)}</a>)
@@ -125,7 +130,7 @@ class ProjectDeploy extends Component {
125130
let jsx = []
126131
switch(release.state) {
127132
case 'waiting':
128-
jsx.push(<i key="waiting" className="fa fa-circle-o-notch fa-spin fa-fw float-xs-right" />)
133+
jsx.push(<button type="button" key="btn" className="btn btn-secondary btn-sm float-xs-right" onClick={(e) => this.onCancelRelease(release, e)}>Cancel</button>)
129134
break
130135
case 'running':
131136
jsx.push(<i key="running" className="fa fa-refresh fa-spin fa-fw float-xs-right" />)
@@ -352,6 +357,7 @@ export default connect(mapStateToProps, {
352357
fetchProjectFeatures,
353358
createProjectRelease,
354359
createProjectRollbackTo,
360+
cancelRelease,
355361
fetchProjectReleases,
356362
fetchProjectCurrentRelease
357363
})(ProjectDeploy)

server/plugins/codeflow/api_projects.go

+43
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func (x *Projects) Register(api *rest.Api) []*rest.Route {
4343
rest.Get(x.Path+"/#slug/releases", x.releases),
4444
rest.Get(x.Path+"/#slug/releases/current", x.currentRelease),
4545
rest.Post(x.Path+"/#slug/releases/rollback", x.createReleasesRollback),
46+
rest.Post(x.Path+"/#slug/releases/cancel", x.cancelRelease),
4647
rest.Get(x.Path+"/#slug/features", x.features),
4748
rest.Get(x.Path+"/#slug", x.project),
4849
rest.Post(x.Path, x.createProjects),
@@ -810,3 +811,45 @@ func (x *Projects) updateReleaseBuild(w rest.ResponseWriter, r *rest.Request) {
810811

811812
w.WriteJson(build)
812813
}
814+
815+
func (x *Projects) cancelRelease(w rest.ResponseWriter, r *rest.Request) {
816+
release := Release{}
817+
user := User{}
818+
819+
if err := r.DecodeJsonPayload(&release); err != nil {
820+
rest.Error(w, err.Error(), http.StatusInternalServerError)
821+
return
822+
}
823+
824+
if err := db.Collection("releases").FindById(release.Id, &release); err != nil {
825+
if _, ok := err.(*bongo.DocumentNotFoundError); ok {
826+
log.Printf("Releases::FindById::DocumentNotFoundError: _id: `%v`", release.Id)
827+
} else {
828+
log.Printf("Releases::FindById::Error: %s", err.Error())
829+
}
830+
return
831+
}
832+
833+
if err := CurrentUser(r, &user); err != nil {
834+
rest.Error(w, err.Error(), http.StatusInternalServerError)
835+
return
836+
}
837+
838+
if release.State == plugins.Waiting {
839+
release.State = plugins.Failed
840+
release.StateMessage = fmt.Sprintf("cancelled by %v", user.Username)
841+
842+
if err := db.Collection("releases").Save(&release); err != nil {
843+
log.Printf("Releases::Save::Error: %v", err.Error())
844+
log.Printf("Releases::FindById::Error: %s", err.Error())
845+
return
846+
}
847+
848+
if err := ReleaseUpdated(&release); err != nil {
849+
rest.Error(w, err.Error(), http.StatusBadRequest)
850+
return
851+
}
852+
}
853+
854+
w.WriteJson(release)
855+
}

0 commit comments

Comments
 (0)