diff --git a/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py b/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py index 937177a..9cc37db 100644 --- a/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py +++ b/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py @@ -12,6 +12,7 @@ from sqlalchemy import func from api.extensions import db from api.lib.cmdb.auto_discovery.const import CLOUD_MAP from api.lib.cmdb.auto_discovery.const import DEFAULT_INNER +from api.lib.cmdb.auto_discovery.const import NET_DEVICE_NAMES from api.lib.cmdb.auto_discovery.const import PRIVILEGED_USERS from api.lib.cmdb.cache import AttributeCache from api.lib.cmdb.cache import AutoDiscoveryMappingCache @@ -252,6 +253,7 @@ class AutoDiscoveryCITypeCRUD(DBMixin): :return: """ result = [] + db.session.commit() rules = cls.cls.get_by(to_dict=True) for rule in rules: @@ -718,6 +720,12 @@ class AutoDiscoveryCICRUD(DBMixin): build_relations_for_ad_accept.apply_async(args=(adc.to_dict(), ci_id, ad_key2attr), queue=CMDB_QUEUE) + ci_type = CITypeCache.get(adc.type_id) + if ci_type and ci_type.name in NET_DEVICE_NAMES and 'ports' in adc.instance: + from api.tasks.cmdb import add_net_device_ports + add_net_device_ports.apply_async(args=(ci_id, adc.instance['ports']), + queue=CMDB_QUEUE) + adc.update(is_accept=True, accept_by=nickname or current_user.nickname, accept_time=datetime.datetime.now(), diff --git a/cmdb-api/api/lib/cmdb/auto_discovery/const.py b/cmdb-api/api/lib/cmdb/auto_discovery/const.py index 4c731c1..52cb93d 100644 --- a/cmdb-api/api/lib/cmdb/auto_discovery/const.py +++ b/cmdb-api/api/lib/cmdb/auto_discovery/const.py @@ -4,6 +4,8 @@ from api.lib.cmdb.const import AutoDiscoveryType PRIVILEGED_USERS = ("cmdb_agent", "worker", "admin") +NET_DEVICE_NAMES = {"switch", 'router', 'firewall', 'printer'} + DEFAULT_INNER = [ dict(name="阿里云", en="aliyun", type=AutoDiscoveryType.HTTP, is_inner=True, is_plugin=False, option={'icon': {'name': 'caise-aliyun'}, "en": "aliyun"}), @@ -41,8 +43,12 @@ DEFAULT_INNER = [ option={'icon': {'name': 'caise-luyouqi'}}), dict(name="防火墙", type=AutoDiscoveryType.SNMP, is_inner=True, is_plugin=False, option={'icon': {'name': 'caise-fanghuoqiang'}}), - dict(name="打印机", type=AutoDiscoveryType.SNMP, is_inner=True, is_plugin=False, - option={'icon': {'name': 'caise-dayinji'}}), + # dict(name="打印机", type=AutoDiscoveryType.SNMP, is_inner=True, is_plugin=False, + # option={'icon': {'name': 'caise-dayinji'}}), + dict(name="光纤交换机", type=AutoDiscoveryType.SNMP, is_inner=True, is_plugin=False, + option={'icon': {'name': 'caise-fiber'}}), + dict(name="F5", type=AutoDiscoveryType.SNMP, is_inner=True, is_plugin=False, + option={'icon': {'name': 'caise-F5'}}), ] CLOUD_MAP = { diff --git a/cmdb-api/api/lib/cmdb/auto_discovery/templates/net_device.json b/cmdb-api/api/lib/cmdb/auto_discovery/templates/net_device.json index 026b3a9..ae24886 100644 --- a/cmdb-api/api/lib/cmdb/auto_discovery/templates/net_device.json +++ b/cmdb-api/api/lib/cmdb/auto_discovery/templates/net_device.json @@ -1,37 +1,74 @@ -[{ - "name":"manufacturer", - "type": "文本", - "example":"HUAWEI Technology Co.,Ltd", - "desc":"制造产商" -},{ - "name":"sn", - "type": "文本", - "example":"102030059898", - "desc":"设备序列号" -},{ - "name":"device_name", - "type": "文本", - "example":"USG6525E", - "desc":"设备名称" -},{ - "name":"device_model", - "type": "文本", - "example":"2011.2.321.1.205", - "desc":"设备细分类型 结合相关产商获取相应的产品类型" -},{ - "name":"description", - "type": "文本", - "example":"Huawei Vwersatile Routing Platform Software", - "desc":"设备描述" -},{ - "name":"manager_ip", - "type": "文本", - "example":"192.168.1.1", - "desc":"管理ip" -}, { - "name":"ips", - "type": "文本、多值", - "example":"192.168.1.1, 192.168.1.2", - "desc":"ips" -} +[ + { + "name": "manufacturer", + "type": "文本", + "example": "Huawei", + "desc": "制造产商" + }, + { + "name": "sn", + "type": "文本", + "example": "102030059898", + "desc": "设备序列号" + }, + { + "name": "name", + "type": "文本", + "example": "USG6525E", + "desc": "设备名称" + }, + { + "name": "model", + "type": "文本", + "example": "2011.2.321.1.205", + "desc": "设备细分类型 结合相关产商获取相应的产品类型" + }, + { + "name": "description", + "type": "文本", + "example": "Huawei Vwersatile Routing Platform Software", + "desc": "设备描述" + }, + { + "name": "manager_ip", + "type": "文本", + "example": "192.168.1.1", + "desc": "管理ip" + }, + { + "name": "ips", + "type": "文本、多值", + "example": "192.168.1.1, 192.168.1.2", + "desc": "ips" + }, + { + "name": "uptime", + "type": "文本", + "example": "2023-04-15 10:00:00", + "desc": "启动时间" + }, + { + "name": "snmp_version", + "type": "文本", + "example": "v2c", + "desc": "SNMP版本" + }, + { + "name": "port_num", + "type": "整数", + "example": 24, + "desc": "端口数量" + }, + { + "name": "ports", + "type": "json", + "example": "", + "desc": "设备的端口列表" + }, + { + "name": "neighbors", + "type": "json", + "example": "", + "desc": "设备的邻居列表" + } ] \ No newline at end of file diff --git a/cmdb-api/api/tasks/cmdb.py b/cmdb-api/api/tasks/cmdb.py index 3223100..cf4567d 100644 --- a/cmdb-api/api/tasks/cmdb.py +++ b/cmdb-api/api/tasks/cmdb.py @@ -376,6 +376,29 @@ def build_relations_for_ad_accept(adc, ci_id, ad_key2attr): pass +@celery.task(name="cmdb.add_net_device_ports", queue=CMDB_QUEUE) +@reconnect_db +def add_net_device_ports(ci_id, ports): + from api.lib.cmdb.ci import CIRelationManager + from api.lib.cmdb.ci import CIManager + from api.lib.cmdb.cache import CITypeCache + + port_type = CITypeCache.get("net_port") + if not port_type: + current_app.logger.warning("CIType net port is not found") + return + + for port in ports: + try: + port_id = CIManager.add(port_type.id, is_auto_discovery=True, _is_admin=True, **port) + + CIRelationManager.add(ci_id, port_id, + valid=False, + source=RelationSourceEnum.AUTO_DISCOVERY) + except Exception as e: + current_app.logger.warning("add_net_device_ports failed: {}".format(e)) + + @celery.task(name="cmdb.dcim_calc_u_free_count", queue=CMDB_QUEUE) @reconnect_db def dcim_calc_u_free_count():