summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org
diff options
context:
space:
mode:
authorralph isenmann2020-07-14 10:17:24 +0200
committerralph isenmann2020-09-15 13:27:21 +0200
commite61df0d70c517aca759e668d0f8915242b48424a (patch)
tree6985b6d8d29015a8eaef54c441f3d50973ac5810 /dozentenmodul/src/main/java/org
parentAdd intellij project files to gitignore (diff)
downloadtutor-module-e61df0d70c517aca759e668d0f8915242b48424a.tar.gz
tutor-module-e61df0d70c517aca759e668d0f8915242b48424a.tar.xz
tutor-module-e61df0d70c517aca759e668d0f8915242b48424a.zip
[client] Allow user to define docker images
The user can now choose in the ImageCreationWizard whether he wants to define a regular virtual machine or a docker image. The workflow is similar, but much simpler. Instead of selecting a vmx file, user can only select a dockerfile, which will be uploaded . TODO: - User can not download dockerfile - User can not update dockerfile
Diffstat (limited to 'dozentenmodul/src/main/java/org')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageCreationWizard.java60
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java7
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageTypePageLayout.java56
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/DockerfileUploadPage.java152
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageTypePage.java35
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/util/VmMetaDataDummy.java121
6 files changed, 418 insertions, 13 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageCreationWizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageCreationWizard.java
index 845c4e3f..845957ff 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageCreationWizard.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageCreationWizard.java
@@ -1,6 +1,8 @@
package org.openslx.dozmod.gui.wizard;
import java.awt.Window;
+import java.util.ArrayList;
+import java.util.List;
import javax.swing.JOptionPane;
@@ -12,15 +14,14 @@ import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.QuitNotification;
import org.openslx.dozmod.gui.helper.UiFeedback;
-import org.openslx.dozmod.gui.wizard.page.ImageCustomPermissionPage;
-import org.openslx.dozmod.gui.wizard.page.ImageMetaDataPage;
-import org.openslx.dozmod.gui.wizard.page.ImageUploadPage;
-import org.openslx.dozmod.gui.wizard.page.ImageUploadSummaryPage;
+import org.openslx.dozmod.gui.wizard.page.*;
import org.openslx.dozmod.state.UploadWizardState;
import org.openslx.dozmod.thrift.Session;
import org.openslx.dozmod.thrift.ThriftActions;
import org.openslx.dozmod.thrift.ThriftError;
import org.openslx.dozmod.thrift.UploadInitiator.GotUploadTokenCallback;
+import org.openslx.dozmod.thrift.cache.MetaDataCache;
+import org.openslx.dozmod.util.VmMetaDataDummy;
import org.openslx.thrifthelper.ThriftManager;
import org.openslx.util.QuickTimer;
import org.openslx.util.QuickTimer.Task;
@@ -31,9 +32,9 @@ public class ImageCreationWizard extends Wizard implements UiFeedback, QuitNotif
private final static Logger LOGGER = Logger.getLogger(ImageCreationWizard.class);
private final UploadWizardState state = new UploadWizardState();
- protected ImageUploadPage imageUploadPage;
- protected ImageMetaDataPage imageMetaDataPage;
- protected ImageCustomPermissionPage imageCustomPermissionPage;
+
+ private List<WizardPage> currentPages = new ArrayList<>();
+
private boolean baseWritten = false;
private boolean permissionsWritten = false;
@@ -46,12 +47,45 @@ public class ImageCreationWizard extends Wizard implements UiFeedback, QuitNotif
super(parent);
state.defaultPermissions = Session.getSatelliteConfig().defaultImagePermissions;
- imageUploadPage = new ImageUploadPage(this, state, null);
- imageMetaDataPage = new ImageMetaDataPage(this, state);
- imageCustomPermissionPage = new ImageCustomPermissionPage(this, state);
- addPage(imageUploadPage);
- addPage(imageMetaDataPage);
- addPage(imageCustomPermissionPage);
+ addPage(new ImageTypePage(this));
+ }
+
+ /**
+ * Adding Pages to the Wizard to create a virtual machine
+ */
+ public void doVmCreation() {
+ cleanCurrent();
+
+ currentPages.add(new ImageUploadPage(this, state, null));
+ currentPages.add(new ImageMetaDataPage(this, state));
+ currentPages.add(new ImageCustomPermissionPage(this, state));
+ addPages();
+ }
+
+ /**
+ * Adding Pages to the Wizard to define a docker image
+ */
+ public void doDockerCreation() {
+ cleanCurrent();
+
+ state.meta = new VmMetaDataDummy(MetaDataCache.getOperatingSystems());
+ currentPages.add(new DockerfileUploadPage(this,state));
+ currentPages.add(new ImageMetaDataPage(this,state));
+ currentPages.add(new ImageCustomPermissionPage(this, state));
+ addPages();
+ }
+
+ private void addPages() {
+ for (WizardPage i:currentPages) {
+ addPage(i);
+ }
+ }
+
+ private void cleanCurrent() {
+ if( !currentPages.isEmpty()) {
+ removePages(currentPages);
+ currentPages = new ArrayList<WizardPage>();
+ }
}
@Override
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java
index 6a5afa3f..5ce2c815 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java
@@ -188,6 +188,13 @@ public abstract class Wizard extends JDialog {
pages.add(page);
}
+ protected final void removePages(List<WizardPage> currentPages) {
+ for (WizardPage i: currentPages)
+ {
+ pages.remove(i);
+ }
+ }
+
protected void addSummaryPage(WizardPage page) {
postFinishPage = page;
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageTypePageLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageTypePageLayout.java
new file mode 100644
index 00000000..c92784b9
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageTypePageLayout.java
@@ -0,0 +1,56 @@
+package org.openslx.dozmod.gui.wizard.layout;
+
+import org.openslx.dozmod.gui.helper.GridManager;
+import org.openslx.dozmod.gui.wizard.Wizard;
+import org.openslx.dozmod.gui.wizard.WizardPage;
+
+import javax.swing.*;
+
+public abstract class ImageTypePageLayout extends WizardPage {
+
+ protected final JTextArea txtInfoText;
+ protected final JButton btnNewVmImage;
+ protected final JButton btnNewDockerImage;
+
+ /**
+ * Page to choose between new VM-Image or Docker Image
+ */
+ public ImageTypePageLayout(Wizard wizard) {
+
+ super(wizard, "Wähle Image Type");
+ setDescription("Möchten Sie eine VM oder ein Docker Image definieren?");
+ GridManager grid = new GridManager(this, 4, false);
+
+ // Choose between new vm or new docker-image
+ txtInfoText = new JTextArea();
+ txtInfoText.setBorder(BorderFactory.createTitledBorder("Hinweis"));
+ txtInfoText.setLineWrap(true);
+ txtInfoText.setWrapStyleWord(true);
+ txtInfoText.setEditable(false);
+ txtInfoText.setFocusable(false);
+ txtInfoText.setOpaque(false);
+ txtInfoText.setText("Haben Sie noch keine eigene Virtuelle Maschine erstellt,"
+ + " können Sie sich in der Übersicht eine Virtuelle Maschine als Vorlage herunterladen,"
+ + " diese an Ihre Bedürfnisse anpassen und anschließend über diesen Assistenten hochladen."
+ + "\n\nWenn Sie die VM einer bestehenden Veranstaltung aktualisieren möchten,"
+ + " öffnen Sie die Detailansicht der bestehenden VM und wählen Sie 'Neue VM-Version hochladen'."
+ + " Dadurch bleiben bestehende Berechtigungen, sowie Verknüpfungen zu Veranstaltungen erhalten.");
+ grid.add(txtInfoText, 4).fill(true, false).expand(true, false);
+ grid.nextRow();
+ grid.nextRow();
+
+ // -- New VM Pick--
+ btnNewVmImage = new JButton("New VM");
+ grid.add(btnNewVmImage,2,2)
+ .fill(true,true)
+ .expand(true,true);
+ // -- New Docker-Image Pick--
+ btnNewDockerImage = new JButton("new Docker-Image");
+ grid.add(btnNewDockerImage,2,2)
+ .fill(true,true)
+ .expand(true,true);
+
+ grid.finish(false);
+
+ }
+}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/DockerfileUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/DockerfileUploadPage.java
new file mode 100644
index 00000000..12c15ffe
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/DockerfileUploadPage.java
@@ -0,0 +1,152 @@
+package org.openslx.dozmod.gui.wizard.page;
+
+import org.apache.log4j.Logger;
+import org.openslx.bwlp.thrift.iface.OperatingSystem;
+import org.openslx.dozmod.Config;
+import org.openslx.dozmod.gui.Gui;
+import org.openslx.dozmod.gui.helper.MessageType;
+import org.openslx.dozmod.gui.helper.QFileChooser;
+import org.openslx.dozmod.gui.wizard.Wizard;
+import org.openslx.dozmod.gui.wizard.layout.ImageUploadPageLayout;
+import org.openslx.dozmod.state.UploadWizardState;
+import org.openslx.dozmod.thrift.*;
+
+import javax.swing.*;
+import javax.swing.filechooser.FileFilter;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+
+public class DockerfileUploadPage extends ImageUploadPageLayout {
+
+ private final static Logger LOGGER = Logger.getLogger(DockerfileUploadPage.class);
+
+ /**
+ * Page for uploading an imagefile
+ *
+ * @param wizard
+ */
+ private final UploadWizardState state;
+
+
+
+ public DockerfileUploadPage(Wizard wizard,UploadWizardState state) {
+ super(wizard);
+
+ this.canComeBack = false;
+ this.state = state;
+
+
+ this.txtImageFile.addActionListener(new ActionListener() {
+ @Override public void actionPerformed(ActionEvent e) {
+ browseFile();
+ }
+ });
+ this.btnBrowseForImage.addActionListener(new ActionListener() {
+ @Override public void actionPerformed(ActionEvent e) {
+ browseFile();
+ }
+ });
+
+ txtImageName.addPropertyChangeListener(new PropertyChangeListener() {
+ @Override public void propertyChange(PropertyChangeEvent evt) {
+
+ }
+ });
+ btnBrowseForImage.requestFocus();
+
+ txtInfoText.setText("Many Text");
+ }
+
+ private void browseFile() {
+
+ QFileChooser fc = new QFileChooser(Config.getUploadPath(), false);
+ fc.setAcceptAllFileFilterUsed(false);
+ fc.addChoosableFileFilter(new DockerfileFilter());
+
+ // TODO add Feature for MULTIPLE_HYPERVISORS
+
+ int action = fc.showOpenDialog(getDialog());
+ File file = fc.getSelectedFile();
+
+ if (action != JFileChooser.APPROVE_OPTION || file == null)
+ return;
+
+ txtImageFile.setText(file.getAbsolutePath());
+ txtImageName.setText(file.getParentFile().getName());
+
+ state.descriptionFile = file;
+ state.diskFile = file; // TODO no disk file in docker context (DUMMY SET)
+ state.name = file.getParentFile().getName();
+
+ setPageComplete(true);
+ }
+
+
+ private class DockerfileFilter extends FileFilter {
+
+ @Override public boolean accept(File f) {
+
+ boolean accept = true;
+ if (f.isFile() && !f.getName().equals("dockerfile"))
+ accept = false;
+ return accept;
+ }
+
+ @Override public String getDescription() {
+ return "Dockerfile";
+ }
+ }
+
+
+ @Override
+ protected boolean wantNextOrFinish() {
+// // Check for vmware player lock files - warn user if found, might corrupt upload
+// if (askCancelLockFile(state.descriptionFile.getAbsolutePath() + ".lck",
+// state.diskFile.getAbsolutePath() + ".lck")) {
+// setErrorMessage("Die gewählte VM wird noch verwendet");
+// return false;
+// }
+
+ // are we creating a new image? then either:
+ // get the image name either auto filled by VmwareMetaData or by user
+ // get the image name from the image we are uploading a new version of
+// state.name = existingImage != null ? existingImage.getImageName() : txtImageName.getText();
+
+ // -- create image to get uuid --
+// if (existingImage == null) {
+ if (state.uuid == null) {
+ state.uuid = ThriftActions.createImage(JOptionPane.getFrameForComponent(this), state.name);
+ if (state.uuid == null)
+ return false;
+ txtImageName.setEnabled(false);
+ btnBrowseForImage.setEnabled(false);
+ txtImageFile.setEnabled(false);
+ }
+// } else {
+// state.uuid = existingImage.getImageBaseId();
+// }
+ // Create upload initiator that will manage requesting a token, hashing the
+ // file, connecting for upload...
+ if (state.upload == null) {
+ try {
+ state.upload = new UploadInitiator(state.uuid, state.diskFile,
+ state.meta.getFilteredDefinition());
+ } catch (WrappedException e) {
+ ThriftError.showMessage(this, LOGGER, e.exception, e.displayMessage);
+ return false;
+ } catch (IOException e) {
+ Gui.showMessageBox(this, "Upload-Initialisierung fehlgeschlagen", MessageType.ERROR, LOGGER,
+ e);
+ return false;
+ }
+ }
+ // Start the hash check now
+ state.upload.startHashing();
+ return true;
+
+ }
+}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageTypePage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageTypePage.java
new file mode 100644
index 00000000..219f3391
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageTypePage.java
@@ -0,0 +1,35 @@
+package org.openslx.dozmod.gui.wizard.page;
+
+import org.openslx.dozmod.gui.wizard.ImageCreationWizard;
+import org.openslx.dozmod.gui.wizard.layout.ImageTypePageLayout;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class ImageTypePage extends ImageTypePageLayout {
+
+ public ImageTypePage(final ImageCreationWizard wizard) {
+ super(wizard);
+
+ btnNewVmImage.addActionListener(new ActionListener() {
+ @Override public void actionPerformed(ActionEvent e) {
+ wizard.doVmCreation();
+ setPageComplete(true);
+ wizard.doNext();
+ }
+ });
+
+ btnNewDockerImage.addActionListener(new ActionListener() {
+ @Override public void actionPerformed(ActionEvent e) {
+ wizard.doDockerCreation();
+ setPageComplete(true);
+ wizard.doNext();
+ }
+ });
+ }
+
+ @Override protected void onPageEnter() {
+ // set onPageEnter to disable Next and Finish button
+ setPageComplete(false);
+ }
+}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmMetaDataDummy.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmMetaDataDummy.java
new file mode 100644
index 00000000..bd5d4323
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmMetaDataDummy.java
@@ -0,0 +1,121 @@
+package org.openslx.dozmod.util;
+
+import org.openslx.bwlp.thrift.iface.Virtualizer;
+import org.openslx.thrifthelper.TConst;
+import org.openslx.util.vm.VmMetaData;
+
+import java.io.File;
+import java.util.List;
+
+public class VmMetaDataDummy extends VmMetaData {
+ // TODO Define DOCKER CONSTANT
+ private final Virtualizer virtualizer = new Virtualizer( TConst.VIRT_VMWARE, "DOCKER" );
+
+ public VmMetaDataDummy(List osList) {
+ super(osList);
+ }
+
+ @Override public byte[] getFilteredDefinitionArray() {
+ return new byte[0];
+ }
+
+ @Override public void applySettingsForLocalEdit() {
+
+ }
+
+ @Override public boolean addHddTemplate(File diskImage, String hddMode, String redoDir) {
+ return false;
+ }
+
+ @Override public boolean addHddTemplate(String diskImagePath, String hddMode, String redoDir) {
+ return false;
+ }
+
+ @Override public boolean addDefaultNat() {
+ return false;
+ }
+
+ @Override public void setOs(String vendorOsId) {
+
+ }
+
+ @Override public boolean addDisplayName(String name) {
+ return false;
+ }
+
+ @Override public boolean addRam(int mem) {
+ return false;
+ }
+
+ @Override public void addFloppy(int index, String image, boolean readOnly) {
+
+ }
+
+ @Override public boolean addCdrom(String image) {
+ return false;
+ }
+
+ @Override public boolean addCpuCoreCount(int nrOfCores) {
+ return false;
+ }
+
+ @Override public void setSoundCard(SoundCardType type) {
+
+ }
+
+ @Override public SoundCardType getSoundCard() {
+ return SoundCardType.NONE;
+ }
+
+ @Override public void setDDAcceleration(DDAcceleration type) {
+
+ }
+
+ @Override public DDAcceleration getDDAcceleration() {
+ return DDAcceleration.OFF;
+ }
+
+ @Override public void setHWVersion(HWVersion type) {
+
+ }
+
+ @Override public HWVersion getHWVersion() {
+ return HWVersion.DEFAULT;
+ }
+
+ @Override public void setEthernetDevType(int cardIndex, EthernetDevType type) {
+
+ }
+
+ @Override public EthernetDevType getEthernetDevType(int cardIndex) {
+ return EthernetDevType.NONE;
+ }
+
+ @Override public void setMaxUsbSpeed(UsbSpeed speed) {
+
+ }
+
+ @Override public UsbSpeed getMaxUsbSpeed() {
+ return UsbSpeed.NONE;
+ }
+
+ @Override public byte[] getDefinitionArray() {
+ return new byte[0];
+ }
+
+ @Override public boolean addEthernet(EtherType type) {
+ return false;
+ }
+
+ @Override public Virtualizer getVirtualizer() {
+ return virtualizer;
+ }
+
+ @Override public boolean tweakForNonPersistent() {
+ return false;
+ }
+
+ @Override public void registerVirtualHW() {
+
+ }
+}