void addOrReplaceNode(final RequisitionNode node) { final Requisition req = getActiveRequisition(true); if (req != null) { req.updateDateStamp(); req.putNode(node); save(req); } }
@Test public void integrationTest() { /* * First, the user creates a requisition in the UI, or RESTful * interface. */ Requisition pendingReq = new Requisition("test"); pendingReq.putNode(createNode("1")); m_pending.save(pendingReq); m_pending.flush(); /* * Then, the user makes a foreign source configuration to go along * with that requisition. */ ForeignSource pendingSource = m_repository.getForeignSource("test"); assertTrue(pendingSource.isDefault()); pendingSource.setDetectors(new ArrayList<PluginConfig>()); m_pending.save(pendingSource); m_pending.flush(); /* * Now we got an import event, so we import that requisition file, * and save it. The ForeignSource in the pending repository should * match the one in the active one, now. */ Requisition activeReq = m_repository.importResourceRequisition( new UrlResource(m_pending.getRequisitionURL("test"))); ForeignSource activeSource = m_active.getForeignSource("test"); // and the foreign source should be the same as the one we made earlier, only this time it's // active assertEquals(activeSource.getName(), pendingSource.getName()); assertEquals(activeSource.getDetectorNames(), pendingSource.getDetectorNames()); assertEquals(activeSource.getScanInterval(), pendingSource.getScanInterval()); assertRequisitionsMatch("active and pending requisitions should match", activeReq, pendingReq); /* * Since it's been officially deployed, the requisition and foreign * source should no longer be in the pending repo. */ assertNull( "the requisition should be null in the pending repo", m_pending.getRequisition("test")); assertTrue( "the foreign source should be default since there's no specific in the pending repo", m_pending.getForeignSource("test").isDefault()); }
@Test public void multipleSnapshotTest() throws URISyntaxException, InterruptedException { Requisition pendingReq = new Requisition("test"); pendingReq.putNode(createNode("1")); m_pending.save(pendingReq); m_pending.flush(); final String foreignSource = pendingReq.getForeignSource(); pendingReq = m_pending.getRequisition(foreignSource); final File pendingSnapshotA = RequisitionFileUtils.createSnapshot(m_pending, foreignSource, pendingReq.getDate()); // Now, start a new pending update after the original snapshot is "in progress" pendingReq.updateDateStamp(); m_pending.save(pendingReq); m_pending.flush(); final File pendingSnapshotB = RequisitionFileUtils.createSnapshot(m_pending, foreignSource, pendingReq.getDate()); // "import" the A snapshot m_repository.importResourceRequisition(new FileSystemResource(pendingSnapshotA)); assertFalse(pendingSnapshotA.exists()); assertTrue(pendingSnapshotB.exists()); // since there's still a newer snapshot in-progress, it is safe to delete the pending test.xml URL pendingUrl = m_pending.getRequisitionURL(foreignSource); assertNotNull(pendingUrl); assertFalse(new File(pendingUrl.toURI()).exists()); // then, "import" the B snapshot final Requisition bReq = m_repository.importResourceRequisition(new FileSystemResource(pendingSnapshotB)); assertFalse(pendingSnapshotA.exists()); assertFalse(pendingSnapshotB.exists()); // now the pending test.xml should be gone pendingUrl = m_pending.getRequisitionURL(foreignSource); assertNotNull(pendingUrl); assertFalse(new File(pendingUrl.toURI()).exists()); // the last (B) pending import should match the deployed final Requisition deployedRequisition = m_active.getRequisition(foreignSource); assertEquals(deployedRequisition.getDate().getTime(), bReq.getDate().getTime()); }
@Test public void simpleSnapshotTest() throws URISyntaxException { Requisition pendingReq = new Requisition("test"); pendingReq.putNode(createNode("1")); m_pending.save(pendingReq); m_pending.flush(); pendingReq = m_pending.getRequisition(pendingReq.getForeignSource()); final File pendingSnapshot = RequisitionFileUtils.createSnapshot( m_pending, pendingReq.getForeignSource(), pendingReq.getDate()); m_repository.importResourceRequisition(new FileSystemResource(pendingSnapshot)); assertFalse(pendingSnapshot.exists()); final URL pendingUrl = m_pending.getRequisitionURL(pendingReq.getForeignSource()); final File pendingFile = new File(pendingUrl.toURI()); assertFalse(pendingFile.exists()); }
@Test public void testSpc674RaceCondition() throws Exception { final String foreignSource = "spc674"; System.err.println( "=== create a requisition like the ReST service does, import it immediately ==="); final Requisition initial = new Requisition(foreignSource); initial.putNode(createNode("1")); initial.updateDateStamp(); m_pending.save(initial); final URL node1Snapshot = createSnapshot(foreignSource); Resource resource = new UrlResource(node1Snapshot); doImport(resource); Thread.sleep(5); List<String> files = getImports(foreignSource); assertEquals(1, files.size()); System.err.println("=== create another snapshot, but don't import it yet ==="); initial.putNode(createNode("2")); initial.updateDateStamp(); m_pending.save(initial); final URL node2Snapshot = createSnapshot(foreignSource); Thread.sleep(5); files = getImports(foreignSource); assertEquals(3, files.size()); System.err.println("=== create yet another snapshot, and don't import it yet ==="); initial.putNode(createNode("3")); initial.updateDateStamp(); m_pending.save(initial); final URL node3Snapshot = createSnapshot(foreignSource); Thread.sleep(5); files = getImports(foreignSource); assertEquals(4, files.size()); System.err.println("=== import of the second file finishes ==="); doImport(new UrlResource(node2Snapshot)); Thread.sleep(5); files = getImports(foreignSource); assertEquals(2, files.size()); System.err.println("=== fourth node is sent to the ReST interface ==="); final Requisition currentPending = RequisitionFileUtils.getLatestPendingOrSnapshotRequisition(m_pending, foreignSource); assertNotNull(currentPending); assertEquals(initial.getDate(), currentPending.getDate()); currentPending.putNode(createNode("4")); currentPending.updateDateStamp(); m_pending.save(currentPending); final URL node4Snapshot = createSnapshot(foreignSource); Thread.sleep(5); files = getImports(foreignSource); assertEquals(4, files.size()); System.err.println("=== import of the third file finishes ==="); doImport(new UrlResource(node3Snapshot)); Thread.sleep(5); files = getImports(foreignSource); assertEquals(2, files.size()); System.err.println("=== import of the fourth file finishes ==="); doImport(new UrlResource(node4Snapshot)); Thread.sleep(5); files = getImports(foreignSource); assertEquals(1, files.size()); }