Compare commits

...

4 Commits

Author SHA1 Message Date
Ivan Meredith caf45e10c3 UX-473: Fix Pipeline search 2016-06-17 12:56:23 +12:00
Ivan Meredith 9b942df9df UX-473: Add documentation 2016-06-17 12:01:33 +12:00
Ivan Meredith c35a625e49 UX-473: Add tests 2016-06-17 12:01:33 +12:00
Ivan Meredith 15ac59a74f UX-473: Initial organization impl 2016-06-17 12:01:29 +12:00
19 changed files with 349 additions and 78 deletions

View File

@ -78,6 +78,11 @@
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>jenkins-organizations</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Test plugins -->
<!-- Random test failing bug due to an assertion in pipeline plugin. See https://github.com/jenkinsci/pipeline-stage-step-plugin/pull/1 -->
<dependency>

View File

@ -24,9 +24,10 @@ import java.util.Map;
*/
public class AbstractRunImpl<T extends Run> extends BlueRun {
protected final T run;
public AbstractRunImpl(T run) {
final PipelineImpl pipeline;
public AbstractRunImpl(PipelineImpl pipeline, T run) {
this.run = run;
this.pipeline = pipeline;
}
//TODO: It serializes jenkins Run model children, enable this code after fixing it
@ -47,7 +48,7 @@ public class AbstractRunImpl<T extends Run> extends BlueRun {
@Override
public String getOrganization() {
return OrganizationImpl.INSTANCE.getName();
return pipeline.organization.getName();
}
@Override
@ -155,14 +156,14 @@ public class AbstractRunImpl<T extends Run> extends BlueRun {
return null; // default
}
protected static BlueRun getBlueRun(Run r){
protected static BlueRun getBlueRun(PipelineImpl pipeline, Run r){
//TODO: We need to take care several other job types
if (r instanceof FreeStyleBuild) {
return new FreeStyleRunImpl((FreeStyleBuild)r);
return new FreeStyleRunImpl(pipeline, (FreeStyleBuild)r);
}else if(r instanceof WorkflowRun){
return new PipelineRunImpl((WorkflowRun)r);
return new PipelineRunImpl(pipeline, (WorkflowRun)r);
}else{
return new AbstractRunImpl<>(r);
return new AbstractRunImpl<>(pipeline, r);
}
}

View File

@ -24,7 +24,7 @@ public class BranchContainerImpl extends BluePipelineContainer {
public BluePipeline get(String name) {
Job job = pipeline.mbp.getBranch(name);
if(job != null){
return new BranchImpl(job);
return new BranchImpl(pipeline.organization,job);
}
return null;
}
@ -34,7 +34,7 @@ public class BranchContainerImpl extends BluePipelineContainer {
List<BluePipeline> branches = new ArrayList<>();
Collection<Job> jobs = pipeline.mbp.getAllJobs();
for(Job j: jobs){
branches.add(new BranchImpl(j));
branches.add(new BranchImpl(pipeline.organization, j));
}
return branches.iterator();
}

View File

@ -20,8 +20,8 @@ public class BranchImpl extends PipelineImpl {
private static final String PULL_REQUEST = "pullRequest";
public BranchImpl(Job job) {
super(job);
public BranchImpl(OrganizationImpl organization, Job job) {
super(organization, job);
}
@Exported(name = PULL_REQUEST, inline = true)

View File

@ -15,8 +15,8 @@ import java.util.Map;
* @author Vivek Pandey
*/
public class FreeStyleRunImpl extends AbstractRunImpl<FreeStyleBuild> {
public FreeStyleRunImpl(FreeStyleBuild run) {
super(run);
public FreeStyleRunImpl(PipelineImpl pipeline, FreeStyleBuild run) {
super(pipeline, run);
}
@Override

View File

@ -28,14 +28,16 @@ import java.util.List;
*/
public class MultiBranchPipelineImpl extends BlueMultiBranchPipeline {
/*package*/ final MultiBranchProject mbp;
final OrganizationImpl organization;
public MultiBranchPipelineImpl(MultiBranchProject mbp) {
public MultiBranchPipelineImpl(OrganizationImpl organization, MultiBranchProject mbp) {
this.mbp = mbp;
this.organization = organization;
}
@Override
public String getOrganization() {
return OrganizationImpl.INSTANCE.getName();
return organization.getName();
}

View File

@ -1,15 +1,22 @@
package io.jenkins.blueocean.service.embedded.rest;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import hudson.Extension;
import hudson.model.Item;
import io.jenkins.blueocean.commons.ServiceException;
import io.jenkins.blueocean.rest.model.BlueOrganization;
import io.jenkins.blueocean.rest.model.BlueOrganizationContainer;
import io.jenkins.blueocean.rest.model.BlueUserContainer;
import jenkins.model.Jenkins;
import org.jenkinsci.plugins.jenkinsorganizations.JenkinsOrganizationFolder;
import org.kohsuke.stapler.json.JsonBody;
import javax.inject.Inject;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* {@link BlueOrganizationContainer} for the embedded use
@ -21,19 +28,72 @@ import java.util.Iterator;
public class OrganizationContainerImpl extends BlueOrganizationContainer {
@Override
public BlueOrganization get(String name) {
validateOrganization(name);
return OrganizationImpl.INSTANCE;
if(name.equals(Jenkins.getInstance().getDisplayName().toLowerCase())) {
return new OrganizationImpl();
}
Item item = Jenkins.getInstance().getItem(name);
if(item instanceof JenkinsOrganizationFolder) {
return new OrganizationImpl((JenkinsOrganizationFolder) item);
}
return null;
}
@Override
public Iterator<BlueOrganization> iterator() {
return Collections.<BlueOrganization>singleton(OrganizationImpl.INSTANCE).iterator();
List<JenkinsOrganizationFolder> orgs = Jenkins.getInstance().getAllItems(JenkinsOrganizationFolder.class);
List<BlueOrganization> ret = Lists.newArrayList();
for (JenkinsOrganizationFolder org : orgs) {
ret.add(new OrganizationImpl(org));
}
ret.add(new OrganizationImpl());
return ret.iterator();
}
protected void validateOrganization(String organization){
if (!organization.equals(Jenkins.getActiveInstance().getDisplayName().toLowerCase())) {
throw new ServiceException.UnprocessableEntityException(String.format("Organization %s not found",
organization));
/**
* Creates a new JenkinsOrganizationFolder.
*
* If trying to create something that already exists, it will return success.
*
* @param createRequest
* @return
*/
@Override
public BlueOrganizationCreateResponse createOrganization(@JsonBody BlueOrganizationCreateRequest createRequest) {
Jenkins j = Jenkins.getInstance();
if(createRequest == null || Strings.isNullOrEmpty(createRequest.getName())) {
throw new ServiceException.BadRequestExpception("Organization name missing.");
}
// Check to see if the organization makes the catch-all org.
if(createRequest.getName().equals(j.getDisplayName().toLowerCase())) {
return new BlueOrganizationCreateResponse(j.getDisplayName().toLowerCase());
}
// Check to see if it already exists
Item item = j.getItem(createRequest.getName());
if(item != null) {
if(item instanceof JenkinsOrganizationFolder) {
// Org already exists, nothing needed to be done.
return new BlueOrganizationCreateResponse(createRequest.getName());
} else {
throw new ServiceException.BadRequestExpception("A non-organization item with this name already exists. Please rename it and try again.");
}
}
// Create the folder.
try {
j.createProject(JenkinsOrganizationFolder.class, createRequest.getName());
} catch (IOException e) {
throw new ServiceException.UnexpectedErrorException("Error created organization", e);
}
return new BlueOrganizationCreateResponse(createRequest.getName());
}
}

View File

@ -7,6 +7,7 @@ import io.jenkins.blueocean.rest.model.BlueOrganization;
import io.jenkins.blueocean.rest.model.BluePipelineContainer;
import io.jenkins.blueocean.rest.model.BlueUserContainer;
import jenkins.model.Jenkins;
import org.jenkinsci.plugins.jenkinsorganizations.JenkinsOrganizationFolder;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.verb.DELETE;
import org.kohsuke.stapler.verb.PUT;
@ -23,24 +24,30 @@ import java.io.IOException;
public class OrganizationImpl extends BlueOrganization {
UserContainerImpl users;
/**
* In embedded mode, there's only one organization
*/
public static final OrganizationImpl INSTANCE = new OrganizationImpl();
JenkinsOrganizationFolder organizationFolder;
private OrganizationImpl() {
public OrganizationImpl(JenkinsOrganizationFolder organizationFolder) {
this.organizationFolder = organizationFolder;
users = new UserContainerImpl();
}
public OrganizationImpl() {
this(null);
}
/**
* In embedded mode, there's only one organization
*/
public String getName() {
return Jenkins.getInstance().getDisplayName().toLowerCase();
if(organizationFolder != null) {
return organizationFolder.getDisplayName().toLowerCase();
} else {
return Jenkins.getInstance().getDisplayName().toLowerCase();
}
}
@Override
public BluePipelineContainer getPipelines() {
return new PipelineContainerImpl();
return new PipelineContainerImpl(this);
}
@WebMethod(name="") @DELETE
@ -68,4 +75,19 @@ public class OrganizationImpl extends BlueOrganization {
public BlueUserContainer getUsers() {
return users;
}
/**
* Deletes this organization.
*/
@Override
public void deleteOrganiztion() {
if(getName().equals(Jenkins.getInstance().getDisplayName().toLowerCase())) {
throw new ServiceException.BadRequestExpception("Default organization can not be deleted");
}
try {
organizationFolder.delete();
} catch (Throwable t) {
throw new ServiceException.UnexpectedErrorException("Could not remove organization", t);
}
}
}

View File

@ -1,5 +1,6 @@
package io.jenkins.blueocean.service.embedded.rest;
import com.google.common.collect.Lists;
import hudson.model.BuildableItem;
import hudson.model.Item;
import hudson.model.ItemGroup;
@ -10,6 +11,7 @@ import io.jenkins.blueocean.rest.model.BluePipeline;
import io.jenkins.blueocean.rest.model.BluePipelineContainer;
import jenkins.branch.MultiBranchProject;
import jenkins.model.Jenkins;
import org.jenkinsci.plugins.jenkinsorganizations.JenkinsOrganizationFolder;
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
import java.util.ArrayList;
@ -21,23 +23,34 @@ import java.util.List;
* @author Vivek Pandey
*/
public class PipelineContainerImpl extends BluePipelineContainer {
private final OrganizationImpl organization;
private final ItemGroup itemGroup;
public PipelineContainerImpl(ItemGroup itemGroup) {
this.itemGroup = itemGroup;
public PipelineContainerImpl(OrganizationImpl organization) {
this.organization = organization;
this.itemGroup = null;
}
public PipelineContainerImpl() {
this.itemGroup = null;
public PipelineContainerImpl(OrganizationImpl organization, ItemGroup itemGroup) {
this.organization = organization;
this.itemGroup = itemGroup;
}
@Override
public BluePipeline get(String name) {
Item item;
if(itemGroup == null){
item = Jenkins.getActiveInstance().getItem(name);
}else{
if(itemGroup != null) {
item = itemGroup.getItem(name);
} else if(organization.organizationFolder != null) {
item = organization.organizationFolder.getItem(name);
} else {
item = Jenkins.getInstance().getItem(name);
}
if(item instanceof JenkinsOrganizationFolder) {
throw new ServiceException.NotImplementedException(("This si an organization folder"));
}
if(item == null){
@ -46,12 +59,12 @@ public class PipelineContainerImpl extends BluePipelineContainer {
if (item instanceof BuildableItem) {
if (item instanceof MultiBranchProject) {
return new MultiBranchPipelineImpl((MultiBranchProject) item);
return new MultiBranchPipelineImpl(organization, (MultiBranchProject) item);
} else if (!isMultiBranchProjectJob((BuildableItem) item) && item instanceof Job) {
return new PipelineImpl((Job) item);
return new PipelineImpl(organization, (Job) item);
}
} else if (item instanceof ItemGroup) {
return new PipelineFolderImpl((ItemGroup) item);
return new PipelineFolderImpl(organization, (ItemGroup) item);
}
// TODO: I'm going to turn this into a decorator annotation
@ -61,10 +74,22 @@ public class PipelineContainerImpl extends BluePipelineContainer {
@Override
@SuppressWarnings("unchecked")
public Iterator<BluePipeline> iterator() {
if(itemGroup != null){
return getPipelines(itemGroup.getItems());
if(itemGroup != null) {
return getPipelines(organization, itemGroup.getItems());
} else if (organization.organizationFolder != null) {
return getPipelines(organization, organization.organizationFolder.getItems());
}else{
return getPipelines(Jenkins.getActiveInstance().getItems(TopLevelItem.class));
List<TopLevelItem> items = Jenkins.getInstance().getItems(TopLevelItem.class);
List<TopLevelItem> filteredItems = Lists.newArrayList();
for (TopLevelItem item : items) {
if(item instanceof JenkinsOrganizationFolder) {
continue;
} else {
filteredItems.add(item);
}
}
return getPipelines(organization, filteredItems);
}
}
@ -72,18 +97,54 @@ public class PipelineContainerImpl extends BluePipelineContainer {
return item instanceof WorkflowJob && item.getParent() instanceof MultiBranchProject;
}
protected static Iterator<BluePipeline> getPipelines(Collection<? extends Item> items){
protected static Iterator<BluePipeline> getPipelines(OrganizationImpl organization, Collection<? extends Item> items){
List<BluePipeline> pipelines = new ArrayList<>();
for (Item item : items) {
if(item instanceof MultiBranchProject){
pipelines.add(new MultiBranchPipelineImpl((MultiBranchProject) item));
}else if(item instanceof BuildableItem && !isMultiBranchProjectJob((BuildableItem) item)
&& item instanceof Job){
pipelines.add(new PipelineImpl((Job) item));
}else if(item instanceof ItemGroup){
pipelines.add(new PipelineFolderImpl((ItemGroup) item));
BluePipeline pipeline = getPipelineFromItem(item, organization);
if(pipeline != null) {
pipelines.add(pipeline);
}
}
return pipelines.iterator();
}
protected static Iterator<BluePipeline> getPipelinesCalcOrg(Collection<? extends Item> items){
List<BluePipeline> pipelines = new ArrayList<>();
for (Item item : items) {
OrganizationImpl organization = getParentOrg(item.getParent());
BluePipeline pipeline = getPipelineFromItem(item, organization);
if(pipeline != null) {
pipelines.add(pipeline);
}
}
return pipelines.iterator();
}
protected static BluePipeline getPipelineFromItem(Item item, OrganizationImpl organization) {
if(item instanceof MultiBranchProject){
return new MultiBranchPipelineImpl(organization, (MultiBranchProject) item);
}else if(item instanceof BuildableItem && !isMultiBranchProjectJob((BuildableItem) item)
&& item instanceof Job){
return new PipelineImpl(organization, (Job) item);
}else if(item instanceof ItemGroup){
return new PipelineFolderImpl(organization, (ItemGroup) item);
}
return null;
}
protected static OrganizationImpl getParentOrg(ItemGroup group) {
if(group == Jenkins.getInstance()) {
return new OrganizationImpl();
}
if(group instanceof JenkinsOrganizationFolder) {
return new OrganizationImpl((JenkinsOrganizationFolder)group);
}
if(group instanceof Item) {
return getParentOrg(((Item) group).getParent());
} else {
throw new ServiceException.UnexpectedErrorException("Can't find parent org");
}
}
}

View File

@ -15,15 +15,17 @@ public class PipelineFolderImpl extends BluePipelineFolder {
private final ItemGroup folder;
private final BluePipelineContainer container;
final OrganizationImpl organization;
public PipelineFolderImpl(ItemGroup folder) {
public PipelineFolderImpl(OrganizationImpl organization, ItemGroup folder) {
this.folder = folder;
this.container = new PipelineContainerImpl(folder);
this.container = new PipelineContainerImpl(organization, folder);
this.organization = organization;
}
@Override
public String getOrganization() {
return OrganizationImpl.INSTANCE.getName();
return organization.getName();
}
@Override
@ -43,7 +45,7 @@ public class PipelineFolderImpl extends BluePipelineFolder {
@Override
public BluePipelineContainer getPipelines() {
return new PipelineContainerImpl(folder);
return new PipelineContainerImpl(organization, folder);
}
@Override

View File

@ -26,23 +26,22 @@ import static io.jenkins.blueocean.service.embedded.rest.PipelineContainerImpl.i
*/
public class PipelineImpl extends BluePipeline {
/*package*/ final Job job;
final OrganizationImpl organization;
private final ItemGroup folder;
protected PipelineImpl(ItemGroup folder, Job job) {
protected PipelineImpl(OrganizationImpl organization, ItemGroup folder, Job job) {
this.organization = organization;
this.job = job;
this.folder = folder;
}
public PipelineImpl(ItemGroup folder) {
this(folder, null);
public PipelineImpl(OrganizationImpl organization, Job job) {
this(organization, null, job);
}
public PipelineImpl(Job job) {
this(null, job);
}
@Override
public String getOrganization() {
return OrganizationImpl.INSTANCE.getName();
return organization.getName();
}
@Override
@ -65,7 +64,7 @@ public class PipelineImpl extends BluePipeline {
if(job.getLastBuild() == null){
return null;
}
return AbstractRunImpl.getBlueRun(job.getLastBuild());
return AbstractRunImpl.getBlueRun(this, job.getLastBuild());
}
@Override
@ -123,19 +122,19 @@ public class PipelineImpl extends BluePipeline {
public BluePipeline getPipelines(String name){
assert folder != null;
return getPipelines(folder, name);
return getPipelines(organization, folder, name);
}
protected static BluePipeline getPipelines(ItemGroup itemGroup, String name){
protected static BluePipeline getPipelines(OrganizationImpl organization, ItemGroup itemGroup, String name){
Item item = itemGroup.getItem(name);
if(item instanceof BuildableItem){
if(item instanceof MultiBranchProject){
return new MultiBranchPipelineImpl((MultiBranchProject) item);
return new MultiBranchPipelineImpl(organization, (MultiBranchProject) item);
}else if(!isMultiBranchProjectJob((BuildableItem) item) && item instanceof Job){
return new PipelineImpl(itemGroup, (Job) item);
return new PipelineImpl(organization,itemGroup, (Job) item);
}
}else if(item instanceof ItemGroup){
return new PipelineImpl((ItemGroup) item, null);
return new PipelineImpl(organization,(ItemGroup) item, null);
}
throw new ServiceException.NotFoundException(String.format("Pipeline %s not found", name));
}

View File

@ -16,8 +16,8 @@ import java.util.Map;
* @author Vivek Pandey
*/
public class PipelineRunImpl extends AbstractRunImpl<WorkflowRun> {
public PipelineRunImpl(WorkflowRun run) {
super(run);
public PipelineRunImpl(PipelineImpl pipeline, WorkflowRun run) {
super(pipeline, run);
}
@Override

View File

@ -27,7 +27,7 @@ public class PipelineSearch extends OmniSearch<BluePipeline>{
@Override
public Pageable<BluePipeline> search(Query q) {
final Iterator<BluePipeline> pipelineIterator = PipelineContainerImpl
.getPipelines(Jenkins.getActiveInstance().getAllItems(Item.class));
.getPipelinesCalcOrg(Jenkins.getActiveInstance().getAllItems(Item.class));
final List<BluePipeline> pipelines = new ArrayList<>();
String pipeline = q.param(getType());
if(pipeline == null) {

View File

@ -16,9 +16,9 @@ import java.util.Iterator;
public class RunContainerImpl extends BlueRunContainer {
private final Job job;
private final BluePipeline pipeline;
private final PipelineImpl pipeline;
public RunContainerImpl(@Nonnull BluePipeline pipeline, @Nonnull Job job) {
public RunContainerImpl(@Nonnull PipelineImpl pipeline, @Nonnull Job job) {
this.job = job;
this.pipeline = pipeline;
}
@ -44,12 +44,12 @@ public class RunContainerImpl extends BlueRunContainer {
} else {
run = runList.getLastBuild();
}
return AbstractRunImpl.getBlueRun(run);
return AbstractRunImpl.getBlueRun(pipeline, run);
}
@Override
public Iterator<BlueRun> iterator() {
return RunSearch.findRuns(job).iterator();
return RunSearch.findRuns(pipeline,job).iterator();
}
@Override

View File

@ -33,7 +33,7 @@ public class RunSearch extends OmniSearch<BlueRun> {
@Override
public Pageable<BlueRun> search(Query q) {
/*
String pipeline = q.param("pipeline", false);
boolean latestOnly = q.param("latestOnly", Boolean.class);
@ -57,9 +57,13 @@ public class RunSearch extends OmniSearch<BlueRun> {
return Pageables.empty();
}
return Pageables.wrap(findRuns(null));
*/
return null;
}
public static Iterable<BlueRun> findRuns(Job pipeline){
public static Iterable<BlueRun> findRuns(PipelineImpl pipe, Job pipeline){
final List<BlueRun> runs = new ArrayList<>();
Iterable<Job> pipelines;
if(pipeline != null){
@ -71,14 +75,17 @@ public class RunSearch extends OmniSearch<BlueRun> {
RunList<? extends Run> runList = p.getBuilds();
for (Run r : runList) {
runs.add(AbstractRunImpl.getBlueRun(r));
runs.add(AbstractRunImpl.getBlueRun(pipe,r));
}
}
return runs;
}
private BlueRun getLatestRun(Job job){
/*
if(job != null){
Run r = job.getLastBuild();
if(r != null) {
@ -86,6 +93,8 @@ public class RunSearch extends OmniSearch<BlueRun> {
}
}
return null;
*/
return null;
}
}

View File

@ -1,10 +1,13 @@
package io.jenkins.blueocean.service.embedded;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author Ivan Meredith
@ -21,4 +24,38 @@ public class OrganizationApiTest extends BaseTest {
Assert.assertEquals(users.size(), 1);
Assert.assertEquals(((Map)users.get(0)).get("id"), "alice");
}
@Test
public void createOrganiztion() throws Exception {
Map r = request().post("/organizations/").data(ImmutableMap.of("name", "testOrg")).build(Map.class);
Assert.assertEquals(r.get("name"), "testOrg");
List l = request().get("/organizations/").build(List.class);
Assert.assertEquals(l.size(), 2);
for (Object o : l) {
String name = (String)((Map)o).get("name");
r = request().get("/organizations/" + name + "/").build(Map.class);
Assert.assertEquals(name, r.get("name"));
}
}
@Test
public void deleteOrganization() throws Exception {
Map r = request().post("/organizations/").data(ImmutableMap.of("name", "testOrg")).build(Map.class);
Assert.assertEquals(r.get("name"), "testOrg");
List l = request().get("/organizations/").build(List.class);
Assert.assertEquals(l.size(), 2);
request().delete("/organizations/testOrg/delete").build(String.class);
l = request().get("/organizations/").build(List.class);
Assert.assertEquals(l.size(), 1);
}
}

View File

@ -46,7 +46,12 @@ BlueOcean rest API base URL is:
}
]
$$
## Lists organizations
curl -v -X GET http://localhost:8080/jenkins/blue/rest/organizations/
[{
"name" : "jenkins"
}]
## Get organization details
curl -v -X GET http://localhost:8080/jenkins/blue/rest/organizations/jenkins
@ -55,6 +60,19 @@ $$
"name" : "jenkins"
}
## Creates an organization
curl -H"Content-Type: application/json" -d "{\"name\":\"test\"}" http://localhost:8080/jenkins/blue/rest/organizations/
{
"name" : "test"
}
## Deletes an orgaization
curl -v -X DELETE http://localhost:8080/jenkins/blue/rest/organizations/jenkins/delete
## Get a Pipeline
curl -v -X GET "http://localhost:8080/jenkins/blue/rest/organizations/jenkins/pipelines/pipeline1"

View File

@ -1,6 +1,10 @@
package io.jenkins.blueocean.rest.model;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.json.JsonResponse;
import org.kohsuke.stapler.verb.DELETE;
/**
* API endpoint for an organization that houses all the pipelines.
@ -23,5 +27,12 @@ public abstract class BlueOrganization extends Resource {
*/
public abstract BlueUserContainer getUsers();
/**
* Deletes this organization.
*
* TODO: make the url / note /delete
*/
@DELETE @WebMethod(name = "delete")
public abstract void deleteOrganiztion();
}

View File

@ -2,6 +2,10 @@ package io.jenkins.blueocean.rest.model;
import hudson.ExtensionPoint;
import io.jenkins.blueocean.rest.ApiRoutable;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.json.JsonResponse;
import org.kohsuke.stapler.verb.DELETE;
import org.kohsuke.stapler.verb.POST;
/**
* This is the head of the blue ocean API.
@ -14,4 +18,44 @@ public abstract class BlueOrganizationContainer extends Container<BlueOrganizati
public final String getUrlName() {
return "organizations";
}
/**
* Creates an organization. If organization exists, return success.
*
* @param blueOrganizationCreateRequest Name of organization to be created
* @return Name of the created organization
*/
@POST @WebMethod(name = "") @JsonResponse
public abstract BlueOrganizationCreateResponse createOrganization(BlueOrganizationCreateRequest blueOrganizationCreateRequest);
/**
* Request body wrapper for organization creation request
*/
public static class BlueOrganizationCreateRequest {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* Response body wrapper for organization creation request
*/
public static class BlueOrganizationCreateResponse {
private String name;
public String getName() {
return name;
}
public BlueOrganizationCreateResponse(String name) {
this.name = name;
}
}
}