From a7c5fb30d95043306d31ec867966005893a346f8 Mon Sep 17 00:00:00 2001 From: ralph isenmann Date: Fri, 15 Oct 2021 15:01:34 +0200 Subject: [client] Update process of the download for container images - show some info to user what was actually downloaded und what to do with it. --- .../org/openslx/dozmod/util/ContainerUtils.java | 28 +++++++- .../org/openslx/dozmod/util/ContainerWrapper.java | 80 ++++++++++++++++++++++ .../java/org/openslx/dozmod/util/ImageWrapper.java | 25 ++----- 3 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerWrapper.java (limited to 'dozentenmodul') diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerUtils.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerUtils.java index 571b9c44..3d65ea5d 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerUtils.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerUtils.java @@ -10,6 +10,7 @@ import org.kamranzafar.jtar.TarInputStream; import org.openslx.bwlp.thrift.iface.ImageSummaryRead; import org.openslx.bwlp.thrift.iface.LectureSummary; import org.openslx.dozmod.gui.Gui; +import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.gui.helper.I18n; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.model.ContainerDefinition; @@ -18,7 +19,7 @@ import org.openslx.thrifthelper.TConst; import org.openslx.thrifthelper.ThriftManager; import org.openslx.util.ThriftUtil; - +import javax.swing.*; import java.awt.*; import java.io.*; import java.nio.ByteBuffer; @@ -143,4 +144,29 @@ public class ContainerUtils { } return isValid; } + + public static JPanel createDownloadContainerInfo(String imageRepo, String infoText) { + JPanel pnlUserInfo = new JPanel(); + GridManager grid = new GridManager(pnlUserInfo, 1, true); + + JTextArea txtInfoText = new JTextArea(); + txtInfoText.setBorder(BorderFactory.createTitledBorder( + I18n.PAGE_LAYOUT.getString("Info"))); + txtInfoText.setLineWrap(true); + txtInfoText.setWrapStyleWord(true); + txtInfoText.setEditable(false); + txtInfoText.setFocusable(false); + txtInfoText.setOpaque(false); + txtInfoText.setText(infoText); + grid.add(txtInfoText).fill(true,true); + grid.nextRow(); + + JTextField txtUserInfo = new JTextField(); + txtUserInfo.setText(imageRepo); + grid.add(txtUserInfo).fill(true,true); + grid.finish(true); + + return pnlUserInfo; + } + } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerWrapper.java new file mode 100644 index 00000000..d7ce40a7 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ContainerWrapper.java @@ -0,0 +1,80 @@ +package org.openslx.dozmod.util; + +import org.apache.log4j.Logger; +import org.openslx.dozmod.gui.Gui; +import org.openslx.dozmod.gui.helper.MessageType; +import org.openslx.virtualization.configuration.container.ContainerDefinition; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +public class ContainerWrapper { + + private static final Logger LOGGER = Logger.getLogger(ContainerWrapper.class); + + + public static void unwrapContainer(File tmpDiskFile, String imageName, File destDir, + byte[] virtualizerConfig) { + ContainerDefinition conDef = ContainerDefinition.fromByteArray(virtualizerConfig); + String infoText; + try { + switch (conDef.getBuildContextMethod()) { + case FILE: + conDef.saveLocal(destDir); + showImageMessageInfo(destDir.getPath(), + "Dieses Image wird durch ein Dockerfile gebaut. Wechseln Sie in das Verzeichnis und bauen Sie das Image lokal (docker build)."); + + break; + case GIT_REPOSITORY: + Files.delete(tmpDiskFile.toPath()); + Files.delete(destDir.toPath()); + + showImageMessageInfo(conDef.getContainerMeta().getBuildContextUrl(), + "Dieses Image wird durch ein öffentliches Git-Repository gebaut. Das Image kann mit dem angezeigten Link lokal gebaut werden (docker build), zudem können die Image-Quellen über diesen betrachtet werden."); + break; + case IMAGE_REPO: + Files.delete(tmpDiskFile.toPath()); + Files.delete(destDir.toPath()); + + showImageMessageInfo( + conDef.getContainerMeta().getImageRepo(), + "Dieses Image ist lediglich eine Referenz auf ein öffentliches Image. Das Image kann mittels des angezeigten Links gepullt werden." + ); + break; + case DOCKER_TAR: + File destImage = new File(destDir.getAbsolutePath(), + VmWrapper.generateFilename(imageName, "tar")); + if (destImage.exists()) + Files.delete(destImage.toPath()); + Files.move(tmpDiskFile.toPath(),destImage.toPath()); + break; + } + + if (tmpDiskFile.exists()) + Files.delete(tmpDiskFile.toPath()); + } catch (IOException e) { + Gui.asyncMessageBox("Konnte temporäre Download Datei nicht löschen", MessageType.WARNING, + LOGGER, e); + } + } + + private static void showImageMessageInfo(String imageSourceUrl, String infoText) { + Gui.asyncExec(new Runnable() { + @Override public void run() { + Object oldDimension = UIManager.get("OptionPane.minimumSize"); + UIManager.put("OptionPane.minimumSize",new Dimension(400,200)); + JOptionPane.showMessageDialog(null, + ContainerUtils.createDownloadContainerInfo( + imageSourceUrl, + infoText + ), + "Container-Image Info", + JOptionPane.INFORMATION_MESSAGE); + UIManager.put("OptionPane.minimumSize",oldDimension); + } + }); + } +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java index fe884a15..3c3a5f1c 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java @@ -7,22 +7,16 @@ import org.openslx.dozmod.gui.helper.I18n; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.thrifthelper.TConst; import org.openslx.virtualization.configuration.VirtualizationConfigurationException; -import org.openslx.virtualization.configuration.container.ContainerDefinition; import org.openslx.virtualization.disk.DiskImage; import org.openslx.virtualization.disk.DiskImage.ImageFormat; import org.openslx.virtualization.disk.DiskImageException; import java.io.File; import java.io.IOException; -import java.nio.file.Files; /** * This Class handle the unpacking of Images downloaded from * the server individually (VM-Images, Docker-Images (Container Images)). - * - * In case of Container-Images the Image-Blob is not important because it can be recreated with the - * recipe (e.g. dockerfile). - * TODO Do not download the Image-Blob of a Container-Image. */ public class ImageWrapper { @@ -47,20 +41,10 @@ public class ImageWrapper { boolean imageIsCompressed = false; ImageFormat imageFormat = null; - // unwrap each image individually - // TODO In future maybe this is a check to distinguish between VM-Image and Container Image + // unwrap container image individually if (virtualizerId.equals(TConst.VIRT_DOCKER)) { - ContainerDefinition conDef = ContainerDefinition.fromByteArray(virtualizerConfig); - conDef.saveLocal(destDir); - - try { - // delete image file, unused in container Context. - Files.delete(tmpDiskFile.toPath()); - } catch (IOException e) { - Gui.asyncMessageBox("Konnte temporäre Download Datei nicht löschen", MessageType.WARNING, - LOGGER, e); - } + ContainerWrapper.unwrapContainer(tmpDiskFile, imageName, destDir, virtualizerConfig); } else { @@ -73,8 +57,9 @@ public class ImageWrapper { } if (imageIsCompressed && imageFormat != ImageFormat.QCOW2) { - Gui.asyncMessageBox(I18n.THRIFT.getString("ThriftActions.Message.warning.diskImageCompressed", - imageName, Branding.getServiceFAQWebsite()), MessageType.WARNING, null, null); + Gui.asyncMessageBox( + I18n.THRIFT.getString("ThriftActions.Message.warning.diskImageCompressed", imageName, + Branding.getServiceFAQWebsite()), MessageType.WARNING, null, null); } File destImage = new File(destDir.getAbsolutePath(), VmWrapper.generateFilename(imageName, ext)); destImage.delete(); -- cgit v1.2.3-55-g7522