diff options
| author | ralph isenmann | 2020-07-14 10:17:24 +0200 |
|---|---|---|
| committer | ralph isenmann | 2020-09-15 13:27:21 +0200 |
| commit | e61df0d70c517aca759e668d0f8915242b48424a (patch) | |
| tree | 6985b6d8d29015a8eaef54c441f3d50973ac5810 /dozentenmodul/src/main/java/org | |
| parent | Add intellij project files to gitignore (diff) | |
| download | tutor-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')
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() { + + } +} |
