/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2008-2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.netmgt.provision.service; import java.util.Collection; import java.util.Map; import org.opennms.core.tasks.BatchTask; import org.opennms.core.utils.LogUtils; import org.opennms.core.utils.ThreadCategory; import org.opennms.netmgt.EventConstants; import org.opennms.netmgt.provision.persist.AbstractRequisitionVisitor; import org.opennms.netmgt.provision.persist.OnmsNodeRequisition; import org.opennms.netmgt.provision.persist.RequisitionVisitor; import org.opennms.netmgt.provision.persist.requisition.Requisition; import org.opennms.netmgt.provision.service.lifecycle.LifeCycleInstance; import org.opennms.netmgt.provision.service.lifecycle.Phase; import org.opennms.netmgt.provision.service.lifecycle.annotations.Activity; import org.opennms.netmgt.provision.service.lifecycle.annotations.ActivityProvider; import org.opennms.netmgt.provision.service.operations.ImportOperation; import org.opennms.netmgt.provision.service.operations.ImportOperationsManager; import org.opennms.netmgt.provision.service.operations.RequisitionImport; import org.springframework.core.io.Resource; /** * CoreImportActivities * * @author brozow * @version $Id: $ */ @ActivityProvider public class CoreImportActivities { ProvisionService m_provisionService; public CoreImportActivities(final ProvisionService provisionService) { m_provisionService = provisionService; } @Activity( lifecycle = "import", phase = "validate", schedulingHint="import") public RequisitionImport loadSpecFile(final Resource resource) { final RequisitionImport ri = new RequisitionImport(); info("Loading requisition from resource %s", resource); try { final Requisition specFile = m_provisionService.loadRequisition(resource); ri.setRequisition(specFile); debug("Finished loading requisition."); } catch (final Throwable t) { ri.abort(t); } return ri; } @Activity( lifecycle = "import", phase = "audit", schedulingHint="import" ) public ImportOperationsManager auditNodes(final RequisitionImport ri, final Boolean rescanExisting) { if (ri.isAborted()) { info("The import has been aborted, skipping audit phase import."); return null; } final Requisition specFile = ri.getRequisition(); info("Auditing nodes for requisition %s", specFile); // @ipv6 m_provisionService.createDistPollerIfNecessary("localhost", "127.0.0.1"); final String foreignSource = specFile.getForeignSource(); final Map<String, Integer> foreignIdsToNodes = m_provisionService.getForeignIdToNodeIdMap(foreignSource); final ImportOperationsManager opsMgr = new ImportOperationsManager(foreignIdsToNodes, m_provisionService, rescanExisting); opsMgr.setForeignSource(foreignSource); opsMgr.auditNodes(specFile); debug("Finished auditing nodes."); return opsMgr; } @Activity( lifecycle = "import", phase = "scan", schedulingHint="import" ) public void scanNodes(final Phase currentPhase, final ImportOperationsManager opsMgr, final RequisitionImport ri) { if (ri.isAborted()) { info("The import has been aborted, skipping scan phase import."); return; } info("Scheduling nodes for phase %s", currentPhase); final Collection<ImportOperation> operations = opsMgr.getOperations(); for(final ImportOperation op : operations) { final LifeCycleInstance nodeScan = currentPhase.createNestedLifeCycle("nodeImport"); debug("Created lifecycle %s for operation %s", nodeScan, op); nodeScan.setAttribute("operation", op); nodeScan.setAttribute("requisitionImport", ri); nodeScan.trigger(); } } @Activity( lifecycle = "nodeImport", phase = "scan", schedulingHint="import" ) public void scanNode(final ImportOperation operation, final RequisitionImport ri, final Boolean rescanExisting) { if (ri.isAborted()) { info("The import has been aborted, skipping scan phase nodeImport."); return; } if (rescanExisting == null || rescanExisting) { info("Running scan phase of %s", operation); operation.scan(); info("Finished Running scan phase of %s", operation); } else { info("Skipping scan phase of %s, because the %s parameter was set during import.", operation, EventConstants.PARM_IMPORT_RESCAN_EXISTING); } } @Activity( lifecycle = "nodeImport", phase = "persist" , schedulingHint = "import" ) public void persistNode(final ImportOperation operation, final RequisitionImport ri) { if (ri.isAborted()) { info("The import has been aborted, skipping persist phase."); return; } info("Running persist phase of %s", operation); operation.persist(); info("Finished Running persist phase of %s", operation); } @Activity( lifecycle = "import", phase = "relate" , schedulingHint = "import" ) public void relateNodes(final BatchTask currentPhase, final RequisitionImport ri) { if (ri.isAborted()) { info("The import has been aborted, skipping relate phase."); return; } info("Running relate phase"); final Requisition requisition = ri.getRequisition(); RequisitionVisitor visitor = new AbstractRequisitionVisitor() { @Override public void visitNode(final OnmsNodeRequisition nodeReq) { LogUtils.debugf(this, "Scheduling relate of node %s", nodeReq); currentPhase.add(parentSetter(m_provisionService, nodeReq, requisition.getForeignSource())); } }; requisition.visit(visitor); LogUtils.infof(this, "Finished Running relate phase"); } private static Runnable parentSetter(final ProvisionService provisionService, final OnmsNodeRequisition nodeReq, final String foreignSource) { return new Runnable() { @Override public void run() { provisionService.setNodeParentAndDependencies( foreignSource, nodeReq.getForeignId(), // If the node requisition does not include a parent foreign source // name, then use the foreign source of the current requisition // as the default value // // @see http://issues.opennms.org/browse/NMS-4109 // nodeReq.getParentForeignSource() == null ? foreignSource : nodeReq.getParentForeignSource(), nodeReq.getParentForeignId(), nodeReq.getParentNodeLabel() ); provisionService.clearCache(); } @Override public String toString() { return "set parent for node "+nodeReq.getNodeLabel(); } }; } protected void info(String format, Object... args) { LogUtils.infof(this, format, args); } protected void debug(String format, Object... args) { LogUtils.debugf(this, format, args); } protected void warn(String format, Object... args) { LogUtils.warnf(this, format, args); } /** * <p>log</p> * * @return a {@link org.opennms.core.utils.ThreadCategory} object. */ protected ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } }