diff --git a/gitlab4j-api/src/main/java/org/gitlab4j/api/UserApi.java b/gitlab4j-api/src/main/java/org/gitlab4j/api/UserApi.java index 5ae999f0..90a93f2b 100644 --- a/gitlab4j-api/src/main/java/org/gitlab4j/api/UserApi.java +++ b/gitlab4j-api/src/main/java/org/gitlab4j/api/UserApi.java @@ -13,6 +13,8 @@ import jakarta.ws.rs.core.Response; import org.gitlab4j.api.models.Associations; +import org.gitlab4j.api.models.CreateRunnerParams; +import org.gitlab4j.api.models.CreateRunnerResponse; import org.gitlab4j.api.models.CustomAttribute; import org.gitlab4j.api.models.Email; import org.gitlab4j.api.models.Exists; @@ -1584,4 +1586,18 @@ public boolean exists(String username) throws GitLabApiException { throw new GitLabApiException(e); } } + + /** + * Create a runner linked to the current user. + * + *
GitLab Endpoint: POST /user/runners
+ * + * @param params a CreateRunnerParams instance holding the parameters for the runner creation + * @return creation response, be sure to copy or save the token in the response, the value cannot be retrieved again. + * @throws GitLabApiException + */ + public CreateRunnerResponse createRunner(CreateRunnerParams params) throws GitLabApiException { + Response response = post(Response.Status.OK, new GitLabApiForm(params.getForm()).asMap(), "user", "runners"); + return response.readEntity(CreateRunnerResponse.class); + } } diff --git a/gitlab4j-models/src/main/java/org/gitlab4j/api/models/CreateRunnerParams.java b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/CreateRunnerParams.java new file mode 100644 index 00000000..c4d23a75 --- /dev/null +++ b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/CreateRunnerParams.java @@ -0,0 +1,100 @@ +package org.gitlab4j.api.models; + +import java.io.Serializable; +import java.util.List; + +import org.gitlab4j.api.models.Runner.RunnerType; +import org.gitlab4j.models.GitLabForm; +import org.gitlab4j.models.utils.JacksonJson; + +public class CreateRunnerParams implements Serializable { + private static final long serialVersionUID = 1L; + + private RunnerType runnerType; + private Long groupId; + private Long projectId; + private String description; + private Boolean paused; + private Boolean locked; + private Boolean runUntagged; + private List tagList; + private String accessLevel; + private Integer maximumTimeout; + private String maintenanceNote; + + public GitLabForm getForm() { + + return new GitLabForm() + .withParam("runner_type", runnerType, true) + .withParam("group_id", groupId) + .withParam("project_id", projectId) + .withParam("description", description) + .withParam("paused", paused) + .withParam("locked", locked) + .withParam("run_untagged", runUntagged) + .withParam("tag_list", tagList) + .withParam("access_level", accessLevel) + .withParam("maximum_timeout", maximumTimeout) + .withParam("maintenance_note", maintenanceNote); + } + + public CreateRunnerParams withRunnerType(RunnerType runnerType) { + this.runnerType = runnerType; + return this; + } + + public CreateRunnerParams withGroupId(Long groupId) { + this.groupId = groupId; + return this; + } + + public CreateRunnerParams withProjectId(Long projectId) { + this.projectId = projectId; + return this; + } + + public CreateRunnerParams withDescription(String description) { + this.description = description; + return this; + } + + public CreateRunnerParams withPaused(Boolean paused) { + this.paused = paused; + return this; + } + + public CreateRunnerParams withLocked(Boolean locked) { + this.locked = locked; + return this; + } + + public CreateRunnerParams withRunUntagged(Boolean runUntagged) { + this.runUntagged = runUntagged; + return this; + } + + public CreateRunnerParams withTagList(List tagList) { + this.tagList = tagList; + return this; + } + + public CreateRunnerParams withAccessLevel(String accessLevel) { + this.accessLevel = accessLevel; + return this; + } + + public CreateRunnerParams withMaximumTimeout(Integer maximumTimeout) { + this.maximumTimeout = maximumTimeout; + return this; + } + + public CreateRunnerParams withMaintenanceNote(String maintenanceNote) { + this.maintenanceNote = maintenanceNote; + return this; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/gitlab4j-models/src/main/java/org/gitlab4j/api/models/CreateRunnerResponse.java b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/CreateRunnerResponse.java new file mode 100644 index 00000000..145cf140 --- /dev/null +++ b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/CreateRunnerResponse.java @@ -0,0 +1,43 @@ +package org.gitlab4j.api.models; + +import java.io.Serializable; +import java.util.Date; + +import org.gitlab4j.models.utils.JacksonJson; + +public class CreateRunnerResponse implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + private String token; + private Date tokenExpiresAt; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public Date getTokenExpiresAt() { + return tokenExpiresAt; + } + + public void setTokenExpiresAt(Date tokenExpiresAt) { + this.tokenExpiresAt = tokenExpiresAt; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/gitlab4j-models/src/main/java/org/gitlab4j/api/models/OauthTokenResponse.java b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/OauthTokenResponse.java index a4c1049c..71c23cb0 100644 --- a/gitlab4j-models/src/main/java/org/gitlab4j/api/models/OauthTokenResponse.java +++ b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/OauthTokenResponse.java @@ -2,6 +2,8 @@ import java.io.Serializable; +import org.gitlab4j.models.utils.JacksonJson; + public class OauthTokenResponse implements Serializable { private static final long serialVersionUID = 1L; @@ -50,4 +52,9 @@ public Long getCreatedAt() { public void setCreatedAt(Long createdAt) { this.createdAt = createdAt; } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } } diff --git a/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java b/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java index 0eec2cac..2ceb4fe2 100644 --- a/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java +++ b/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java @@ -111,6 +111,12 @@ public void testBranch() throws Exception { assertTrue(!Branch.isValid(branch)); } + @Test + public void testCreateRunnerResponse() throws Exception { + CreateRunnerResponse r = unmarshalResource(CreateRunnerResponse.class, "created-runner-response.json"); + assertTrue(compareJson(r, "created-runner-response.json")); + } + @Test public void testCreatedChildEpic() throws Exception { CreatedChildEpic childEpic = unmarshalResource(CreatedChildEpic.class, "created-child-epic.json"); diff --git a/gitlab4j-models/src/test/resources/org/gitlab4j/models/created-runner-response.json b/gitlab4j-models/src/test/resources/org/gitlab4j/models/created-runner-response.json new file mode 100644 index 00000000..27a3c55a --- /dev/null +++ b/gitlab4j-models/src/test/resources/org/gitlab4j/models/created-runner-response.json @@ -0,0 +1,4 @@ +{ + "id": 9171, + "token": "abcd1245" +} \ No newline at end of file