/blueocean-bitbucket-pipeline/src/main/java/io/jenkins/blueocean/blueocean_bitbucket_pipeline/server/BitbucketServerEndpointContainer.java

https://github.com/jenkinsci/blueocean-plugin · Java · 122 lines · 103 code · 13 blank · 6 comment · 9 complexity · 660e7563e622497e3e605f774f450dca MD5 · raw file

  1. package io.jenkins.blueocean.blueocean_bitbucket_pipeline.server;
  2. import com.cloudbees.jenkins.plugins.bitbucket.endpoints.AbstractBitbucketEndpoint;
  3. import com.cloudbees.jenkins.plugins.bitbucket.endpoints.BitbucketEndpointConfiguration;
  4. import com.google.common.base.Function;
  5. import com.google.common.collect.Iterators;
  6. import hudson.model.Item;
  7. import hudson.model.User;
  8. import hudson.security.ACL;
  9. import hudson.security.ACLContext;
  10. import io.jenkins.blueocean.blueocean_bitbucket_pipeline.Messages;
  11. import io.jenkins.blueocean.commons.ErrorMessage;
  12. import io.jenkins.blueocean.commons.ServiceException;
  13. import io.jenkins.blueocean.rest.Reachable;
  14. import io.jenkins.blueocean.rest.hal.Link;
  15. import io.jenkins.blueocean.rest.impl.pipeline.scm.ScmServerEndpoint;
  16. import io.jenkins.blueocean.rest.impl.pipeline.scm.ScmServerEndpointContainer;
  17. import jenkins.model.Jenkins;
  18. import net.sf.json.JSONObject;
  19. import org.apache.commons.codec.digest.DigestUtils;
  20. import org.apache.commons.lang.StringUtils;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import java.util.Iterator;
  24. import java.util.LinkedList;
  25. import java.util.List;
  26. /**
  27. * @author Vivek Pandey
  28. */
  29. public class BitbucketServerEndpointContainer extends ScmServerEndpointContainer {
  30. private static final Logger LOGGER = LoggerFactory.getLogger(BitbucketServerEndpointContainer.class);
  31. private final Link self;
  32. public BitbucketServerEndpointContainer(Reachable parent) {
  33. this.self = parent.getLink().rel("servers");
  34. }
  35. @Override
  36. public Link getLink() {
  37. return self;
  38. }
  39. @Override
  40. public ScmServerEndpoint create(JSONObject request) {
  41. try {
  42. Jenkins.get().checkPermission(Item.CREATE);
  43. } catch (Exception e) {
  44. throw new ServiceException.ForbiddenException("User does not have permission to create repository", e);
  45. }
  46. List<ErrorMessage.Error> errors = new LinkedList<>();
  47. // Validate name
  48. final String name = (String) request.get(ScmServerEndpoint.NAME);
  49. if(StringUtils.isBlank(name)){
  50. errors.add(new ErrorMessage.Error(ScmServerEndpoint.NAME, ErrorMessage.Error.ErrorCodes.MISSING.toString(), ScmServerEndpoint.NAME + " is required"));
  51. }
  52. String url = (String) request.get(ScmServerEndpoint.API_URL);
  53. final BitbucketEndpointConfiguration endpointConfiguration = BitbucketEndpointConfiguration.get();
  54. if(StringUtils.isBlank(url)){
  55. errors.add(new ErrorMessage.Error(ScmServerEndpoint.API_URL, ErrorMessage.Error.ErrorCodes.MISSING.toString(), ScmServerEndpoint.API_URL + " is required"));
  56. }else {
  57. try {
  58. String version = BitbucketServerApi.getVersion(url);
  59. if (!BitbucketServerApi.isSupportedVersion(version)) {
  60. errors.add(new ErrorMessage.Error(BitbucketServerEndpoint.API_URL, ErrorMessage.Error.ErrorCodes.INVALID.toString(),
  61. Messages.bbserver_version_validation_error(
  62. version, BitbucketServerApi.MINIMUM_SUPPORTED_VERSION)));
  63. } else {
  64. //validate presence of endpoint with same name
  65. url = BitbucketEndpointConfiguration.normalizeServerUrl(url);
  66. for (AbstractBitbucketEndpoint endpoint : endpointConfiguration.getEndpoints()) {
  67. if (url.equals(endpoint.getServerUrl())) {
  68. errors.add(new ErrorMessage.Error(ScmServerEndpoint.API_URL, ErrorMessage.Error.ErrorCodes.ALREADY_EXISTS.toString(), ScmServerEndpoint.API_URL + " already exists"));
  69. break;
  70. }
  71. }
  72. }
  73. } catch (ServiceException e) {
  74. errors.add(new ErrorMessage.Error(BitbucketServerEndpoint.API_URL, ErrorMessage.Error.ErrorCodes.INVALID.toString(), StringUtils.isBlank(e.getMessage()) ? "Invalid URL" : e.getMessage()));
  75. }
  76. }
  77. if(!errors.isEmpty()){
  78. throw new ServiceException.BadRequestException(new ErrorMessage(400, "Failed to create Bitbucket server endpoint").addAll(errors));
  79. }
  80. final com.cloudbees.jenkins.plugins.bitbucket.endpoints.BitbucketServerEndpoint endpoint = new com.cloudbees.jenkins.plugins.bitbucket.endpoints.BitbucketServerEndpoint(name, url, false, null);
  81. try (ACLContext ctx = ACL.as(ACL.SYSTEM)) {
  82. // We need to escalate privilege to add user defined endpoint to
  83. endpointConfiguration.addEndpoint(endpoint);
  84. }
  85. return new BitbucketServerEndpoint(endpoint, this);
  86. }
  87. @Override
  88. public ScmServerEndpoint get(String id) {
  89. for(AbstractBitbucketEndpoint endpoint: BitbucketEndpointConfiguration.get().getEndpoints()){
  90. if(id.equals(DigestUtils.sha256Hex(endpoint.getServerUrl()))){
  91. return new BitbucketServerEndpoint(endpoint, this);
  92. }
  93. }
  94. return null;
  95. }
  96. @Override
  97. public Iterator<ScmServerEndpoint> iterator() {
  98. BitbucketEndpointConfiguration endpointConfiguration = BitbucketEndpointConfiguration.get();
  99. Iterator<com.cloudbees.jenkins.plugins.bitbucket.endpoints.BitbucketServerEndpoint> serverEndpoints = Iterators
  100. .filter(endpointConfiguration.getEndpoints().iterator(),
  101. com.cloudbees.jenkins.plugins.bitbucket.endpoints.BitbucketServerEndpoint.class);
  102. return Iterators.transform(serverEndpoints, new Function<AbstractBitbucketEndpoint, ScmServerEndpoint>() {
  103. @Override
  104. public ScmServerEndpoint apply(AbstractBitbucketEndpoint input) {
  105. return new BitbucketServerEndpoint(input, BitbucketServerEndpointContainer.this);
  106. }
  107. });
  108. }
  109. }