This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit e7997e72a94604eae11398f7bba9970c0a3618f8
Author: zan-mateusz <[email protected]>
AuthorDate: Wed Jul 14 15:16:53 2021 +0100

    change to import api to use byte array instead of location string
---
 .../org/apache/brooklyn/rest/api/ServerApi.java    |  6 ++--
 .../brooklyn/rest/resources/ServerResource.java    | 36 ++++++++++++++++++----
 2 files changed, 33 insertions(+), 9 deletions(-)

diff --git 
a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ServerApi.java 
b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ServerApi.java
index 04b1275..c6038fa 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ServerApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ServerApi.java
@@ -171,13 +171,13 @@ public interface ServerApi {
                 + "using LOCAL as master and REMOTE for other notes")
         @QueryParam("origin") @DefaultValue("AUTO") String origin);
 
-    // TODO would be nice to allow setting, as a means to recover / control 
more easily than messing with persistent stores
+
     @POST
     @Path("/ha/persist/import")
     @ApiOperation(value = "Imports a persistence export to a file-based store, 
moving catalog items, locations and managed applications (merged with the 
current persistence).")
     public Response importPersistenceData(
-        @ApiParam(name = "persistenceExportLocation", value = "location of 
persistence to import", required = true)
-        @FormParam("persistenceExportLocation") String 
persistenceExportLocation);
+        @ApiParam(name = "persistenceStateData", value = "Archived data", 
required = true)
+        @FormParam("persistenceStateData") byte[] persistenceStateData);
 
 
     // TODO /ha/persist/backup set of endpoints, to list and retrieve specific 
backups
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
index a4f724d..26d4c2f 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
@@ -22,6 +22,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -29,6 +31,7 @@ import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.zip.ZipFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
@@ -75,6 +78,7 @@ import org.apache.brooklyn.rest.util.WebResourceUtils;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.core.file.ArchiveBuilder;
+import org.apache.brooklyn.util.core.file.ArchiveUtils;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.exceptions.ReferenceWithError;
@@ -86,6 +90,8 @@ import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.CountdownTimer;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -538,17 +544,35 @@ public class ServerResource extends 
AbstractBrooklynRestResource implements Serv
     }
 
     @Override
-    public Response importPersistenceData(String persistenceExportLocation) {
+    public Response importPersistenceData(byte[] persistenceStateData) {
         try {
-            File persistenceLocation = new File(persistenceExportLocation);
-            if (!persistenceLocation.isDirectory()){
-                throw WebResourceUtils.badRequest("Invalid persistence 
directory - %s does not exist or is not a directory", 
persistenceExportLocation);
-            }
-
             // set up temporary management context using the persistence to be 
imported
             BrooklynProperties brooklynPropertiesWithExportPersistenceDir = 
BrooklynProperties.Factory.builderDefault().build();
+
+            // save the temp persistence in same location with /tmp/ added
+            String persistenceExportLocation;
+            if 
(!brooklynPropertiesWithExportPersistenceDir.getConfig("amp.persistence.dir").equals("")
 && 
!(brooklynPropertiesWithExportPersistenceDir.getConfig("amp.persistence.dir") 
== null)){
+                persistenceExportLocation = (String) 
brooklynPropertiesWithExportPersistenceDir.getConfig("amp.persistence.dir") + 
"/persistence-imports/import-" + Time.makeDateSimpleStampString() + ".zip";
+            }
+            else {
+                throw WebResourceUtils.serverError("Error. Current persistence 
location could not be read from brooklyn properties");
+            }
             
brooklynPropertiesWithExportPersistenceDir.put("amp.persistence.dir",persistenceExportLocation);
 
+            // write to zip
+            File zipFile = new File(persistenceExportLocation);
+            FileUtils.writeByteArrayToFile(zipFile, persistenceStateData);
+
+            // extract to dir
+            try {
+                ArchiveUtils.extractZip(new 
ZipFile(persistenceExportLocation),zipFile.getParent() + "/");
+                File persistenceLocation = new File(zipFile.getParent() + 
"/persistence-state-export/");
+
+            } catch (Exception e) {
+                log.info("Import Persistence Data - Path passed is not a zip 
file");
+            }
+
+            // read back into temp mgmt context
             LocalManagementContext tempMgmt = new 
LocalManagementContext(brooklynPropertiesWithExportPersistenceDir);
             PersistenceObjectStore tempPersistenceStore = 
BrooklynPersistenceUtils.newPersistenceObjectStore(tempMgmt,null, 
persistenceExportLocation);
             
tempPersistenceStore.prepareForSharedUse(PersistMode.REBIND,HighAvailabilityMode.AUTO);

Reply via email to