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);
