def print_orphans(parsed_args): netbox_api = NetboxAPI(**get_config()["netbox"]) devices_mapper = NetboxMapper(netbox_api, "dcim", "devices") threads = parsed_args.threads if parsed_args.device_role_id: iter_devices = devices_mapper.get( role_id=parsed_args.device_role_id, limit=threads ) else: iter_devices = devices_mapper.get(limit=threads) with ThreadPoolExecutor(max_workers=threads) as executor: futures = {} for d in tqdm.tqdm(iter_devices): future = executor.submit( connection_present_for_device, d, netbox_api ) futures[future] = d for f in concurrent.futures.as_completed(futures): if not f.result(): print(futures[f].name)
def create_devices(netbox_api, devices, role_id, site_id, threads=10): device_types_mapper = NetboxMapper(netbox_api, "dcim", "device-types") platforms_mapper = NetboxMapper(netbox_api, "dcim", "platforms") caches = { "device_types": LRU(on_miss=lambda slug: next(device_types_mapper.get(slug=slug))), "platforms": LRU(on_miss=lambda slug: next(platforms_mapper.get(slug=slug))) } device_mapper = NetboxMapper(netbox_api, "dcim", "devices") with ThreadPoolExecutor(max_workers=threads) as executor: futures = [] for name, props in devices.items(): future = executor.submit(_thread_push_device, device_mapper, caches, name, props, role_id, site_id) futures.append(future) try: [future.result() in concurrent.futures.as_completed(futures)] except requests.exceptions.HTTPError as e: print(e.response.data) raise
def create_manufacturers(netbox_api): mapper = NetboxMapper(netbox_api, "dcim", "manufacturers") manufacturers = {} for name in ("Cisco", "Juniper"): name = str(name) try: manufacturer = next(mapper.get(slug=name.lower())) except StopIteration: manufacturer = mapper.post(name=name, slug=name.lower()) manufacturers[name.lower()] = manufacturer return manufacturers
def create_device_type_interfaces(netbox_api, manufacturer, device_type, ports): mapper = NetboxMapper(netbox_api, "dcim", "interface-templates") for port_type, nb in ports.items(): if nb > 1: start = 1 if manufacturer == "cisco" else 0 port_names = ("{}/{}".format(port_type, i) for i in range(start, nb + start)) else: port_names = (port_type, ) upstream_ports = { p.name for p in mapper.get(devicetype_id=device_type) } for name in port_names: if name not in upstream_ports: mapper.post(name=name, device_type=device_type)
def create_device_types(netbox_api, types, manufacturers): mapper = NetboxMapper(netbox_api, "dcim", "device-types") for name, props in types.items(): manufacturer_name = props.pop("manufacturer") name = str(name) try: t = next(mapper.get(slug=name.lower())) except StopIteration: t = mapper.post(model=name, slug=name.lower(), manufacturer=manufacturers[manufacturer_name]) update_netbox_obj_from(t, props) # Until issue #2272 is fixed on netbox t.__upstream_attrs__.remove("subdevice_role") t.put() create_device_type_interfaces(netbox_api, manufacturer_name, t, props["ports"])