PageRenderTime 27ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/bamboo/plugins/confdeploy/upload/DefaultUploadClient.java

https://bitbucket.org/atlassianlabs/bamboo-continuous-plugin-deployment
Java | 221 lines | 167 code | 35 blank | 19 comment | 20 complexity | d91c25348c7440ca6d97dbe894fb1ce2 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugins.confdeploy.upload;
  2. import com.atlassian.bamboo.build.logger.BuildLogger;
  3. import com.atlassian.bamboo.plugins.confdeploy.Failure;
  4. import com.atlassian.bamboo.plugins.confdeploy.Result;
  5. import com.atlassian.bamboo.plugins.confdeploy.config.TaskConfiguration;
  6. import com.atlassian.bamboo.plugins.confdeploy.upload.behaviour.PollingRequestBehaviour;
  7. import com.atlassian.bamboo.plugins.confdeploy.upload.behaviour.RequestBehaviour;
  8. import com.atlassian.bamboo.plugins.confdeploy.upload.http.HttpClientWrapper;
  9. import com.atlassian.bamboo.task.TaskException;
  10. import com.atlassian.fugue.Either;
  11. import com.atlassian.util.concurrent.Nullable;
  12. import com.atlassian.util.concurrent.Timeout;
  13. import org.apache.http.client.methods.HttpUriRequest;
  14. import org.json.JSONObject;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17. import java.util.concurrent.TimeUnit;
  18. /**
  19. * {@inheritDoc}
  20. */
  21. class DefaultUploadClient implements UploadClient
  22. {
  23. private final RequestBehaviour loginStrategy;
  24. @Nullable private final RequestBehaviour permissionCheckStrategy;
  25. @Nullable private final RequestBehaviour webSudoStrategy;
  26. private final RequestBehaviour upmTokenStrategy;
  27. private final RequestBehaviour pluginUploadStrategy;
  28. private final PollingRequestBehaviour uploadSuccessCheckStrategy;
  29. @Nullable private final RequestBehaviour upmSelfUpdateStrategy;
  30. @Nullable private final PollingRequestBehaviour upmSelfUpdateCheckStrategy;
  31. private final HttpClientWrapper client;
  32. private final BuildLogger buildLogger;
  33. /**
  34. * Construct using {@link UploadClientFactory}.
  35. *
  36. */
  37. DefaultUploadClient(final RequestBehaviour loginStrategy,
  38. @Nullable final RequestBehaviour permissionCheckStrategy,
  39. @Nullable final RequestBehaviour webSudoStrategy,
  40. final RequestBehaviour upmTokenStrategy, final RequestBehaviour pluginUploadStrategy,
  41. final PollingRequestBehaviour uploadSuccessCheckStrategy, @Nullable final RequestBehaviour upmSelfUpdateStrategy,
  42. @Nullable final PollingRequestBehaviour upmSelfUpdateCheckStrategy,
  43. final BuildLogger buildLogger, final HttpClientWrapper client)
  44. {
  45. this.loginStrategy = loginStrategy;
  46. this.permissionCheckStrategy = permissionCheckStrategy;
  47. this.webSudoStrategy = webSudoStrategy;
  48. this.upmTokenStrategy = upmTokenStrategy;
  49. this.pluginUploadStrategy = pluginUploadStrategy;
  50. this.uploadSuccessCheckStrategy = uploadSuccessCheckStrategy;
  51. this.upmSelfUpdateStrategy = upmSelfUpdateStrategy;
  52. this.upmSelfUpdateCheckStrategy = upmSelfUpdateCheckStrategy;
  53. this.buildLogger = buildLogger;
  54. this.client = client;
  55. }
  56. @Override
  57. public Result deploy(final TaskConfiguration taskConfiguration) throws TaskException
  58. {
  59. Map<String, Object> requestContext = new HashMap<String, Object>();
  60. // Login
  61. Result loginResult = executeRequest(loginStrategy, taskConfiguration, requestContext);
  62. if (!loginResult.isSuccess())
  63. return loginResult;
  64. // Permission check (may be null if not supported by product type)
  65. if (permissionCheckStrategy != null)
  66. {
  67. Result permissionCheckResult = executeRequest(permissionCheckStrategy, taskConfiguration, requestContext);
  68. if (!permissionCheckResult.isSuccess())
  69. return permissionCheckResult;
  70. }
  71. // WebSudo (may be null if WebSudo is not supported by the target host)
  72. if (webSudoStrategy != null)
  73. {
  74. Result webSudoResult = executeRequest(webSudoStrategy, taskConfiguration, requestContext);
  75. if (!webSudoResult.isSuccess())
  76. return webSudoResult;
  77. }
  78. // Get UPM XSRF Token
  79. Result getTokenResult = executeRequest(upmTokenStrategy, taskConfiguration, requestContext);
  80. if (!getTokenResult.isSuccess())
  81. return getTokenResult;
  82. String upmToken = (String)getTokenResult.getContext();
  83. requestContext.put("upmToken", upmToken);
  84. // Plugin upload
  85. Result uploadResult = executeRequest(pluginUploadStrategy, taskConfiguration, requestContext);
  86. if (!uploadResult.isSuccess())
  87. return uploadResult;
  88. JSONObject uploadResponse = (JSONObject)uploadResult.getContext();
  89. requestContext.put("responseEntity", uploadResponse);
  90. // Poll for success.
  91. Result pollResult = executePollingRequest(uploadSuccessCheckStrategy, taskConfiguration, requestContext, Timeout.getMillisTimeout(taskConfiguration.getPluginInstallationTimeout(), TimeUnit.SECONDS));
  92. if (!pollResult.isSuccess())
  93. return pollResult;
  94. // Installing UPM through UPM is a bit more complicated. It has to be special-cased as a result.
  95. // (may be null if this is not the UPM jar)
  96. if (upmSelfUpdateStrategy != null && upmSelfUpdateCheckStrategy != null)
  97. {
  98. // Terrible, but the self-update plugin doesn't appear to always be ready by the time we call it.
  99. try
  100. {
  101. Thread.sleep(1000);
  102. }
  103. catch (InterruptedException e)
  104. {
  105. throw new TaskException("Error while waiting to trigger UPM self-update", e);
  106. }
  107. buildLogger.addBuildLogEntry(String.format("Contacting %s to trigger UPM self-update.", taskConfiguration.getRemoteBaseUrl()));
  108. Result triggerSelfUpdateResult = executeRequest(upmSelfUpdateStrategy, taskConfiguration, requestContext);
  109. if (!triggerSelfUpdateResult.isSuccess())
  110. return triggerSelfUpdateResult;
  111. Result selfUpdateResult = executePollingRequest(upmSelfUpdateCheckStrategy, taskConfiguration, requestContext, Timeout.getMillisTimeout(taskConfiguration.getPluginInstallationTimeout(), TimeUnit.SECONDS));
  112. if (!selfUpdateResult.isSuccess())
  113. return selfUpdateResult;
  114. }
  115. return Result.success("Plugin upload completed successfully. Nice going, mate!");
  116. }
  117. private Result executePollingRequest(final PollingRequestBehaviour requestBehaviour, final TaskConfiguration taskConfiguration, final Map<String, Object> requestContext, final Timeout timeout)
  118. {
  119. Either<HttpUriRequest, Failure> maybeRequest = requestBehaviour.getRequest(taskConfiguration, requestContext);
  120. if (maybeRequest.isRight())
  121. {
  122. // Request construction failed.
  123. Failure failure = maybeRequest.right().get();
  124. buildLogger.addErrorLogEntry(failure.getMessage(), failure.getContext() instanceof Exception ? (Exception)failure.getContext() : null);
  125. }
  126. Result pollOutcome = client.poll(maybeRequest.left().get(), requestBehaviour, timeout);
  127. if (!pollOutcome.isSuccess())
  128. {
  129. buildLogger.addErrorLogEntry(pollOutcome.getMessage(), pollOutcome.getContext() instanceof Exception ? (Exception)pollOutcome.getContext() : null);
  130. }
  131. else
  132. {
  133. buildLogger.addBuildLogEntry(pollOutcome.getMessage());
  134. }
  135. return pollOutcome;
  136. }
  137. private Result executeRequest(final RequestBehaviour requestBehaviour, final TaskConfiguration taskConfiguration, final Map<String, Object> requestContext)
  138. {
  139. Either<HttpUriRequest, Failure> maybeRequest = requestBehaviour.getRequest(taskConfiguration, requestContext);
  140. if (maybeRequest.isRight())
  141. {
  142. // Request construction failed.
  143. Failure failure = maybeRequest.right().get();
  144. buildLogger.addErrorLogEntry(failure.getMessage(), failure.getContext() instanceof Exception ? (Exception)failure.getContext() : null);
  145. }
  146. Result responseOutcome = client.execute(maybeRequest.left().get(), requestBehaviour);
  147. if (!responseOutcome.isSuccess())
  148. {
  149. buildLogger.addErrorLogEntry(responseOutcome.getMessage(), responseOutcome.getContext() instanceof Exception ? (Exception)responseOutcome.getContext() : null);
  150. }
  151. else
  152. {
  153. buildLogger.addBuildLogEntry(responseOutcome.getMessage());
  154. }
  155. return responseOutcome;
  156. }
  157. // These getters are basically just for unit-testing.
  158. public RequestBehaviour getLoginStrategy()
  159. {
  160. return this.loginStrategy;
  161. }
  162. public RequestBehaviour getWebSudoStrategy()
  163. {
  164. return this.webSudoStrategy;
  165. }
  166. public RequestBehaviour getUpmTokenStrategy()
  167. {
  168. return this.upmTokenStrategy;
  169. }
  170. public RequestBehaviour getPluginUploadStrategy()
  171. {
  172. return this.pluginUploadStrategy;
  173. }
  174. public PollingRequestBehaviour getUploadSuccessCheckStrategy()
  175. {
  176. return this.uploadSuccessCheckStrategy;
  177. }
  178. public RequestBehaviour getUpmSelfUpdateStrategy()
  179. {
  180. return this.upmSelfUpdateStrategy;
  181. }
  182. public PollingRequestBehaviour getUpmSelfUpdateCheckStrategy()
  183. {
  184. return this.upmSelfUpdateCheckStrategy;
  185. }
  186. }