Skip to content

Commit

Permalink
Merge pull request #2 from device42/D42-14394
Browse files Browse the repository at this point in the history
D42 14394
  • Loading branch information
cscaglioned42 committed Feb 3, 2020
2 parents 3ce26e9 + 27012df commit d25b392
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 68 deletions.
113 changes: 61 additions & 52 deletions lib.py
Expand Up @@ -29,61 +29,70 @@ def get_linked_objects(_target, target_api):

def to_d42(source, mapping, _target, _resource, target_api, resource_api):
key = mapping.attrib['key']
for row in source['result']:
data = {}
fields = mapping.findall('field')
sys_id = row['sys_id']
stored_device42_id = row['u_device42_id'] if len(row['u_device42_id']) > 0 else None
for field in fields:
if field.attrib['resource'] not in row or row[field.attrib['resource']] is None:
continue

if field.attrib['resource'] == 'name':
data[field.attrib['target']] = typer(field.attrib['type'],
row[field.attrib['resource']]) + ' copied from ServiceNow'

elif 'sub_field' in field.attrib:
sub_link = re.search(r'.service-now.com(.+)', row[field.attrib['resource']]['link'])
sub_link = sub_link.group(1)
sub_field_objects = resource_api.request(sub_link, 'GET')['result']
data[field.attrib['target']] = typer(field.attrib['type'], sub_field_objects[field.attrib['sub_field']])

if 'sub_field2' in field.attrib:
sub_link2 = re.search(r'.service-now.com(.+)', sub_field_objects[field.attrib['sub_field']]['link'])
sub_link2 = sub_link2.group(1)
sub_field2_objects = resource_api.request(sub_link2, 'GET')['result']
data[field.attrib['target']] = \
typer(field.attrib['type'], sub_field2_objects[field.attrib['sub_field2']])
try:
for row in source['result']:
data = {}
fields = mapping.findall('field')
sys_id = row['sys_id']

try:
stored_device42_id = row['u_device42_id'] if len(row['u_device42_id']) > 0 else None
except KeyError:
stored_device42_id = None

for field in fields:
if field.attrib['resource'] not in row or row[field.attrib['resource']] is None:
continue

if field.attrib['resource'] == 'name':
data[field.attrib['target']] = typer(field.attrib['type'],
row[field.attrib['resource']]) + ' copied from ServiceNow'

# D42
elif 'sub_field' in field.attrib and 'link' in row[field.attrib['resource']]:
sub_link = re.search(r'.service-now.com(.+)', row[field.attrib['resource']]['link'])
sub_link = sub_link.group(1)
sub_field_objects = resource_api.request(sub_link, 'GET')['result']
data[field.attrib['target']] = typer(field.attrib['type'], sub_field_objects[field.attrib['sub_field']])

if 'sub_field2' in field.attrib and 'link' in sub_field_objects[field.attrib['sub_field']]:
sub_link2 = re.search(r'.service-now.com(.+)', sub_field_objects[field.attrib['sub_field']]['link'])
sub_link2 = sub_link2.group(1)
sub_field2_objects = resource_api.request(sub_link2, 'GET')['result']
data[field.attrib['target']] = \
typer(field.attrib['type'], sub_field2_objects[field.attrib['sub_field2']])

else:
data[field.attrib['target']] = typer(field.attrib['type'], row[field.attrib['resource']])

# update or create new
if stored_device42_id is not None:
data[key] = stored_device42_id
old_name = data['name']
data.pop('name', None)
api_result = target_api.request(_target.attrib['path'], _target.attrib['update_method'], data)

if int(api_result['code']) == 3:
# resend if device removed
stored_device42_id = None
data['name'] = old_name
api_result = target_api.request(_target.attrib['path'], _target.attrib['method'], data)
else:
data[field.attrib['target']] = typer(field.attrib['type'], row[field.attrib['resource']])

# update or create new
if stored_device42_id is not None:
data[key] = stored_device42_id
old_name = data['name']
data.pop('name', None)
api_result = target_api.request(_target.attrib['path'], _target.attrib['update_method'], data)

if int(api_result['code']) == 3:
# resend if device removed
stored_device42_id = None
data['name'] = old_name
api_result = target_api.request(_target.attrib['path'], _target.attrib['method'], data)
else:
api_result = target_api.request(_target.attrib['path'], _target.attrib['method'], data)

if DEBUG:
print data
print api_result
if DEBUG:
print data
print api_result

# update stored device in ServiceNow
if stored_device42_id is None:
resource_api.request(_resource.attrib['path'] + '/' + sys_id, 'PATCH', {
'u_device42_id': api_result['msg'][1]
})
# update stored device in ServiceNow
if stored_device42_id is None:
resource_api.request(_resource.attrib['path'] + '/' + sys_id, 'PATCH', {
'u_device42_id': api_result['msg'][1]
})

print '.'
print '.'
except KeyError:
print('[Warning] No Data in Resource, Continuing')


def from_d42(source, mapping, _target, _resource, target_api, resource_api):
Expand Down Expand Up @@ -112,19 +121,19 @@ def from_d42(source, mapping, _target, _resource, target_api, resource_api):
row[field.attrib['resource']]) + ' copied from Device42'

elif field.attrib['resource'] == 'mac_addresses':
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
if len(row[field.attrib['resource']]) > 0:
data[field.attrib['target']] = \
typer(field.attrib['type'], row[field.attrib['resource']][int(field.attrib['element'])]['mac'])

elif field.attrib['resource'] == 'ip_addresses':
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
if len(row[field.attrib['resource']]) > 0:
data[field.attrib['target']] = \
typer(field.attrib['type'], row[field.attrib['resource']][int(field.attrib['element'])]['ip'])

elif field.attrib['resource'] == 'custom_fields':
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
if len(row[field.attrib['resource']]) > 0:
for x in row[field.attrib['resource']]:
if x['key'] == str(field.attrib['key']):
Expand Down
31 changes: 15 additions & 16 deletions mapping.xml.sample
Expand Up @@ -11,18 +11,17 @@
</settings>

<tasks>

<task enable="true" description="Copy from Servicenow to Device42">
<task enable="true" description="Copy from servicenow to Device42 (cmdb_ci_server)">
<api>
<resource target="serviceNow" method="GET" path="/api/now/table/cmdb_ci_aix_server"/>
<resource target="serviceNow" method="GET" path="/api/now/table/cmdb_ci_server"/>
<target model="device" target="device42" method="POST" update_method="PUT" path="/api/1.0/device/"/>
</api>

<mapping callback="to_d42" key="device_id">
<field resource="name" type="string" target="name"/>
<field resource="serial_number" type="string" target="serial_no"/>
<field resource="classification" type="string" target="service_level"/>
<field resource="asset_tag" type="string" target="tags"/>
<field resource="asset_tag" type="string" target="asset_no"/>
<field resource="mac_address" type="string" target="macaddress"/>
<field resource="cpu_count" type="integer" target="cpucount"/>
<field resource="cpu_core_count" type="integer" target="cpucore"/>
Expand All @@ -37,6 +36,18 @@
</mapping>
</task>

<task enable="true" description="Copy from Servicenow to Device42 (Vendors)">
<api>
<resource target="serviceNow" method="GET" path="/api/now/table/core_company"/>
<target model="company" target="device42" method="POST" update_method="PUT" path="/api/1.0/vendors/"/>
</api>

<mapping callback="to_d42" key="name">
<field resource="name" type="string" target="name"/>
<field resource="website" type="string" target="homepage"/>
</mapping>
</task>

<task enable="false" description="Copy from Device42 to Servicenow">
<api>
<target target="serviceNow" method="POST" update_method="PATCH" path="/api/now/table/cmdb_ci_aix_server"/>
Expand All @@ -63,17 +74,5 @@
</mapping>
</task>

<task enable="false" description="Copy from Servicenow to Device42">
<api>
<resource target="serviceNow" method="GET" path="/api/now/table/core_company"/>
<target model="company" target="device42" method="POST" update_method="PUT" path="/api/1.0/vendors/"/>
</api>

<mapping callback="to_d42" key="name">
<field resource="name" type="string" target="name"/>
<field resource="website" type="string" target="homepage"/>
</mapping>
</task>

</tasks>
</meta>

0 comments on commit d25b392

Please sign in to comment.