Skip to content
Permalink
Browse files

ServerInfo request processor does not delegate serialization to exten…

…sions #5653
  • Loading branch information...
maheshp committed Jan 3, 2019
1 parent e264530 commit 143054f55270911d2a87433d5ac3a2e3dbad765e
Showing with 91 additions and 301 deletions.
  1. +0 −5 ...o-plugin-access/src/main/java/com/thoughtworks/go/plugin/access/analytics/AnalyticsExtension.java
  2. +0 −5 .../go-plugin-access/src/main/java/com/thoughtworks/go/plugin/access/artifact/ArtifactExtension.java
  3. +3 −7 ...-access/src/main/java/com/thoughtworks/go/plugin/access/authorization/AuthorizationExtension.java
  4. +0 −16 ...ra/go-plugin-access/src/main/java/com/thoughtworks/go/plugin/access/common/AbstractExtension.java
  5. +0 −2 ...gin-access/src/main/java/com/thoughtworks/go/plugin/access/common/settings/GoPluginExtension.java
  6. +0 −5 ...plugin-access/src/main/java/com/thoughtworks/go/plugin/access/configrepo/ConfigRepoExtension.java
  7. +3 −8 ...-plugin-access/src/main/java/com/thoughtworks/go/plugin/access/elastic/ElasticAgentExtension.java
  8. +5 −9 ...in-access/src/main/java/com/thoughtworks/go/plugin/access/notification/NotificationExtension.java
  9. +0 −5 ...s/src/main/java/com/thoughtworks/go/plugin/access/packagematerial/PackageRepositoryExtension.java
  10. +0 −5 ...go-plugin-access/src/main/java/com/thoughtworks/go/plugin/access/pluggabletask/TaskExtension.java
  11. +0 −5 plugin-infra/go-plugin-access/src/main/java/com/thoughtworks/go/plugin/access/scm/SCMExtension.java
  12. +0 −8 ...ugin-access/src/test/java/com/thoughtworks/go/plugin/access/analytics/AnalyticsExtensionTest.java
  13. +0 −8 ...in-access/src/test/java/com/thoughtworks/go/plugin/access/artifact/ArtifactExtensionTestBase.java
  14. +0 −11 ...ess/src/test/java/com/thoughtworks/go/plugin/access/authorization/AuthorizationExtensionTest.java
  15. +0 −8 ...in-access/src/test/java/com/thoughtworks/go/plugin/access/configrepo/ConfigRepoExtensionTest.java
  16. +0 −16 ...gin-access/src/test/java/com/thoughtworks/go/plugin/access/elastic/ElasticAgentExtensionTest.java
  17. +0 −13 .../src/test/java/com/thoughtworks/go/plugin/access/notification/NotificationExtensionTestForV1.java
  18. +0 −12 .../src/test/java/com/thoughtworks/go/plugin/access/notification/NotificationExtensionTestForV2.java
  19. +0 −13 .../src/test/java/com/thoughtworks/go/plugin/access/notification/NotificationExtensionTestForV3.java
  20. +0 −13 .../src/test/java/com/thoughtworks/go/plugin/access/notification/NotificationExtensionTestForV4.java
  21. +0 −8 ...c/test/java/com/thoughtworks/go/plugin/access/packagematerial/PackageRepositoryExtensionTest.java
  22. +0 −8 ...lugin-access/src/test/java/com/thoughtworks/go/plugin/access/pluggabletask/TaskExtensionTest.java
  23. +0 −8 ...-infra/go-plugin-access/src/test/java/com/thoughtworks/go/plugin/access/scm/SCMExtensionTest.java
  24. +0 −12 ...-plugin-access/test/com/thoughtworks/go/plugin/access/elastic/ElasticAgentExtensionTestForV1.java
  25. +0 −12 ...-plugin-access/test/com/thoughtworks/go/plugin/access/elastic/ElasticAgentExtensionTestForV2.java
  26. +5 −3 .../go/server/service/plugins/processor}/serverinfo/MessageHandlerForServerInfoRequestProcessor.java
  27. +12 −20 ...a/com/thoughtworks/go/server/service/plugins/processor/serverinfo/ServerInfoRequestProcessor.java
  28. +14 −7 ...rver/service/plugins/processor/serverinfo/v1}/MessageHandlerForServerInfoRequestProcessor1_0.java
  29. +9 −49 ...m/thoughtworks/go/server/service/plugins/processor/serverinfo/ServerInfoRequestProcessorTest.java
  30. +40 −0 ...r/service/plugins/processor/serverinfo/v1/MessageHandlerForServerInfoRequestProcessor1_0Test.java
@@ -115,9 +115,4 @@ private AnalyticsMessageConverter getMessageConverter(String version) {
private String getCurrentStaticAssetsPath(String pluginId) {
return AnalyticsMetadataStore.instance().getPluginInfo(pluginId).getStaticAssetsPath();
}

@Override
public String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl) {
throw new UnsupportedOperationException("Fetch Server Info is not supported by Analytics endpoint.");
}
}
@@ -213,9 +213,4 @@ public String requestBody(String resolvedExtensionVersion) {
public String pluginSettingsJSON(String pluginId, Map<String, String> pluginSettings) {
throw new UnsupportedOperationException("Fetch Plugin Settings is not supported by Artifact endpoint.");
}

@Override
public String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl) {
throw new UnsupportedOperationException("Fetch Server Info is not supported by Artifact endpoint.");
}
}
@@ -23,8 +23,6 @@
import com.thoughtworks.go.plugin.access.authorization.models.AuthenticationResponse;
import com.thoughtworks.go.plugin.access.authorization.models.User;
import com.thoughtworks.go.plugin.access.common.AbstractExtension;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor1_0;
import com.thoughtworks.go.plugin.access.common.settings.PluginSettingsJsonMessageHandler;
import com.thoughtworks.go.plugin.access.common.settings.PluginSettingsJsonMessageHandler1_0;
import com.thoughtworks.go.plugin.api.response.validation.ValidationResult;
@@ -49,15 +47,13 @@
@Autowired
public AuthorizationExtension(PluginManager pluginManager) {
super(pluginManager, new PluginRequestHelper(pluginManager, SUPPORTED_VERSIONS, AUTHORIZATION_EXTENSION), AUTHORIZATION_EXTENSION);
addHandler(AuthorizationMessageConverterV1.VERSION, new PluginSettingsJsonMessageHandler1_0(), new AuthorizationMessageConverterV1(),
new MessageHandlerForServerInfoRequestProcessor1_0());
addHandler(AuthorizationMessageConverterV1.VERSION, new PluginSettingsJsonMessageHandler1_0(), new AuthorizationMessageConverterV1()
);
}

private void addHandler(String version, PluginSettingsJsonMessageHandler messageHandler, AuthorizationMessageConverterV1 extensionHandler,
MessageHandlerForServerInfoRequestProcessor messageHandlerForServerInfoRequestProcessor) {
private void addHandler(String version, PluginSettingsJsonMessageHandler messageHandler, AuthorizationMessageConverterV1 extensionHandler) {
registerHandler(version, messageHandler);
messageHandlerMap.put(version, extensionHandler);
registerMessageHandlerForServerInfoRequestProcessor(version, messageHandlerForServerInfoRequestProcessor);
}

public com.thoughtworks.go.plugin.domain.authorization.Capabilities getCapabilities(String pluginId) {
@@ -18,7 +18,6 @@

import com.thoughtworks.go.plugin.access.DefaultPluginInteractionCallback;
import com.thoughtworks.go.plugin.access.PluginRequestHelper;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor;
import com.thoughtworks.go.plugin.access.common.settings.*;
import com.thoughtworks.go.plugin.api.response.validation.ValidationResult;
import com.thoughtworks.go.plugin.infra.PluginManager;
@@ -33,7 +32,6 @@
private final String extensionName;
protected Map<String, PluginSettingsJsonMessageHandler> pluginSettingsMessageHandlerMap = new HashMap<>();
private Map<String, MessageHandlerForPluginSettingsRequestProcessor> messageHandlersForPluginSettingsRequestProcessor = new HashMap<>();
private Map<String, MessageHandlerForServerInfoRequestProcessor> messageHandlersForServerInfoRequestProcessor = new HashMap<>();

protected AbstractExtension(PluginManager pluginManager, PluginRequestHelper pluginRequestHelper, String extensionName) {
this.pluginManager = pluginManager;
@@ -93,12 +91,6 @@ public String pluginSettingsJSON(String pluginId, Map<String, String> pluginSett
return messageHandlerForPluginSettingsRequestProcessor(resolvedExtensionVersion).pluginSettingsToJSON(pluginSettings);
}

@Override
public String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl) {
String resolvedExtensionVersion = pluginManager.resolveExtensionVersion(pluginId, extensionName, goSupportedVersions());
return messageHandlerForServerInfoRequestProcessor(resolvedExtensionVersion).serverInfoToJSON(serverId, siteUrl, secureSiteUrl);
}

@Override
public ValidationResult validatePluginSettings(String pluginId, final PluginSettingsConfiguration configuration) {
return pluginRequestHelper.submitRequest(pluginId, PluginSettingsConstants.REQUEST_VALIDATE_PLUGIN_SETTINGS, new DefaultPluginInteractionCallback<ValidationResult>() {
@@ -118,18 +110,10 @@ protected void registerMessageHandlerForPluginSettingsRequestProcessor(String ap
messageHandlersForPluginSettingsRequestProcessor.put(apiVersion, handler);
}

protected void registerMessageHandlerForServerInfoRequestProcessor(String apiVersion, MessageHandlerForServerInfoRequestProcessor handler) {
messageHandlersForServerInfoRequestProcessor.put(apiVersion, handler);
}

protected MessageHandlerForPluginSettingsRequestProcessor messageHandlerForPluginSettingsRequestProcessor(String pluginVersion) {
return messageHandlersForPluginSettingsRequestProcessor.get(pluginVersion);
}

protected MessageHandlerForServerInfoRequestProcessor messageHandlerForServerInfoRequestProcessor(String pluginVersion) {
return messageHandlersForServerInfoRequestProcessor.get(pluginVersion);
}

protected abstract List<String> goSupportedVersions();

public void registerHandler(String version, PluginSettingsJsonMessageHandler handler) {
@@ -35,6 +35,4 @@
void notifyPluginSettingsChange(String pluginId, Map<String, String> pluginSettings);

String pluginSettingsJSON(String pluginId, Map<String, String> pluginSettings);

String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl);
}
@@ -150,9 +150,4 @@ public boolean isConfigRepoPlugin(String pluginId) {
protected List<String> goSupportedVersions() {
return goSupportedVersions;
}

@Override
public String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl) {
throw new UnsupportedOperationException("Fetch Server Info is not supported by ConfigRepo endpoint.");
}
}
@@ -19,8 +19,6 @@
import com.thoughtworks.go.domain.JobIdentifier;
import com.thoughtworks.go.plugin.access.PluginRequestHelper;
import com.thoughtworks.go.plugin.access.common.AbstractExtension;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor1_0;
import com.thoughtworks.go.plugin.access.common.settings.MessageHandlerForPluginSettingsRequestProcessor;
import com.thoughtworks.go.plugin.access.common.settings.MessageHandlerForPluginSettingsRequestProcessor1_0;
import com.thoughtworks.go.plugin.access.common.settings.PluginSettingsJsonMessageHandler1_0;
@@ -56,16 +54,13 @@ public ElasticAgentExtension(PluginManager pluginManager) {
registerHandler(ElasticAgentExtensionV4.VERSION, new PluginSettingsJsonMessageHandler1_0());

final MessageHandlerForPluginSettingsRequestProcessor1_0 pluginSettingsRequestProcessor = new MessageHandlerForPluginSettingsRequestProcessor1_0();
final MessageHandlerForServerInfoRequestProcessor1_0 serverInfoRequestProcessor = new MessageHandlerForServerInfoRequestProcessor1_0();

registerProcessor(ElasticAgentExtensionV3.VERSION, pluginSettingsRequestProcessor, serverInfoRequestProcessor);
registerProcessor(ElasticAgentExtensionV4.VERSION, pluginSettingsRequestProcessor, serverInfoRequestProcessor);
registerProcessor(ElasticAgentExtensionV3.VERSION, pluginSettingsRequestProcessor);
registerProcessor(ElasticAgentExtensionV4.VERSION, pluginSettingsRequestProcessor);
}

private void registerProcessor(String version, MessageHandlerForPluginSettingsRequestProcessor pluginSettingsRequestProcessor,
MessageHandlerForServerInfoRequestProcessor serverInfoRequestProcessor) {
private void registerProcessor(String version, MessageHandlerForPluginSettingsRequestProcessor pluginSettingsRequestProcessor) {
registerMessageHandlerForPluginSettingsRequestProcessor(version, pluginSettingsRequestProcessor);
registerMessageHandlerForServerInfoRequestProcessor(version, serverInfoRequestProcessor);
}

public void createAgent(String pluginId, final String autoRegisterKey, final String environment, final Map<String, String> configuration, JobIdentifier jobIdentifier) {
@@ -19,8 +19,6 @@
import com.thoughtworks.go.plugin.access.DefaultPluginInteractionCallback;
import com.thoughtworks.go.plugin.access.PluginRequestHelper;
import com.thoughtworks.go.plugin.access.common.AbstractExtension;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor1_0;
import com.thoughtworks.go.plugin.access.common.settings.*;
import com.thoughtworks.go.plugin.access.notification.v1.JsonMessageHandler1_0;
import com.thoughtworks.go.plugin.access.notification.v2.JsonMessageHandler2_0;
@@ -55,25 +53,23 @@ public NotificationExtension(PluginManager pluginManager) {
super(pluginManager, new PluginRequestHelper(pluginManager, goSupportedVersions, NOTIFICATION_EXTENSION), NOTIFICATION_EXTENSION);

registerHandlers("1.0", new PluginSettingsJsonMessageHandler1_0(), new JsonMessageHandler1_0(),
new MessageHandlerForPluginSettingsRequestProcessor1_0(), new MessageHandlerForServerInfoRequestProcessor1_0());
new MessageHandlerForPluginSettingsRequestProcessor1_0());

registerHandlers("2.0", new PluginSettingsJsonMessageHandler1_0(), new JsonMessageHandler2_0(),
new MessageHandlerForPluginSettingsRequestProcessor1_0(), new MessageHandlerForServerInfoRequestProcessor1_0());
new MessageHandlerForPluginSettingsRequestProcessor1_0());

registerHandlers("3.0", new PluginSettingsJsonMessageHandler2_0(), new JsonMessageHandler3_0(),
new MessageHandlerForPluginSettingsRequestProcessor1_0(), new MessageHandlerForServerInfoRequestProcessor1_0());
new MessageHandlerForPluginSettingsRequestProcessor1_0());

registerHandlers("4.0", new PluginSettingsJsonMessageHandler2_0(), new JsonMessageHandler4_0(),
new MessageHandlerForPluginSettingsRequestProcessor1_0(), new MessageHandlerForServerInfoRequestProcessor1_0());
new MessageHandlerForPluginSettingsRequestProcessor1_0());
}

private void registerHandlers(String version, PluginSettingsJsonMessageHandler pluginSettingsJsonMessageHandler, JsonMessageHandler jsonMessageHandler,
MessageHandlerForPluginSettingsRequestProcessor messageHandlerForPluginSettingsRequestProcessor,
MessageHandlerForServerInfoRequestProcessor messageHandlerForServerInfoRequestProcessor) {
MessageHandlerForPluginSettingsRequestProcessor messageHandlerForPluginSettingsRequestProcessor) {
registerHandler(version, pluginSettingsJsonMessageHandler);
messageHandlerMap.put(version, jsonMessageHandler);
registerMessageHandlerForPluginSettingsRequestProcessor(version, messageHandlerForPluginSettingsRequestProcessor);
registerMessageHandlerForServerInfoRequestProcessor(version, messageHandlerForServerInfoRequestProcessor);
}

public List<String> getNotificationsOfInterestFor(String pluginId) {
@@ -173,9 +173,4 @@ JsonMessageHandler messageConverter(String resolvedExtensionVersion) {
protected List<String> goSupportedVersions() {
return goSupportedVersions;
}

@Override
public String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl) {
throw new UnsupportedOperationException("Fetch Server Info is not supported by PackageRepository endpoint.");
}
}
@@ -78,9 +78,4 @@ public String pluginSettingsJSON(String pluginId, Map<String, String> pluginSett
protected List<String> goSupportedVersions() {
return supportedVersions;
}

@Override
public String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl) {
throw new UnsupportedOperationException("Fetch Server Info is not supported by Task endpoint.");
}
}
@@ -161,9 +161,4 @@ public Result onSuccess(String responseBody, String resolvedExtensionVersion) {
protected List<String> goSupportedVersions() {
return goSupportedVersions;
}

@Override
public String serverInfoJSON(String pluginId, String serverId, String siteUrl, String secureSiteUrl) {
throw new UnsupportedOperationException("Fetch Server Info is not supported by SCM endpoint.");
}
}
@@ -155,14 +155,6 @@ public void shouldSerializePluginSettingsToJSON() {
assertThat(pluginSettingsJSON, Is.is("{\"key1\":\"val1\",\"key2\":\"val2\"}"));
}

@Test
public void shouldNotExposeServerInfo() {
thrown.expect(UnsupportedOperationException.class);
thrown.expectMessage("Fetch Server Info is not supported by Analytics endpoint.");

analyticsExtension.serverInfoJSON("plugin_id", "server_id", "site_url", "secure_site_url");
}

private void assertRequest(GoPluginApiRequest goPluginApiRequest, String extensionName, String version, String requestName, String requestBody) {
assertThat(goPluginApiRequest.extension(), Is.is(extensionName));
assertThat(goPluginApiRequest.extensionVersion(), Is.is(version));
@@ -309,14 +309,6 @@ public void shouldNotExposePluginSettings() {
artifactExtension.pluginSettingsJSON("plugin_id", Collections.EMPTY_MAP);
}

@Test
public void shouldNotExposeServerInfo() {
thrown.expect(UnsupportedOperationException.class);
thrown.expectMessage("Fetch Server Info is not supported by Artifact endpoint.");

artifactExtension.serverInfoJSON("plugin_id", "server_id", "site_url", "secure_site_url");
}

@Test
public void shouldGetCapabilities() {
when(pluginManager.submitTo(eq(PLUGIN_ID), eq(ARTIFACT_EXTENSION), requestArgumentCaptor.capture())).thenReturn(DefaultGoPluginApiResponse.success("{}"));
@@ -335,17 +335,6 @@ public void shouldNotSupportFetchingPluginSettings() throws Exception {
authorizationExtension.pluginSettingsJSON("plugin_id", Collections.emptyMap());
}

@Test
public void shouldSerializeServerInfoToJSON() throws Exception {
String pluginId = "plugin_id";

when(pluginManager.resolveExtensionVersion(pluginId, AUTHORIZATION_EXTENSION, authorizationExtension.goSupportedVersions())).thenReturn("1.0");

String serverInfoJSON = authorizationExtension.serverInfoJSON(pluginId, "x12adf", "http://my.build.com", "https://my.build.com");

Assert.assertThat(serverInfoJSON, Is.is("{\"server_id\":\"x12adf\",\"site_url\":\"http://my.build.com\",\"secure_site_url\":\"https://my.build.com\"}"));
}

private void assertRequest(GoPluginApiRequest goPluginApiRequest, String extensionName, String version, String requestName, String requestBody) {
Assert.assertThat(goPluginApiRequest.extension(), Is.is(extensionName));
Assert.assertThat(goPluginApiRequest.extensionVersion(), Is.is(version));
@@ -143,14 +143,6 @@ public void shouldSerializePluginSettingsToJSON() throws Exception {
assertThat(pluginSettingsJSON, CoreMatchers.is("{\"key1\":\"val1\",\"key2\":\"val2\"}"));
}

@Test
public void shouldNotExposeServerInfo() throws Exception {
thrown.expect(UnsupportedOperationException.class);
thrown.expectMessage("Fetch Server Info is not supported by ConfigRepo endpoint.");

extension.serverInfoJSON("plugin_id", "server_id", "site_url", "secure_site_url");
}

private void assertRequest(GoPluginApiRequest goPluginApiRequest, String extensionName, String version, String requestName, String requestBody) {
assertThat(goPluginApiRequest.extension(), is(extensionName));
assertThat(goPluginApiRequest.extensionVersion(), is(version));
@@ -18,8 +18,6 @@

import com.thoughtworks.go.domain.JobIdentifier;
import com.thoughtworks.go.plugin.access.common.AbstractExtension;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor;
import com.thoughtworks.go.plugin.access.common.serverinfo.MessageHandlerForServerInfoRequestProcessor1_0;
import com.thoughtworks.go.plugin.access.common.settings.MessageHandlerForPluginSettingsRequestProcessor;
import com.thoughtworks.go.plugin.access.common.settings.MessageHandlerForPluginSettingsRequestProcessor1_0;
import com.thoughtworks.go.plugin.api.request.GoPluginApiRequest;
@@ -55,7 +53,6 @@
protected GoPluginDescriptor descriptor;
protected ElasticAgentExtension extension;


@Before
public void setUp() throws Exception {
pluginManager = mock(PluginManager.class);
@@ -108,14 +105,6 @@ public void shouldHaveMessageHandlerForPluginSettingsRequestProcessorForAllExten
instanceOf(MessageHandlerForPluginSettingsRequestProcessor1_0.class));
}

@Test
public void shouldHaveMessageHandlerForServerInfoRequestProcessorForAllExtensionVersions() {
final ElasticAgentExtensionExposingHandlers extension = new ElasticAgentExtensionExposingHandlers(pluginManager);

assertThat(extension.messageHandlerForServerInfoRequestProcessor("3.0"),
instanceOf(MessageHandlerForServerInfoRequestProcessor1_0.class));
}

@Test
public void shouldMakeJobCompletionCall() {
when(pluginManager.resolveExtensionVersion(PLUGIN_ID, ELASTIC_AGENT_EXTENSION, SUPPORTED_VERSIONS)).thenReturn("4.0");
@@ -139,11 +128,6 @@ public MessageHandlerForPluginSettingsRequestProcessor messageHandlerForPluginSe
return super.messageHandlerForPluginSettingsRequestProcessor(pluginVersion);
}

@Override
public MessageHandlerForServerInfoRequestProcessor messageHandlerForServerInfoRequestProcessor(String pluginVersion) {
return super.messageHandlerForServerInfoRequestProcessor(pluginVersion);
}

@Override
public VersionedElasticAgentExtension getVersionedElasticAgentExtension(String pluginId) {
return super.getVersionedElasticAgentExtension(pluginId);
@@ -66,17 +66,4 @@ public void shouldSerializePluginSettingsToJSON() throws Exception {

assertThat(pluginSettingsJSON, is("{\"k1\":\"value1\",\"k2\":\"value2\"}"));
}

@Test
public void shouldSerializeServerInfoToJSON() throws Exception {
String pluginId = "plugin_id";

NotificationExtension notificationExtension = new NotificationExtension(pluginManager);

when(pluginManager.resolveExtensionVersion(pluginId, PluginConstants.NOTIFICATION_EXTENSION, notificationExtension.goSupportedVersions())).thenReturn("1.0");

String serverInfoJSON = notificationExtension.serverInfoJSON(pluginId, "x12adf", "http://my.build.com", "https://my.build.com");

assertThat(serverInfoJSON, Is.is("{\"server_id\":\"x12adf\",\"site_url\":\"http://my.build.com\",\"secure_site_url\":\"https://my.build.com\"}"));
}
}

0 comments on commit 143054f

Please sign in to comment.
You can’t perform that action at this time.