From 2ce70fdbfe8a3ef4abb88558b91498fc509e8a94 Mon Sep 17 00:00:00 2001 From: Nicola Ferraro Date: Mon, 20 Nov 2017 17:37:44 +0100 Subject: [PATCH] Fixes #368 by refusing to import a existing extension --- .../handler/extension/ExtensionHandler.java | 12 +++++++++++ .../io/syndesis/runtime/ExtensionsITCase.java | 21 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/rest/rest/src/main/java/io/syndesis/rest/v1beta1/handler/extension/ExtensionHandler.java b/rest/rest/src/main/java/io/syndesis/rest/v1beta1/handler/extension/ExtensionHandler.java index 21e6159640d..1e1148921b8 100644 --- a/rest/rest/src/main/java/io/syndesis/rest/v1beta1/handler/extension/ExtensionHandler.java +++ b/rest/rest/src/main/java/io/syndesis/rest/v1beta1/handler/extension/ExtensionHandler.java @@ -109,11 +109,23 @@ public Extension upload(MultipartFormDataInput dataInput, @QueryParam("updatedId Extension embeddedExtension = extractExtension(fileLocation); if (updatedId != null) { + // Update Extension replacedExtension = getDataManager().fetch(Extension.class, updatedId); if (!replacedExtension.getExtensionId().equals(embeddedExtension.getExtensionId())) { throw new IllegalArgumentException("The uploaded extensionId (" + embeddedExtension.getExtensionId() + ") does not match the existing extensionId (" + replacedExtension.getExtensionId() + ")"); } + } else { + // New import + Set ids = getDataManager().fetchIdsByPropertyValue(Extension.class, + "extensionId", embeddedExtension.getExtensionId(), + "status", Extension.Status.Installed.name()); + + if (!ids.isEmpty()) { + throw new IllegalArgumentException("An extension with the same extensionId (" + embeddedExtension.getExtensionId() + + ") is already installed. Please update the existing extension instead of importing a new one"); + } + } Extension extension = new Extension.Builder() diff --git a/rest/runtime/src/test/java/io/syndesis/runtime/ExtensionsITCase.java b/rest/runtime/src/test/java/io/syndesis/runtime/ExtensionsITCase.java index af155449b18..b03a4145b08 100644 --- a/rest/runtime/src/test/java/io/syndesis/runtime/ExtensionsITCase.java +++ b/rest/runtime/src/test/java/io/syndesis/runtime/ExtensionsITCase.java @@ -110,6 +110,23 @@ public void testUpdateExtensionFailure() throws IOException { Void.class, tokenRule.validToken(), HttpStatus.BAD_REQUEST, multipartHeaders()); } + @Test + public void testReimportExtensionFailure() throws IOException { + ResponseEntity created = post("/api/v1beta1/extensions", multipartBody(extensionData(1)), + Extension.class, tokenRule.validToken(), HttpStatus.OK, multipartHeaders()); + + assertThat(created.getBody().getId().isPresent()); + String id = created.getBody().getId().get(); + + // Install it + post("/api/v1beta1/extensions/" + id + "/install", null, Void.class, + tokenRule.validToken(), HttpStatus.NO_CONTENT); + + // Using same extension without setting extensionId + post("/api/v1beta1/extensions", multipartBody(extensionData(1)), + Void.class, tokenRule.validToken(), HttpStatus.BAD_REQUEST, multipartHeaders()); + } + @Test public void testValidateExtension() throws IOException { // Create one extension @@ -124,7 +141,7 @@ public void testValidateExtension() throws IOException { tokenRule.validToken(), HttpStatus.NO_CONTENT); // Create another extension with same extension-id - ResponseEntity created2 = post("/api/v1beta1/extensions", multipartBody(extensionData(1)), + ResponseEntity created2 = post("/api/v1beta1/extensions?updatedId=" + id1, multipartBody(extensionData(1)), Extension.class, tokenRule.validToken(), HttpStatus.OK, multipartHeaders()); assertThat(created2.getBody().getId().isPresent()); @@ -173,7 +190,7 @@ public void testExtensionActivation() throws IOException { assertThat(got2.getBody().getStatus()).contains(Extension.Status.Installed); // Create another extension with same extension-id - ResponseEntity createdCopy1 = post("/api/v1beta1/extensions", multipartBody(extensionData(1)), + ResponseEntity createdCopy1 = post("/api/v1beta1/extensions?updatedId=" + id1, multipartBody(extensionData(1)), Extension.class, tokenRule.validToken(), HttpStatus.OK, multipartHeaders()); assertThat(createdCopy1.getBody().getId().isPresent());