Skip to content

Commit d25b392

Browse files
Merge pull request #2 from device42/D42-14394
D42 14394
2 parents 3ce26e9 + 27012df commit d25b392

File tree

2 files changed

+76
-68
lines changed

2 files changed

+76
-68
lines changed

lib.py

Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -29,61 +29,70 @@ def get_linked_objects(_target, target_api):
2929

3030
def to_d42(source, mapping, _target, _resource, target_api, resource_api):
3131
key = mapping.attrib['key']
32-
for row in source['result']:
33-
data = {}
34-
fields = mapping.findall('field')
35-
sys_id = row['sys_id']
36-
stored_device42_id = row['u_device42_id'] if len(row['u_device42_id']) > 0 else None
37-
for field in fields:
38-
if field.attrib['resource'] not in row or row[field.attrib['resource']] is None:
39-
continue
40-
41-
if field.attrib['resource'] == 'name':
42-
data[field.attrib['target']] = typer(field.attrib['type'],
43-
row[field.attrib['resource']]) + ' copied from ServiceNow'
44-
45-
elif 'sub_field' in field.attrib:
46-
sub_link = re.search(r'.service-now.com(.+)', row[field.attrib['resource']]['link'])
47-
sub_link = sub_link.group(1)
48-
sub_field_objects = resource_api.request(sub_link, 'GET')['result']
49-
data[field.attrib['target']] = typer(field.attrib['type'], sub_field_objects[field.attrib['sub_field']])
50-
51-
if 'sub_field2' in field.attrib:
52-
sub_link2 = re.search(r'.service-now.com(.+)', sub_field_objects[field.attrib['sub_field']]['link'])
53-
sub_link2 = sub_link2.group(1)
54-
sub_field2_objects = resource_api.request(sub_link2, 'GET')['result']
55-
data[field.attrib['target']] = \
56-
typer(field.attrib['type'], sub_field2_objects[field.attrib['sub_field2']])
32+
try:
33+
for row in source['result']:
34+
data = {}
35+
fields = mapping.findall('field')
36+
sys_id = row['sys_id']
37+
38+
try:
39+
stored_device42_id = row['u_device42_id'] if len(row['u_device42_id']) > 0 else None
40+
except KeyError:
41+
stored_device42_id = None
5742

43+
for field in fields:
44+
if field.attrib['resource'] not in row or row[field.attrib['resource']] is None:
45+
continue
46+
47+
if field.attrib['resource'] == 'name':
48+
data[field.attrib['target']] = typer(field.attrib['type'],
49+
row[field.attrib['resource']]) + ' copied from ServiceNow'
50+
51+
# D42
52+
elif 'sub_field' in field.attrib and 'link' in row[field.attrib['resource']]:
53+
sub_link = re.search(r'.service-now.com(.+)', row[field.attrib['resource']]['link'])
54+
sub_link = sub_link.group(1)
55+
sub_field_objects = resource_api.request(sub_link, 'GET')['result']
56+
data[field.attrib['target']] = typer(field.attrib['type'], sub_field_objects[field.attrib['sub_field']])
57+
58+
if 'sub_field2' in field.attrib and 'link' in sub_field_objects[field.attrib['sub_field']]:
59+
sub_link2 = re.search(r'.service-now.com(.+)', sub_field_objects[field.attrib['sub_field']]['link'])
60+
sub_link2 = sub_link2.group(1)
61+
sub_field2_objects = resource_api.request(sub_link2, 'GET')['result']
62+
data[field.attrib['target']] = \
63+
typer(field.attrib['type'], sub_field2_objects[field.attrib['sub_field2']])
64+
65+
else:
66+
data[field.attrib['target']] = typer(field.attrib['type'], row[field.attrib['resource']])
67+
68+
# update or create new
69+
if stored_device42_id is not None:
70+
data[key] = stored_device42_id
71+
old_name = data['name']
72+
data.pop('name', None)
73+
api_result = target_api.request(_target.attrib['path'], _target.attrib['update_method'], data)
74+
75+
if int(api_result['code']) == 3:
76+
# resend if device removed
77+
stored_device42_id = None
78+
data['name'] = old_name
79+
api_result = target_api.request(_target.attrib['path'], _target.attrib['method'], data)
5880
else:
59-
data[field.attrib['target']] = typer(field.attrib['type'], row[field.attrib['resource']])
60-
61-
# update or create new
62-
if stored_device42_id is not None:
63-
data[key] = stored_device42_id
64-
old_name = data['name']
65-
data.pop('name', None)
66-
api_result = target_api.request(_target.attrib['path'], _target.attrib['update_method'], data)
67-
68-
if int(api_result['code']) == 3:
69-
# resend if device removed
70-
stored_device42_id = None
71-
data['name'] = old_name
7281
api_result = target_api.request(_target.attrib['path'], _target.attrib['method'], data)
73-
else:
74-
api_result = target_api.request(_target.attrib['path'], _target.attrib['method'], data)
7582

76-
if DEBUG:
77-
print data
78-
print api_result
83+
if DEBUG:
84+
print data
85+
print api_result
7986

80-
# update stored device in ServiceNow
81-
if stored_device42_id is None:
82-
resource_api.request(_resource.attrib['path'] + '/' + sys_id, 'PATCH', {
83-
'u_device42_id': api_result['msg'][1]
84-
})
87+
# update stored device in ServiceNow
88+
if stored_device42_id is None:
89+
resource_api.request(_resource.attrib['path'] + '/' + sys_id, 'PATCH', {
90+
'u_device42_id': api_result['msg'][1]
91+
})
8592

86-
print '.'
93+
print '.'
94+
except KeyError:
95+
print('[Warning] No Data in Resource, Continuing')
8796

8897

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

114123
elif field.attrib['resource'] == 'mac_addresses':
115-
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
124+
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
116125
if len(row[field.attrib['resource']]) > 0:
117126
data[field.attrib['target']] = \
118127
typer(field.attrib['type'], row[field.attrib['resource']][int(field.attrib['element'])]['mac'])
119128

120129
elif field.attrib['resource'] == 'ip_addresses':
121-
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
130+
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
122131
if len(row[field.attrib['resource']]) > 0:
123132
data[field.attrib['target']] = \
124133
typer(field.attrib['type'], row[field.attrib['resource']][int(field.attrib['element'])]['ip'])
125134

126135
elif field.attrib['resource'] == 'custom_fields':
127-
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
136+
row[field.attrib['resource']] = [x for x in row[field.attrib['resource']] if x is not None]
128137
if len(row[field.attrib['resource']]) > 0:
129138
for x in row[field.attrib['resource']]:
130139
if x['key'] == str(field.attrib['key']):

mapping.xml.sample

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,17 @@
1111
</settings>
1212

1313
<tasks>
14-
15-
<task enable="true" description="Copy from Servicenow to Device42">
14+
<task enable="true" description="Copy from servicenow to Device42 (cmdb_ci_server)">
1615
<api>
17-
<resource target="serviceNow" method="GET" path="/api/now/table/cmdb_ci_aix_server"/>
16+
<resource target="serviceNow" method="GET" path="/api/now/table/cmdb_ci_server"/>
1817
<target model="device" target="device42" method="POST" update_method="PUT" path="/api/1.0/device/"/>
1918
</api>
2019

2120
<mapping callback="to_d42" key="device_id">
2221
<field resource="name" type="string" target="name"/>
2322
<field resource="serial_number" type="string" target="serial_no"/>
2423
<field resource="classification" type="string" target="service_level"/>
25-
<field resource="asset_tag" type="string" target="tags"/>
24+
<field resource="asset_tag" type="string" target="asset_no"/>
2625
<field resource="mac_address" type="string" target="macaddress"/>
2726
<field resource="cpu_count" type="integer" target="cpucount"/>
2827
<field resource="cpu_core_count" type="integer" target="cpucore"/>
@@ -37,6 +36,18 @@
3736
</mapping>
3837
</task>
3938

39+
<task enable="true" description="Copy from Servicenow to Device42 (Vendors)">
40+
<api>
41+
<resource target="serviceNow" method="GET" path="/api/now/table/core_company"/>
42+
<target model="company" target="device42" method="POST" update_method="PUT" path="/api/1.0/vendors/"/>
43+
</api>
44+
45+
<mapping callback="to_d42" key="name">
46+
<field resource="name" type="string" target="name"/>
47+
<field resource="website" type="string" target="homepage"/>
48+
</mapping>
49+
</task>
50+
4051
<task enable="false" description="Copy from Device42 to Servicenow">
4152
<api>
4253
<target target="serviceNow" method="POST" update_method="PATCH" path="/api/now/table/cmdb_ci_aix_server"/>
@@ -63,17 +74,5 @@
6374
</mapping>
6475
</task>
6576

66-
<task enable="false" description="Copy from Servicenow to Device42">
67-
<api>
68-
<resource target="serviceNow" method="GET" path="/api/now/table/core_company"/>
69-
<target model="company" target="device42" method="POST" update_method="PUT" path="/api/1.0/vendors/"/>
70-
</api>
71-
72-
<mapping callback="to_d42" key="name">
73-
<field resource="name" type="string" target="name"/>
74-
<field resource="website" type="string" target="homepage"/>
75-
</mapping>
76-
</task>
77-
7877
</tasks>
7978
</meta>

0 commit comments

Comments
 (0)