You're on your way to the next level! Join the Kudos program to earn points and save your progress.
Level 1: Seed
25 / 150 points
Next: Root
1 badge earned
Challenges come and go, but your rewards stay with you. Do more to earn more!
What goes around comes around! Share the love by gifting kudos to your peers.
Keep earning points to reach the top of the leaderboard. It resets every quarter so you always have a chance!
Join now to unlock these features and more
I have a situation where I have multiple organized object types with objects in them. I need those objects to automatically be copied into a single "Gold Dataset" object type every so often, so they can be searched through and selected through cascading drop-down menus.
All of the attributes are named the same, and the object types are in the same object schema. At first I thought this wouldn't be complicated to do, but it looks like Atlassian doesn't have the built-in capability to do this. Unless I'm wrong and there is some hidden functionality I could be using?
So, I'm somewhat stumped on how to accomplish this. I believe I may have to use automation and Groovy scripts to be able to copy the objects over, but I'm unfamiliar with the language and I don't know how JSM interfaces with it.
If someone knows something I don't, any assistance would be appreciated.
I created a groovy script to be run through ScriptRunner as a scheduled job every 30 minutes. It doesn't format very well even in a code block, but it functions for what I'm using it for.
import org.apache.log4j.Logger
/*
This script copies objects from the object type IDs:
(597,598,599,600,382) into ID (618) object type (GOLD)
*/
// Assets.count('objectSchemaId = 5 and objectTypeId IN (597,598,599,600,382) order by Updated desc') // count of total items in object types
// Search through source object types for objects created within the past minute
Assets.search('objectSchemaId = 5 and objectTypeId IN (597,598,599,600,382) AND "Updated" <= now() AND "Updated" > now(-31m)').each { sourceObject ->
// Define successCount variable for checking if object exists
def successCount = 0
// Search through target object type
Assets.search('objectSchemaId = 5 and objectTypeId = 618').each { targetObject ->
// Compare sourceObject and targetObject
if(sourceObject.getName() == targetObject.getName()) {
// Add success for correct match
successCount += 1
// Fetch source variables
def attr1, attr2, attr3, attr4, attr5, attr6, attr7, attr8, attr9, attr10, attr11, attr12, attr13
try { attr1 = sourceObject.getString("Barcode")
} catch(Exception e) { log.warn "Barcode does not exist"
attr1 = null }
try { attr2 = sourceObject.getName()
} catch(Exception e) { log.warn "Name does not exist"
attr2 = null }
try { attr3 = sourceObject.getReference("Manufacturer").getString("Name")
} catch(Exception e) { log.warn "Manufacturer does not exist"
attr3 = null }
try { attr4 = sourceObject.getReference("Model").getString("Name")
} catch(Exception e) { log.warn "Model does not exist"
attr4 = null }
try { attr5 = sourceObject.getString("Serial Number")
} catch(Exception e) { log.warn "Serial Number does not exist"
attr5 = null }
try { attr6 = sourceObject.getReference("Building").getString("Name")
} catch(Exception e) { log.warn "Building does not exist"
attr6 = null }
try { attr7 = sourceObject.getReference("Room").getString("Name")
} catch(Exception e) { log.warn "Room does not exist"
attr7 = null }
try { attr8 = sourceObject.getReference("Rack").getString("Name")
} catch(Exception e) { log.warn "Rack does not exist"
attr8 = null }
try { attr9 = sourceObject.getString("Elevation")
} catch(Exception e) { log.warn "Elevation does not exist"
attr9 = null }
try { attr10 = sourceObject.getReference("System Owner").getString("Name")
} catch(Exception e) { log.warn "System Owner does not exist"
attr10 = null }
try { attr11 = sourceObject.getReference("Guild").getString("Name")
} catch(Exception e) { log.warn "Guild does not exist"
attr11 = null }
try { attr12 = sourceObject.getDate("EOL")
} catch(Exception e) { log.warn "EOL does not exist"
attr12 = null }
try { attr13 = sourceObject.getDate("EOS")
} catch(Exception e) { log.warn "EOS does not exist"
attr13 = null }
// Update target object based on source
targetObject.update {
if(attr1 != null) { setAttribute("Barcode", attr1) }
if(attr2 != null) { setAttribute("Name", attr2) }
if(attr3 != null) { setAttribute("Manufacturer", attr3) }
if(attr4 != null) { setAttribute("Model", attr4) }
if(attr5 != null) { setAttribute("Serial Number", attr5) }
if(attr6 != null) { setAttribute("Building", attr6) }
if(attr7 != null) { setAttribute("Room", attr7) }
if(attr8 != null) { setAttribute("Rack", attr8) }
if(attr9 != null) { setAttribute("Elevation", attr9) }
if(attr10 != null) { setAttribute("System Owner", attr10) }
if(attr11 != null) { setAttribute("Guild", attr11) }
if(attr12 != null) { setAttribute("EOL", attr12) }
if(attr13 != null) { setAttribute("EOS", attr13) }
}
}
}
// Create object if it doesn't exist in target object type
if(successCount != 1) {
Assets.create("ASSETS", "GOLD") {
// Define attributes using source data
def attr1, attr2, attr3, attr4, attr5, attr6, attr7, attr8, attr9, attr10, attr11, attr12, attr13
try { attr1 = sourceObject.getString("Barcode")
} catch(Exception e) { log.warn "Barcode does not exist"
attr1 = null }
try { attr2 = sourceObject.getName()
} catch(Exception e) { log.warn "Name does not exist"
attr2 = null }
try { attr3 = sourceObject.getReference("Manufacturer").getString("Name")
} catch(Exception e) { log.warn "Manufacturer does not exist"
attr3 = null }
try { attr4 = sourceObject.getReference("Model").getString("Name")
} catch(Exception e) { log.warn "Model does not exist"
attr4 = null }
try { attr5 = sourceObject.getString("Serial Number")
} catch(Exception e) { log.warn "Serial Number does not exist"
attr5 = null }
try { attr6 = sourceObject.getReference("Building").getString("Name")
} catch(Exception e) { log.warn "Building does not exist"
attr6 = null }
try { attr7 = sourceObject.getReference("Room").getString("Name")
} catch(Exception e) { log.warn "Room does not exist"
attr7 = null }
try { attr8 = sourceObject.getReference("Rack").getString("Name")
} catch(Exception e) { log.warn "Rack does not exist"
attr8 = null }
try { attr9 = sourceObject.getString("Elevation")
} catch(Exception e) { log.warn "Elevation does not exist"
attr9 = null }
try { attr10 = sourceObject.getReference("System Owner").getString("Name")
} catch(Exception e) { log.warn "System Owner does not exist"
attr10 = null }
try { attr11 = sourceObject.getReference("Guild").getString("Name")
} catch(Exception e) { log.warn "Guild does not exist"
attr11 = null }
try { attr12 = sourceObject.getDate("EOL")
} catch(Exception e) { log.warn "EOL does not exist"
attr12 = null }
try { attr13 = sourceObject.getDate("EOS")
} catch(Exception e) { log.warn "EOS does not exist"
attr13 = null }
// Assign data to new object
try {
if(attr1 != null) { setAttribute("Barcode", attr1) }
if(attr2 != null) { setAttribute("Name", attr2) }
if(attr3 != null) { setAttribute("Manufacturer", attr3) }
if(attr4 != null) { setAttribute("Model", attr4) }
if(attr5 != null) { setAttribute("Serial Number", attr5) }
if(attr6 != null) { setAttribute("Building", attr6) }
if(attr7 != null) { setAttribute("Room", attr7) }
if(attr8 != null) { setAttribute("Rack", attr8) }
if(attr9 != null) { setAttribute("Elevation", attr9) }
if(attr10 != null) { setAttribute("System Owner", attr10) }
if(attr11 != null) { setAttribute("Guild", attr11) }
if(attr12 != null) { setAttribute("EOL", attr12) }
if(attr13 != null) { setAttribute("EOS", attr13) }
} catch(Exception e) { log.warn sourceObject
log.warn e.getMessage() }
}
}
}
Hi @Dom L
To do that you need two things :
The reason you need to have your files on a public web server is that you don't have to manually change the file in your Import configuration. If you don't want to do that (which I would understand) you would need to manually import them from time to time.
Without creating complex PowerShell scripts, I don't know of another way to do so.
Hope this helps.
Have a nice day
Frederic Chartrand - FMX Solutions - Gold Solution Partner
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Thanks for the response.
I do know how to use automation to import assets regularly, but I'm having trouble with the exporting side of it, and with the scripting of the whole process. Is there a way to do that with groovy scripting at all? Or maybe a Jenkins job?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi @Dom L
That's a good question. I looked at the Rest API doc and can't find anything to export data. I don't know enough about Groovy or Jenkins to elaborate unfortunately.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.