package vlove.web.storage; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.image.NonCachingImage; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.util.ListModel; import org.apache.wicket.request.resource.ContextRelativeResource; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.wicketstuff.annotation.mount.MountPath; import vlove.VirtException; import vlove.model.InternalStoragePool; import vlove.model.StoragePoolState; import vlove.service.VirtManager; import vlove.web.BasePage; import vlove.web.error.ErrorPage; @MountPath("/storage/list") public class ListStoragePoolsPage extends BasePage { transient final Logger log = LoggerFactory.getLogger(getClass()); @SpringBean private VirtManager vm; public ListStoragePoolsPage() { super(); add(new BookmarkablePageLink<>("createPoolLink", CreateStoragePoolPage.class)); final WebMarkupContainer container = new WebMarkupContainer("container"); add(container.setOutputMarkupId(true)); final ReloadableModel reloadableModel; try { reloadableModel = new ReloadableModel(vm); } catch (VirtException ve) { log.error("Could not create VM model.", ve); setResponsePage(ErrorPage.class); return; } final ListView<InternalStoragePool> vms = new ListView<InternalStoragePool>("repeater", reloadableModel) { @Override protected void populateItem(ListItem<InternalStoragePool> item) { final InternalStoragePool sp = item.getModelObject(); final String poolId = sp.getUuid(); final StoragePoolState s = sp.getState(); item.add(new Label("name", sp.getName())); item.add(new Label("volumes", Integer.toString(sp.getNumVols()))); item.add(new Label("capacity", getMbString(sp.getCapacity()))); item.add(new Label("available", getMbString(sp.getAvailable()))); item.add(new Label("state", s.toString())); // Buttons final AjaxLink<Object> power = new AjaxLink<Object>("power") { @Override public void onClick(AjaxRequestTarget target) { // TODO } }; if (s == StoragePoolState.VIR_STORAGE_POOL_RUNNING) { power.add(new NonCachingImage("powerImage", new ContextRelativeResource("/images/power_off.png"))); } else { power.add(new NonCachingImage("powerImage", new ContextRelativeResource("/images/power_on.png"))); } item.add(power.setOutputMarkupId(true)); final AjaxLink<Object> destroy = new AjaxLink<Object>("destroy") { @Override public void onClick(AjaxRequestTarget target) { log.debug("Destroying {}.", poolId); // TODO } }; destroy.add(new Image("destroyImage", new ContextRelativeResource("/images/destroy.png"))); item.add(destroy.setOutputMarkupId(true).setEnabled(s != StoragePoolState.VIR_STORAGE_POOL_INACTIVE)); } }; container.add(vms.setMarkupId("repeater").setOutputMarkupId(true)); } private static final class ReloadableModel extends ListModel<InternalStoragePool> { private final VirtManager virtMgr; public ReloadableModel(VirtManager vm) throws VirtException { this.virtMgr = vm; setObject(vm.getStoragePools()); } public void reload() throws VirtException { setObject(virtMgr.getStoragePools()); } } final String getMbString(long size) { return Long.toString(size / (1024l * 1024l)); } }