Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# mypy: ignore-errors
"""
This module contains all methods
to communicate with the
NetBox API endpoint: Data Center Infrastructure Main (dcim)
"""
import pynetbox
import pydantic
# Define device models
class Manufacturer(pydantic.BaseModel):
"""
The device manufacturer.
Is mandatory to create a device in netbox.
Is needed to define the device type.
"""
name: str
slug: str
class DeviceType(pydantic.BaseModel):
"""
The device type for a device.
Is mandatory to create a device.
The manufacturer should be created first to get the manufacturer id,
which is defined here as int.
"""
manufacturer: int
model: str
slug: str
class DeviceRole(pydantic.BaseModel):
"""
The role of a device in netbox.
Is mandatory to create a device.
"""
name: str
slug: str
class Site(pydantic.BaseModel):
"""
The site where to place the device.
Is mandatory to create a device.
"""
name: str
slug: str
def connect(api, token):
"""
Creates a netbox client to communicate
with the NetBox endpoints
The responses of the client are returned mostly as Records or RecordSet.
For more details see the dcim.py file in the
pynetbox package.
To create the client a main URL to NetBox is required. Something like:
api = 'http://127.0.0.1:8001'
To create a token, login to the NetBox web frontend or
post request directly a token from the NetBox API:
http://127.0.0.1:8001/api/users/tokens/provision/
"""
return pynetbox.api(api, token=token)
def get_all_devices(nbclient):
return list(nbclient.dcim.devices.all())
# We need sometimes a specific device
# for creating devices
def get_device_by_name(nbclient, device_name):
device = nbclient.dcim.devices.get(name=device_name)
if device is None:
raise ValueError(f"Device: {device_name} not found")
else:
return device
# get all interfaces for a device
def get_interfaces_by_device(nbclient, device_name: str, speed: str):
device = get_device_by_name(nbclient, device_name)
return list(nbclient.dcim.interfaces.filter(device_id=device.id,
enabled=False,
mark_connected=False,
speed=speed
# Create a interface
def create_interface(nbclient,
iface_name: str,
type: str,
device_name: str) -> dict:
"""
Creates a new interface on
a device, where device is defined by name.
The type parameter can be 1000base-t, 10gbase-t, lag...
For more details on type definidtion have a look in
choises.py in the netbox API implementation in module dcim.
Returns the new interface object as dict.
"""
device = get_device_by_name(nbclient, device_name)
new_iface = nbclient.dcim.interfaces.create(name=iface_name,
type=type,
enabled=False,
mark_connected=False,
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
device=device.id)
return dict(new_iface)
def create_device_type(nbclient, manufacturer: str,
model: str,
slug: str) -> dict:
# First get manufacturer id
manufacturer_id = int(nbclient.dcim.manufacturers.get(name=manufacturer).id)
device_type = DeviceType(**{'manufacturer': manufacturer_id, 'model': model, 'slug': slug})
# Convert the format from DeviceType to dict
device_type = dict(device_type)
# Create device type
device_type = nbclient.dcim.device_types.create(device_type)
return dict(device_type)
def create_device_role(nbclient, name: str, slug: str) -> dict:
device_role = DeviceRole(**{'name': name, 'slug': slug})
device_role = dict(device_role)
device_role = nbclient.dcim.device_roles.create(device_role)
return dict(device_role)
def create_device_site(nbclient, name: str, slug: str) -> dict:
device_site = Site(**{'name': name, 'slug': slug})
device_site = dict(device_site)
device_site = nbclient.dcim.sites.create(device_site)
return dict(device_site)
def create_device_manufacturer(nbclient, name: str, slug: str) -> dict:
device_manufacturer = Manufacturer(**{'name': name, 'slug': slug})
device_manufacturer = dict(device_manufacturer)
device_manufacturer = nbclient.dcim.manufacturers.create(device_manufacturer)
return dict(device_manufacturer)
def create_device(nbclient,
fqdn: str,
model: str,
device_role: str,
site: str) -> dict:
""" Creates a device and
returns the new device as a dict
"""
# Get device type id
device_type = nbclient.dcim.device_types.get(model=model)
# Get device role id
device_role = nbclient.dcim.device_roles.get(name=device_role)
# Get site id
device_site = nbclient.dcim.sites.get(name=site)
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# Create new device
new_device = nbclient.dcim.devices.create(name=fqdn,
device_type=device_type.id,
role=device_role.id,
site=device_site.id)
return dict(new_device)
def attach_interface_to_lag(nbclient, device_name: str, lag_name: str, iface_name: str) -> dict:
"""
Assign a given interface to a lag.
Returns the lag object with the assignend interfaces
"""
# Get device id
device = get_device_by_name(nbclient, device_name)
# Now get interface for device
iface = nbclient.dcim.interfaces.get(name=iface_name, device_id=device.id)
# Get lag
lag = nbclient.dcim.interfaces.get(name=lag_name, device_id=device.id)
# Assign interface to lag
iface.lag = lag.id
# Update interface
updated_iface = nbclient.dcim.interfaces.update(iface)
return dict(updated_iface)
if __name__ == "__main__":
print(dict(create_device_manufacturer("Juniper", "juniper")))