Skip to content

Instantly share code, notes, and snippets.

@gschueler
Created June 6, 2011 23:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gschueler/1011392 to your computer and use it in GitHub Desktop.
Save gschueler/1011392 to your computer and use it in GitHub Desktop.
merge multiple rundeck resource provider url contents
commons-beanutils-1.8.0.jar
dom4j-1.6.1.jar
jaxen-1.1.jar
log4j-1.2.15.jar
rundeck-core-1.3.0.jar
snakeyaml-1.7.jar
import com.dtolabs.rundeck.core.common.*;
import java.util.*;
import java.net.URL;
def urls=['file:test/test.xml','file:test/test2.yaml']
//precedence based on order
def mergeprops=['tags']
def mergeattributes=true
def mnodes /*master nodes def*/
urls.each{url->
//download each url to temp file
try{
def f=File.createTempFile("resource","temp")
f.deleteOnExit()
def nurl = new URL(url);
def text=nurl.text
def bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)))
bw.write(text)
bw.flush()
bw.close()
Nodes tnodes = Nodes.create(f,url.endsWith(".xml")?Nodes.Format.resourcexml:Nodes.Format.resourceyaml)
if(null==mnodes){
mnodes=tnodes
}else{
//merge nodes into mnodes
tnodes.listNodes().each{INodeEntry e->
System.err.println " node: ${e.nodename}"
if(!mnodes.hasNode(e.nodename)){
mnodes.putNode(e)
System.err.println "Add new node: ${e.nodename}"
}else{
INodeEntry orig=mnodes.getNode(e.nodename)
//merge tags
HashSet tags=new HashSet()
if(orig.tags){
tags.addAll(orig.tags)
}
if(e.tags){
tags.addAll(e.tags)
}
HashMap attrs = new HashMap()
if(orig.attributes){
attrs.putAll(orig.attributes)
}
if(mergeattributes){
attrs.putAll(e.attributes)
}
// create updated master node
NodeEntryImpl node = new NodeEntryImpl()
['nodename','hostname','description','osFamily','osVersion','osArch','osName','username'].each{ nprop->
node[nprop]=orig[nprop]
}
node.tags=tags
node.attributes=attrs
mnodes.putNode(node)
System.err.println "merge node: ${e.nodename}: ${e}"
}
}
}
}catch(Exception e){
System.err.println "Error loading from url ${url}: ${e}"
}
}
System.out.println "Loaded ${urls.size()} URLs: "
def gen=new NodesYamlGenerator(System.out)
gen.addNodes(mnodes.listNodes())
gen.generate()
//System.out.println mnodes.toString()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment