private SnapshotLeaf findSnapshot(final List<SnapshotLeaf> leafs, final Function<Boolean, VolumeSnapshotInventory> func) { for (SnapshotLeaf leaf : leafs) { SnapshotLeaf ret = findSnapshot(leaf.children, func); if (ret != null) { return ret; } if (func.call(leaf.getInventory())) { return leaf; } } return null; }
public VolumeSnapshotTree toSubTree() { VolumeSnapshotTree tree = new VolumeSnapshotTree(); tree.root = this; tree.volumeUuid = inventory.getVolumeUuid(); return tree; }
public static VolumeSnapshotTree fromVOs(List<VolumeSnapshotVO> vos) { return fromInventories(VolumeSnapshotInventory.valueOf(vos)); }
public SnapshotLeaf buildRootLeaf(String uuid) { VolumeSnapshotVO s = dbf.findByUuid(uuid, VolumeSnapshotVO.class); SimpleQuery<VolumeSnapshotVO> q = dbf.createQuery(VolumeSnapshotVO.class); q.add(VolumeSnapshotVO_.treeUuid, Op.EQ, s.getTreeUuid()); List<VolumeSnapshotVO> vos = q.list(); VolumeSnapshotTree tree = VolumeSnapshotTree.fromVOs(vos); SnapshotLeaf leaf = tree.getRoot(); if (!leaf.getInventory().getUuid().equals(uuid)) { Assert.fail(String.format("snapshot[%s] is not root snapshot", uuid)); } return leaf; } }
private void buildFullSnapshotTree() { SimpleQuery<VolumeSnapshotVO> q = dbf.createQuery(VolumeSnapshotVO.class); q.add(VolumeSnapshotVO_.treeUuid, SimpleQuery.Op.EQ, currentRoot.getTreeUuid()); List<VolumeSnapshotVO> vos = q.list(); fullTree = VolumeSnapshotTree.fromVOs(vos); }
final List<VolumeSnapshotInventory> children = new ArrayList<VolumeSnapshotInventory>(); for (VolumeSnapshotTree t : p.snapshotTrees) { children.addAll(t.getRoot().getDescendants());
@Override public VolumeSnapshotTree call(VolumeSnapshotTree arg) { return arg.getVolumeUuid().equals(vol.getUuid()) ? arg : null; } });
private void marshal(APIQueryVolumeSnapshotTreeReply reply) { if (reply.getInventories() == null) { // this is for count return; } for (VolumeSnapshotTreeInventory inv : reply.getInventories()) { SimpleQuery<VolumeSnapshotVO> sq = dbf.createQuery(VolumeSnapshotVO.class); sq.add(VolumeSnapshotVO_.treeUuid, Op.EQ, inv.getUuid()); List<VolumeSnapshotVO> vos = sq.list(); VolumeSnapshotTree tree = VolumeSnapshotTree.fromVOs(vos); inv.setTree(tree.getRoot().toLeafInventory()); } }
VolumeSnapshotTree tree = VolumeSnapshotTree.fromVOs(l); snapshotTrees.add(tree);
q.add(VolumeSnapshotVO_.treeUuid, Op.EQ, msg.getTreeUuid()); List<VolumeSnapshotVO> vos = q.list(); VolumeSnapshotTree tree = VolumeSnapshotTree.fromVOs(vos); inv.setTree(tree.getRoot().toLeafInventory()); reply.setInventories(Arrays.asList(inv)); } else if (msg.getVolumeUuid() != null) { sq.add(VolumeSnapshotVO_.treeUuid, Op.EQ, vo.getUuid()); List<VolumeSnapshotVO> vos = sq.list(); VolumeSnapshotTree tree = VolumeSnapshotTree.fromVOs(vos); inv.setTree(tree.getRoot().toLeafInventory()); treeInventories.add(inv);
public SnapshotLeaf findSnapshot(Function<Boolean, VolumeSnapshotInventory> func) { if (func.call(root.getInventory())) { return root; } return findSnapshot(root.children, func); } }
public static VolumeSnapshotTree fromInventories(List<VolumeSnapshotInventory> invs) { VolumeSnapshotTree tree = new VolumeSnapshotTree(); Map<String, SnapshotLeaf> map = new HashMap<String, SnapshotLeaf>(); for (VolumeSnapshotInventory inv : invs) { SnapshotLeaf leaf = map.get(inv.getUuid()); if (leaf == null) { leaf = new SnapshotLeaf(); leaf.inventory = inv; map.put(inv.getUuid(), leaf); } else { leaf.inventory = inv; } if (inv.getParentUuid() != null) { SnapshotLeaf parent = map.get(inv.getParentUuid()); if (parent == null) { parent = new SnapshotLeaf(); parent.setUuid(inv.getParentUuid()); map.put(parent.getUuid(), parent); } parent.children.add(leaf); leaf.parent = parent; } else { tree.root = leaf; } tree.volumeUuid = inv.getVolumeUuid(); } DebugUtils.Assert(tree.root != null, "why tree root is null???"); return tree; }
private void refreshVO() { VolumeSnapshotVO vo = dbf.reload(currentRoot); if (vo == null) { throw new OperationFailureException(operr("cannot find volume snapshot[uuid:%s, name:%s], it may have been deleted by previous operation", currentRoot.getUuid(), currentRoot.getName())); } currentRoot = vo; buildFullSnapshotTree(); currentLeaf = fullTree.findSnapshot(new Function<Boolean, VolumeSnapshotInventory>() { @Override public Boolean call(VolumeSnapshotInventory arg) { return arg.getUuid().equals(currentRoot.getUuid()); } }); }