Skip to content

Commit 8ebd2d5

Browse files
committed
api/projects: add endpoint to edit a deployment
1 parent 35ba98f commit 8ebd2d5

File tree

4 files changed

+182
-1
lines changed

4 files changed

+182
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
* Add `api::projects::DeleteProject` endpoint
66
* Add `api::projects::deployments::DeleteDeployment` endpoint
7+
* Add `api::projects::deployments::EditDeployment` endpoint
78

89
# v0.1700.1
910

src/api/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ These API endpoints have been implemented.
6969
* `PUT /projects/:project/deploy_keys/:deploy_key` `projects/deploy_keys/edit.rs`
7070
* `DELETE /projects/:project/deploy_keys/:deploy_key` `projects/deploy_keys/delete.rs`
7171
* `POST /projects/:project/deploy_keys/:deploy_key/enable` `projects/deploy_keys/enable.rs`
72+
* `PUT /projects/:project/deployments/:deployment` `projects/deployments/edit.rs`
7273
* `DELETE /projects/:project/deployments/:deployment` `projects/deployments/delete.rs`
7374
* `GET /projects/:project/environments` `projects/environments/environments.rs`
7475
* `GET /projects/:project/environments/:environment` `projects/environments/environment.rs`
@@ -351,7 +352,6 @@ instead of having to search the page for missing endpoints.
351352
* `GET /projects/:project/deployments` https://gitlab.kitware.com/help/api/deployments.md#list-project-deployments
352353
* `POST /projects/:project/deployments` https://gitlab.kitware.com/help/api/deployments.md#create-a-deployment
353354
* `GET /projects/:project/deployments/:deployment` https://gitlab.kitware.com/help/api/deployments.md#get-a-specific-deployment
354-
* `PUT /projects/:project/deployments/:deployment` https://gitlab.kitware.com/help/api/deployments.md#update-a-deployment
355355
* `GET /projects/:project/deployments/:deployment/merge_requests` https://gitlab.kitware.com/help/api/deployments.md#list-of-merge-requests-associated-with-a-deployment
356356
* `POST /projects/:project/deployments/:deployment/approval` https://gitlab.kitware.com/help/api/deployments.md#approve-or-reject-a-blocked-deployment
357357
* `POST /projects/:project/environments` https://gitlab.kitware.com/help/api/environments.md#create-a-new-environment

src/api/projects/deployments.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99
//! These endpoints are used for querying deployments.
1010
1111
mod delete;
12+
mod edit;
1213

1314
pub use self::delete::DeleteDeployment;
1415
pub use self::delete::DeleteDeploymentBuilder;
1516
pub use self::delete::DeleteDeploymentBuilderError;
17+
18+
pub use self::edit::DeploymentStatus;
19+
pub use self::edit::EditDeployment;
20+
pub use self::edit::EditDeploymentBuilder;
21+
pub use self::edit::EditDeploymentBuilderError;
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4+
// option. This file may not be copied, modified, or distributed
5+
// except according to those terms.
6+
7+
use derive_builder::Builder;
8+
9+
use crate::api::common::NameOrId;
10+
use crate::api::endpoint_prelude::*;
11+
use crate::api::ParamValue;
12+
13+
/// The status of a deployment.
14+
#[derive(Debug, Clone, Copy)]
15+
#[non_exhaustive]
16+
pub enum DeploymentStatus {
17+
/// The deployment is running.
18+
Running,
19+
/// The deployment succeeded.
20+
Success,
21+
/// The deployment failed.
22+
Failed,
23+
/// The deployment is canceled.
24+
Canceled,
25+
}
26+
27+
impl DeploymentStatus {
28+
fn as_str(self) -> &'static str {
29+
match self {
30+
Self::Running => "running",
31+
Self::Success => "success",
32+
Self::Failed => "failed",
33+
Self::Canceled => "canceled",
34+
}
35+
}
36+
}
37+
38+
impl ParamValue<'static> for DeploymentStatus {
39+
fn as_value(&self) -> Cow<'static, str> {
40+
self.as_str().into()
41+
}
42+
}
43+
44+
/// Edit a deployment for a project.
45+
#[derive(Debug, Builder, Clone)]
46+
pub struct EditDeployment<'a> {
47+
/// The project to edit a deployment from.
48+
#[builder(setter(into))]
49+
project: NameOrId<'a>,
50+
/// The ID of the deployment to edit.
51+
deployment_id: u64,
52+
/// The status of the deployment.
53+
status: DeploymentStatus,
54+
}
55+
56+
impl<'a> EditDeployment<'a> {
57+
/// Create a builder for the endpoint.
58+
pub fn builder() -> EditDeploymentBuilder<'a> {
59+
EditDeploymentBuilder::default()
60+
}
61+
}
62+
63+
impl<'a> Endpoint for EditDeployment<'a> {
64+
fn method(&self) -> Method {
65+
Method::PUT
66+
}
67+
68+
fn endpoint(&self) -> Cow<'static, str> {
69+
format!(
70+
"projects/{}/deployments/{}",
71+
self.project, self.deployment_id,
72+
)
73+
.into()
74+
}
75+
76+
fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
77+
let mut params = FormParams::default();
78+
79+
params.push("status", self.status);
80+
81+
params.into_body()
82+
}
83+
}
84+
85+
#[cfg(test)]
86+
mod tests {
87+
use http::Method;
88+
89+
use crate::api::projects::deployments::{
90+
DeploymentStatus, EditDeployment, EditDeploymentBuilderError,
91+
};
92+
use crate::api::{self, Query};
93+
use crate::test::client::{ExpectedUrl, SingleTestClient};
94+
95+
#[test]
96+
fn deployment_status_as_str() {
97+
let items = &[
98+
(DeploymentStatus::Running, "running"),
99+
(DeploymentStatus::Success, "success"),
100+
(DeploymentStatus::Failed, "failed"),
101+
(DeploymentStatus::Canceled, "canceled"),
102+
];
103+
104+
for (i, s) in items {
105+
assert_eq!(i.as_str(), *s);
106+
}
107+
}
108+
109+
#[test]
110+
fn project_deployment_id_and_status_are_necessary() {
111+
let err = EditDeployment::builder().build().unwrap_err();
112+
crate::test::assert_missing_field!(err, EditDeploymentBuilderError, "project");
113+
}
114+
115+
#[test]
116+
fn project_is_necessary() {
117+
let err = EditDeployment::builder()
118+
.deployment_id(1)
119+
.status(DeploymentStatus::Failed)
120+
.build()
121+
.unwrap_err();
122+
crate::test::assert_missing_field!(err, EditDeploymentBuilderError, "project");
123+
}
124+
125+
#[test]
126+
fn deployment_id_is_necessary() {
127+
let err = EditDeployment::builder()
128+
.project("project")
129+
.status(DeploymentStatus::Failed)
130+
.build()
131+
.unwrap_err();
132+
crate::test::assert_missing_field!(err, EditDeploymentBuilderError, "deployment_id");
133+
}
134+
135+
#[test]
136+
fn status_is_necessary() {
137+
let err = EditDeployment::builder()
138+
.project("project")
139+
.deployment_id(1)
140+
.build()
141+
.unwrap_err();
142+
crate::test::assert_missing_field!(err, EditDeploymentBuilderError, "status");
143+
}
144+
145+
#[test]
146+
fn sufficient_parameters() {
147+
EditDeployment::builder()
148+
.project("project")
149+
.deployment_id(1)
150+
.status(DeploymentStatus::Success)
151+
.build()
152+
.unwrap();
153+
}
154+
155+
#[test]
156+
fn endpoint() {
157+
let endpoint = ExpectedUrl::builder()
158+
.method(Method::PUT)
159+
.endpoint("projects/simple%2Fproject/deployments/1")
160+
.content_type("application/x-www-form-urlencoded")
161+
.body_str("status=canceled")
162+
.build()
163+
.unwrap();
164+
let client = SingleTestClient::new_raw(endpoint, "");
165+
166+
let endpoint = EditDeployment::builder()
167+
.project("simple/project")
168+
.deployment_id(1)
169+
.status(DeploymentStatus::Canceled)
170+
.build()
171+
.unwrap();
172+
api::ignore(endpoint).query(&client).unwrap();
173+
}
174+
}

0 commit comments

Comments
 (0)