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 c1c0201ee8d4c65079aa4afadc07fd7c37ae2236
Author: zan-mateusz <mateusz....@cloudsoftcorp.com>
AuthorDate: Fri Jul 16 18:57:52 2021 +0100

    persistence import api changed to take the byte array data rather than 
archive location
---
 .../org/apache/brooklyn/rest/api/ServerApi.java    |  5 ++-
 .../brooklyn/rest/resources/ServerResource.java    | 52 ++++++++--------------
 2 files changed, 21 insertions(+), 36 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 654fce4..2cf820a 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
@@ -18,6 +18,7 @@
  */
 package org.apache.brooklyn.rest.api;
 
+import java.io.InputStream;
 import java.util.Map;
 
 import javax.ws.rs.Consumes;
@@ -181,10 +182,10 @@ public interface ServerApi {
 
     @POST
     @Path("/ha/persist/import")
+    @Consumes
     @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 = "persistenceStateData", value = "Archived data", 
required = true)
-        @FormParam("persistenceStateData") byte[] persistenceStateData);
+        @ApiParam(name = "persistenceData", value = "Archived data", required 
= true) byte[] persistenceData);
 
 
     // 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 403d693..443d928 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
@@ -18,12 +18,9 @@
  */
 package org.apache.brooklyn.rest.resources;
 
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.nio.file.Files;
-import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -66,6 +63,7 @@ import 
org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.mgmt.persist.*;
 import org.apache.brooklyn.core.mgmt.rebind.PersistenceExceptionHandlerImpl;
+import org.apache.brooklyn.core.server.BrooklynServerPaths;
 import org.apache.brooklyn.rest.api.ServerApi;
 import org.apache.brooklyn.rest.domain.ApiError;
 import org.apache.brooklyn.rest.domain.BrooklynFeatureSummary;
@@ -91,7 +89,6 @@ 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;
 
@@ -555,37 +552,22 @@ public class ServerResource extends 
AbstractBrooklynRestResource implements Serv
     }
 
     @Override
-    public Response importPersistenceData(byte[] persistenceStateData) {
+    public Response importPersistenceData(byte[] persistenceData) {
         try {
-            // set up temporary management context using the persistence to be 
imported
-            BrooklynProperties brooklynPropertiesWithExportPersistenceDir = 
BrooklynProperties.Factory.builderDefault().build();
+            // create a temporary archive where persistence data supplied is 
written to
+            File tempZipFile = File.createTempFile("persistence-import",null);
+            Files.write(tempZipFile.toPath(), persistenceData, 
StandardOpenOption.TRUNCATE_EXISTING);
 
-            // 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);
+            // set path where the data is extracted to - saved in the root of 
persistence location
+            // this directory is deleted at end of the method
+            String unzippedPath = 
BrooklynServerPaths.newMainPersistencePathResolver(mgmt()).dir(tempZipFile.getName()).resolve();
 
-            // extract to dir
-            try {
-                ArchiveUtils.extractZip(new 
ZipFile(persistenceExportLocation),zipFile.getParent() + "/");
-                File persistenceLocation = new File(zipFile.getParent() + 
"/persistence-state-export/");
+            // extract to the location specified
+            ArchiveUtils.extractZip(new ZipFile(tempZipFile),unzippedPath);
 
-            } 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);
+            // create a temporary mgmt context and load the persistence data
+            LocalManagementContext tempMgmt = new 
LocalManagementContext(BrooklynProperties.Factory.builderDefault().build());
+            PersistenceObjectStore tempPersistenceStore = 
BrooklynPersistenceUtils.newPersistenceObjectStore(tempMgmt,null, unzippedPath 
+ "/data/");
             
tempPersistenceStore.prepareForSharedUse(PersistMode.REBIND,HighAvailabilityMode.AUTO);
             BrooklynMementoPersisterToObjectStore persister = new 
BrooklynMementoPersisterToObjectStore(
                     tempPersistenceStore, tempMgmt);
@@ -594,6 +576,7 @@ public class ServerResource extends 
AbstractBrooklynRestResource implements Serv
             rebindManager.setPersister(persister, persistenceExceptionHandler);
             rebindManager.forcePersistNow(false, null);
 
+            // create raw memento of persisted state to be imported
             BrooklynMementoRawData newMementoRawData = 
tempMgmt.getRebindManager().retrieveMementoRawData();
 
             // install bundles to active management context
@@ -638,7 +621,8 @@ public class ServerResource extends 
AbstractBrooklynRestResource implements Serv
             tempPersistenceStore.close();
             tempMgmt.terminate();
 
-
+            // delete the dir with the import data
+            FileUtils.deleteDirectory(new File(unzippedPath));
         } catch (Exception e){
             Exceptions.propagateIfFatal(e);
             ApiError.Builder error = 
ApiError.builder().errorCode(Response.Status.BAD_REQUEST);

Reply via email to