diff --git a/.gitignore b/.gitignore index 825e1763..54fddcad 100644 --- a/.gitignore +++ b/.gitignore @@ -131,5 +131,6 @@ dmypy.json # Editor .vscode +.idea repo diff --git a/nb-dt-import.py b/nb-dt-import.py index 82555283..918c94b4 100755 --- a/nb-dt-import.py +++ b/nb-dt-import.py @@ -34,6 +34,16 @@ def main(): netbox.create_manufacturers(vendors) netbox.create_module_types(module_types) + if netbox.rack_types: + settings.handle.log("Rack-Types Enabled. Creating Racks...") + files, vendors = settings.dtl_repo.get_devices( + f'{settings.dtl_repo.repo_path}/rack-types/', args.vendors) + settings.handle.log(f'{len(vendors)} Rack Vendors Found') + rack_types = settings.dtl_repo.parse_files(files, slugs=args.slugs) + settings.handle.log(f'{len(rack_types)} Rack-Types Found') + netbox.create_manufacturers(vendors) + netbox.create_rack_types(rack_types) + settings.handle.log('---') settings.handle.verbose_log( f'Script took {(datetime.now() - startTime)} to run') @@ -43,11 +53,14 @@ def main(): f'{netbox.counter["updated"]} interfaces/ports updated') settings.handle.log( f'{netbox.counter["manufacturer"]} manufacturers created') - if settings.NETBOX_FEATURES['modules']: + if netbox.modules: settings.handle.log( f'{netbox.counter["module_added"]} modules created') settings.handle.log( f'{netbox.counter["module_port_added"]} module interface / ports created') + if netbox.rack_types: + settings.handle.log( + f'{netbox.counter["rack_types_added"]} rack-types created') if __name__ == "__main__": diff --git a/netbox_api.py b/netbox_api.py index 0d11f394..086654d9 100644 --- a/netbox_api.py +++ b/netbox_api.py @@ -16,6 +16,7 @@ def __init__(self, settings): manufacturer=0, module_added=0, module_port_added=0, + rack_types_added=0, images=0, ) self.url = settings.NETBOX_URL @@ -24,6 +25,7 @@ def __init__(self, settings): self.netbox = None self.ignore_ssl = settings.IGNORE_SSL_ERRORS self.modules = False + self.rack_types = False self.new_filters = False self.connect_api() self.verify_compatibility() @@ -54,6 +56,7 @@ def verify_compatibility(self): # Might want to check for the module-types entry as well? if version_split[0] > 3 or (version_split[0] == 3 and version_split[1] >= 2): self.modules = True + self.rack_types = True # check if version >= 4.1 in order to use new filter names (https://github.com/netbox-community/netbox/issues/15410) if version_split[0] >= 4 and version_split[1] >= 1: @@ -146,6 +149,31 @@ def create_device_types(self, device_types_to_add): if saved_images: self.device_types.upload_images(self.url, self.token, saved_images, dt.id) + def create_rack_types(self, rack_types): + all_rack_types = {} + for curr_nb_mt in self.netbox.dcim.rack_types.all(): + if curr_nb_mt.manufacturer.slug not in all_rack_types: + all_rack_types[curr_nb_mt.manufacturer.slug] = {} + + all_rack_types[curr_nb_mt.manufacturer.slug][curr_nb_mt.model] = curr_nb_mt + + + for curr_mt in rack_types: + try: + rack_type_res = all_rack_types[curr_mt['manufacturer']['slug']][curr_mt["model"]] + self.handle.verbose_log(f'Rack Type Exists: {rack_type_res.manufacturer.name} - ' + + f'{rack_type_res.model} - {rack_type_res.id}') + except KeyError: + try: + rack_type_res = self.netbox.dcim.rack_types.create(curr_mt) + self.counter.update({'rack_types_added': 1}) + self.handle.verbose_log(f'Rack Type Created: {rack_type_res.manufacturer.name} - ' + + f'{rack_type_res.model} - {rack_type_res.id}') + except pynetbox.RequestError as exce: + self.handle.log(f"Error '{exce.error}' creating rack type: " + + f"{curr_mt}") + + def create_module_types(self, module_types): all_module_types = {} for curr_nb_mt in self.netbox.dcim.module_types.all(): diff --git a/settings.py b/settings.py index 797f77f7..c6819962 100644 --- a/settings.py +++ b/settings.py @@ -19,10 +19,6 @@ # optionally load device types through a space separated list as env var SLUGS = os.getenv("SLUGS", "").split() -NETBOX_FEATURES = { - 'modules': False, -} - parser = ArgumentParser(description='Import Netbox Device Types') parser.add_argument('--vendors', nargs='+', default=VENDORS, help="List of vendors to import eg. apc cisco")