I have a custom script which I use to add/update the devices.
I have created a few custom fields recently. Please advise how should I write in the code to add/update custom field values.
Here's my code.
from extras.scripts import *
from extras.models import CustomField, CustomFieldValue
from django.contrib.contenttypes.models import ContentType
from utilities.forms import APISelect
from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, Platform, Site
from ipam.models import IPAddress
from tenancy.models import Tenant
from extras.models import Tag
name = "Inventory Tools"
class NewDeviceScript(Script):
class Meta:
name = "Add New Device to Inventory"
description = "Provision a new host under a specified site"
field_order = ['host_name', 'site_name', 'tenant', 'device_role', 'device_type', 'primary_ip', 'platform', 'status', 'tag']
commit_default = False
host_name = StringVar(
label = 'Hostname',
description = "Enter the devices hostname as it is configured on the box"
)
site_name = ObjectVar(
label = 'DC/Office',
queryset = Site.objects.all()
)
tenant = ObjectVar(
label = 'Tenant',
queryset = Tenant.objects.all()
)
device_role = ObjectVar(
label = 'Device Role',
description = "What is the function of this device?",
queryset = DeviceRole.objects.all(),
widget = APISelect(
api_url = '/api/dcim/device-roles/',
display_field = 'name'
)
)
device_type = ObjectVar(
label = 'Device Model',
description = "What is the model for this device?",
queryset = DeviceType.objects.all(),
widget = APISelect(
api_url = '/api/dcim/device-types/',
display_field = 'display_name'
)
)
platform = ObjectVar(
required = False,
label = 'Device OS',
queryset = Platform.objects.all(),
widget = APISelect(
api_url = '/api/dcim/platforms/',
display_field = 'display_name'
)
)
primary_ip = IPAddressWithMaskVar(
label = 'Primary IP',
description = 'IP Address for MGMT Interface (i.e. alias entry)'
)
tag = ObjectVar(
label = 'Tag',
description = "Please select [no_backup] if you wish to exclude the backing up of this device",
queryset = Tag.objects.all()
)
status_list = (
('active', 'Active'),
('inventory', 'Inventory'),
('planned', 'Planned'),
('reserved', 'Reserved'),
('staged', 'Staged'),
)
status = ChoiceVar(choices = status_list)
def run(self, data, commit):
device, created = Device.objects.get_or_create(
name=data['host_name'],
defaults={'status': data['status'],
'device_type': data['device_type'],
'device_role': data['device_role'],
'site': data['site_name'],
'tenant': data['tenant']}
)
if created == True:
device.tags.add(data['tag'])
device.save()
self.log_success("Added new Device **{}**".format(device))
else:
self.log_warning("Existing Device **{}**".format(device))
if created == True and data['primary_ip']:
ipv4, created = IPAddress.objects.get_or_create(address=data['primary_ip'],defaults={'status':'active'})
mgmt_int = Interface.objects.get(device=device,mgmt_only=True)
if created == True:
ipv4.save()
self.log_success("IP Address **{}** created".format(ipv4))
else:
self.log_info("Existing IP Address **{}** to be used".format(ipv4))
ipv4.interface = mgmt_int
ipv4.save()
self.log_success("IP Address `{}` assigned to interface **{}**".format(ipv4, mgmt_int))
device.primary_ip4 = ipv4
device.save()
self.log_success("IP Address `{}` set as primary for **{}**".format(ipv4, device))
if created == True and data['platform']:
device.platform = data['platform']
device.save()
self.log_success("OS/Platform `{}` set for **{}**".format(device.platform, device))
if created == True and data['tag']:
device.tag = data['tag']
device.save()
self.log_success("tag `{}` set for **{}**".format(device.tag, device))
class UpdateDeviceScript(Script):
class Meta:
name = "Update/Decomm a Device from Inventory"
description = "Update a host under a specified site"
field_order = ['host_name', 'device_role', 'device_type', 'platform', 'status', 'tag']
commit_default = False
host_name = ObjectVar(
label = 'Hostname',
queryset = Device.objects.all(),
widget = APISelect(
api_url = '/api/dcim/devices/',
display_field = 'name'
)
)
device_role = ObjectVar(
required = False,
label = 'Device Role',
description = "What is the new function of this device?",
queryset = DeviceRole.objects.all(),
widget = APISelect(
api_url = '/api/dcim/device-roles/',
display_field = 'name'
)
)
device_type = ObjectVar(
required = False,
label = 'Device Model',
description = "What is the new type of this device?",
queryset = DeviceType.objects.all(),
widget = APISelect(
api_url = '/api/dcim/device-types/',
display_field = 'display_name'
)
)
platform = ObjectVar(
required = False,
label = 'Device OS',
description = "What is the new platform of this device?",
queryset = Platform.objects.all(),
widget = APISelect(
api_url = '/api/dcim/platforms/',
display_field = 'display_name'
)
)
tag = ObjectVar(
label = 'Tag',
description = "Please select [no_backup] if you wish to exclude the backing up of this device.",
queryset = Tag.objects.all()
)
status_list = (
('',''),
('active', 'Active'),
('decommissioning', 'Decomm'),
('inventory', 'Inventory'),
('offline', 'Maintenance'),
('planned', 'Planned'),
('reserved', 'Reserved'),
('staged', 'Staged'),
)
status = ChoiceVar(
required = False,
choices = status_list
)
def run(self, data, commit):
device = Device.objects.get(name=data['host_name'])
if data['device_role']:
device.device_role = data['device_role']
device.save()
self.log_success("Device Role `{}` set for **{}**".format(device.device_role, device))
if data['device_type']:
device.device_type = data['device_type']
device.save()
self.log_success("Device Type `{}` set for **{}**".format(device.device_type.display_name, device))
if data['platform']:
device.platform = data['platform']
device.save()
self.log_success("OS/Platform `{}` set for **{}**".format(device.platform, device))
if data['status']:
device.status = data['status']
device.save()
self.log_success("Device **{}** set to status `{}`".format(device, device.status))
if data['tag']:
device.tags.add(data['tag'])
device.tag = data['tag']
device.save()
self.log_success("tag `{}` set for **{}**".format(device.tag, device))
Thanks in advance.