diff --git a/core/etl/loader/managedobject.py b/core/etl/loader/managedobject.py index 7dc6908674c69b4658794502149c7380eda00f9e..ad99302af5aa48834f760a35083ae09897ce81dc 100644 --- a/core/etl/loader/managedobject.py +++ b/core/etl/loader/managedobject.py @@ -2,7 +2,7 @@ # ---------------------------------------------------------------------- # Managed Object loader # ---------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # ---------------------------------------------------------------------- @@ -49,6 +49,7 @@ class ManagedObjectLoader(BaseLoader): "tt_system", "tt_queue", "tt_system_id", + "fm_pool", ] mapped_fields = { @@ -72,6 +73,7 @@ class ManagedObjectLoader(BaseLoader): """ v = super(ManagedObjectLoader, self).clean(row) v["pool"] = self.pools[v["pool"]] + v["fm_pool"] = self.pools[v["fm_pool"]] if v["fm_pool"] else v["pool"] if "tags" in v: v["tags"] = ( [x.strip().strip('"') for x in v["tags"].split(",") if x.strip()] diff --git a/docs/src/en/api/datastream-cfgping.rst b/docs/src/en/api/datastream-cfgping.rst index 31ac053833f188efe498c8e723579aea9c15cbc7..94082b34701ffdc415d05a9734d5993add78c244 100644 --- a/docs/src/en/api/datastream-cfgping.rst +++ b/docs/src/en/api/datastream-cfgping.rst @@ -25,6 +25,8 @@ Fields +-----------------+-----------------+--------------------------------------------------------------------------------+ | pool | String | :ref:`Pool's name` | +-----------------+-----------------+--------------------------------------------------------------------------------+ +| fm_pool | String | :ref:`Pool's name` for FM event processing | ++-----------------+-----------------+--------------------------------------------------------------------------------+ | interval | Integer | Probing rounds interval in seconds | +-----------------+-----------------+--------------------------------------------------------------------------------+ | policy | String | Probing policy: | diff --git a/docs/src/en/api/datastream-cfgsyslog.rst b/docs/src/en/api/datastream-cfgsyslog.rst index 7b56533b7fcf0db68ed4e11ad57a71cec8b46ada..39be9eb5ececb1de51a7ffd5d30b2c3820edd4fe 100644 --- a/docs/src/en/api/datastream-cfgsyslog.rst +++ b/docs/src/en/api/datastream-cfgsyslog.rst @@ -16,17 +16,19 @@ for :ref:`syslogcollector` service Fields ------ -+-----------+-----------------+------------------------------------------------------+ -| Name | Type | Description | -+===========+=================+======================================================+ -| id | String | :ref:`Managed Object's` id | -+-----------+-----------------+------------------------------------------------------+ -| change_id | String | :ref:`Record's change id` | -+-----------+-----------------+------------------------------------------------------+ -| pool | String | :ref:`Pool's name` | -+-----------+-----------------+------------------------------------------------------+ -| addresses | Array of String | List of syslog sources' IP addresses | -+-----------+-----------------+------------------------------------------------------+ ++-----------+-----------------+------------------------------------------------------------+ +| Name | Type | Description | ++===========+=================+============================================================+ +| id | String | :ref:`Managed Object's` id | ++-----------+-----------------+------------------------------------------------------------+ +| change_id | String | :ref:`Record's change id` | ++-----------+-----------------+------------------------------------------------------------+ +| pool | String | :ref:`Pool's name` | ++-----------+-----------------+------------------------------------------------------------+ +| fm_pool | String | :ref:`Pool's name` for FM event processing | ++-----------+-----------------+------------------------------------------------------------+ +| addresses | Array of String | List of syslog sources' IP addresses | ++-----------+-----------------+------------------------------------------------------------+ Filters ------- diff --git a/docs/src/en/api/datastream-cfgtrap.rst b/docs/src/en/api/datastream-cfgtrap.rst index 9cf4ef0f9fe5a917c253c4bf906ae476e66fbb90..33b4361ce432023bcb1d2c773ddc5a48dd5e1a2e 100644 --- a/docs/src/en/api/datastream-cfgtrap.rst +++ b/docs/src/en/api/datastream-cfgtrap.rst @@ -16,17 +16,19 @@ for :ref:`services-trapcollector` service Fields ------ -+-----------+-----------------+------------------------------------------------------+ -| Name | Type | Description | -+===========+=================+======================================================+ -| id | String | :ref:`Managed Object's` id | -+-----------+-----------------+------------------------------------------------------+ -| change_id | String | :ref:`Record's change id` | -+-----------+-----------------+------------------------------------------------------+ -| pool | String | :ref:`Pool's name` | -+-----------+-----------------+------------------------------------------------------+ -| addresses | Array of String | List of SNMP Trap sources' IP addresses | -+-----------+-----------------+------------------------------------------------------+ ++-----------+-----------------+------------------------------------------------------------+ +| Name | Type | Description | ++===========+=================+============================================================+ +| id | String | :ref:`Managed Object's` id | ++-----------+-----------------+------------------------------------------------------------+ +| change_id | String | :ref:`Record's change id` | ++-----------+-----------------+------------------------------------------------------------+ +| pool | String | :ref:`Pool's name` | ++-----------+-----------------+------------------------------------------------------------+ +| fm_pool | String | :ref:`Pool's name` for FM event processing | ++-----------+-----------------+------------------------------------------------------------+ +| addresses | Array of String | List of SNMP Trap sources' IP addresses | ++-----------+-----------------+------------------------------------------------------------+ Filters diff --git a/fm/handlers/alarm/status.py b/fm/handlers/alarm/status.py index 99fc2f9d6c463639177ed3bb58bd51faa5dfb9a0..8e5b8a273468f2710e8f4e6ed56630ce346a484a 100644 --- a/fm/handlers/alarm/status.py +++ b/fm/handlers/alarm/status.py @@ -2,7 +2,7 @@ # --------------------------------------------------------------------- # Managed object status checks # --------------------------------------------------------------------- -# Copyright (C) 2007-2016 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -44,7 +44,7 @@ def check_down(alarm): "noc.fm.handlers.alarm.status.close_oo_alarm", delay=OO_CLOSE_DELAY, scheduler="correlator", - pool=alarm.managed_object.pool.name, + pool=alarm.managed_object.get_effective_fm_pool().name, alarm_id=alarm.id, timestamp=last, ) diff --git a/fm/models/activealarm.py b/fm/models/activealarm.py index e0d57a63157a88f0b396c9971c14c3d4ed9ba8fe..f9f25fd4740cd060c05af94eb415b069d483fc7d 100644 --- a/fm/models/activealarm.py +++ b/fm/models/activealarm.py @@ -308,7 +308,7 @@ class ActiveAlarm(Document): call_later( "noc.services.correlator.check.check_close_consequence", scheduler="correlator", - pool=self.managed_object.pool.name, + pool=self.managed_object.get_effective_fm_pool().name, delay=t, alarm_id=d["_id"], ) diff --git a/fm/models/activeevent.py b/fm/models/activeevent.py index 98fafde5f531772a39c698be1d9f6fcfc2eeb664..fb7835f918e0504c998d388acf3d16710f51edba 100644 --- a/fm/models/activeevent.py +++ b/fm/models/activeevent.py @@ -2,7 +2,7 @@ # --------------------------------------------------------------------- # ActiveEvent model # --------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -98,7 +98,7 @@ class ActiveEvent(Document): "object": self.managed_object.id, "data": data, } - nsq_pub("events.%s" % self.managed_object.pool.name, msg) + nsq_pub("events.%s" % self.managed_object.get_effective_fm_pool().name, msg) self.delete() def mark_as_failed(self, version, traceback): diff --git a/fm/models/alarmdiagnosticconfig.py b/fm/models/alarmdiagnosticconfig.py index e4c08acd9946faefa0fb55f4fa7a1a3ff2bbb9cf..b34707c37d9b41369421cd3bb53998b0997d3ec1 100644 --- a/fm/models/alarmdiagnosticconfig.py +++ b/fm/models/alarmdiagnosticconfig.py @@ -2,7 +2,7 @@ # --------------------------------------------------------------------- # AlarmDiagnosticConfig model # --------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -134,7 +134,7 @@ class AlarmDiagnosticConfig(Document): call_later( "noc.fm.models.alarmdiagnosticconfig.on_raise", scheduler="correlator", - pool=alarm.managed_object.pool.name, + pool=alarm.managed_object.get_effective_fm_pool().name, delay=delay, alarm=alarm.id, cfg=r_cfg[delay], @@ -145,7 +145,7 @@ class AlarmDiagnosticConfig(Document): "noc.fm.models.alarmdiagnosticconfig.periodic", scheduler="correlator", max_runs=PERIODIC_JOB_MAX_RUNS, - pool=alarm.managed_object.pool.name, + pool=alarm.managed_object.get_effective_fm_pool().name, delay=delay, alarm=alarm.id, cfg={"cfg": p_cfg[delay], "delay": delay}, @@ -184,7 +184,7 @@ class AlarmDiagnosticConfig(Document): call_later( "noc.fm.models.alarmdiagnosticconfig.on_clear", scheduler="correlator", - pool=alarm.managed_object.pool.name, + pool=alarm.managed_object.get_effective_fm_pool().name, delay=delay, alarm=alarm.id, cfg=cfg[delay], diff --git a/fm/models/failedevent.py b/fm/models/failedevent.py index 6b7ad3742c3050ee5b4e47f0a99bc8f7fe28acb5..ea2b8706dbbd9967b54c3e3bbe7f1bec6b5ba56f 100644 --- a/fm/models/failedevent.py +++ b/fm/models/failedevent.py @@ -2,7 +2,7 @@ # --------------------------------------------------------------------- # FailedEvent model # --------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -57,7 +57,7 @@ class FailedEvent(Document): "object": self.managed_object.id, "data": data, } - nsq_pub("events.%s" % self.managed_object.pool.name, msg) + nsq_pub("events.%s" % self.managed_object.get_effective_fm_pool().name, msg) self.delete() def log_message(self, message): diff --git a/main/models/pool.py b/main/models/pool.py index bc539a3c26d4a520f9ff249ee40245d691543aa7..a1a1080d45232b2c2c24dbdc2bac734bb61dc1d6 100644 --- a/main/models/pool.py +++ b/main/models/pool.py @@ -2,7 +2,7 @@ # --------------------------------------------------------------------- # Pool model # --------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -27,6 +27,7 @@ id_lock = threading.Lock() check=[ ("sa.AdministrativeDomain", "default_pool"), ("sa.ManagedObject", "pool"), + ("sa.ManagedObject", "fm_pool"), ("sa.ManagedObjectSelector", "filter_pool") # ("fm.EscalationItem", "administrative_domain") ] diff --git a/sa/migrations/0203_managedobject_fm_pool.py b/sa/migrations/0203_managedobject_fm_pool.py new file mode 100644 index 0000000000000000000000000000000000000000..22155bf11177f900989e238fbc2ccd9daefabaf5 --- /dev/null +++ b/sa/migrations/0203_managedobject_fm_pool.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# ---------------------------------------------------------------------- +# managedobject.fm_pool +# ---------------------------------------------------------------------- +# Copyright (C) 2007-2020 The NOC Project +# See LICENSE for details +# ---------------------------------------------------------------------- + +# NOC modules +from noc.core.migration.base import BaseMigration +from noc.core.model.fields import DocumentReferenceField + + +class Migration(BaseMigration): + def migrate(self): + self.db.add_column( + "sa_managedobject", "fm_pool", DocumentReferenceField("self", null=True, blank=True) + ) diff --git a/sa/models/managedobject.py b/sa/models/managedobject.py index 9dbab1d50681c369fca4ab369def85243a277b85..5124a5832353593f87808edf949d323cd28d9840 100644 --- a/sa/models/managedobject.py +++ b/sa/models/managedobject.py @@ -156,6 +156,8 @@ class ManagedObject(NOCModel): ) segment = DocumentReferenceField(NetworkSegment, null=False, blank=False) pool = DocumentReferenceField(Pool, null=False, blank=False) + # Optional pool to route FM events + fm_pool = DocumentReferenceField(Pool, null=True, blank=True) profile = DocumentReferenceField(Profile, null=False, blank=False) vendor = DocumentReferenceField(Vendor, null=True, blank=True) platform = DocumentReferenceField(Platform, null=True, blank=True) @@ -548,6 +550,7 @@ class ManagedObject(NOCModel): "bi_id", "is_managed", "pool", + "fm_pool", "address", "object_profile", "time_pattern", @@ -561,6 +564,7 @@ class ManagedObject(NOCModel): "bi_id", "is_managed", "pool", + "fm_pool", "address", "object_profile", "event_processing_policy", @@ -576,6 +580,7 @@ class ManagedObject(NOCModel): "bi_id", "is_managed", "pool", + "fm_pool", "address", "object_profile", "event_processing_policy", @@ -1751,6 +1756,11 @@ class ManagedObject(NOCModel): for r in o.iter_scope(scope): yield r + def get_effective_fm_pool(self): + if self.fm_pool: + return self.fm_pool + return self.pool + @on_save @six.python_2_unicode_compatible diff --git a/services/classifier/service.py b/services/classifier/service.py index 2c51e6888f7a18cc436574c7afaf4407aba655a0..7319a19f86ab6eb880b03ebc422711ae0d4655c8 100755 --- a/services/classifier/service.py +++ b/services/classifier/service.py @@ -3,7 +3,7 @@ # --------------------------------------------------------------------- # Classifier service # --------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -545,7 +545,7 @@ class ClassifierService(Service): cache.set("activeent-%s" % event.id, event, ttl=900) # @todo: Use config.pool instead self.pub( - "correlator.dispose.%s" % event.managed_object.pool.name, + "correlator.dispose.%s" % event.managed_object.get_effective_fm_pool().name, {"event_id": str(event.id), "event": event.to_json()}, ) metrics[CR_DISPOSED] += 1 diff --git a/services/datastream/streams/cfgping.py b/services/datastream/streams/cfgping.py index b6d96896cae0ed6bddec1764e34c4164cd63b196..d7d9905b9a04bd26c787d7c67eee68032af05d7c 100644 --- a/services/datastream/streams/cfgping.py +++ b/services/datastream/streams/cfgping.py @@ -2,7 +2,7 @@ # ---------------------------------------------------------------------- # cfgping datastream # ---------------------------------------------------------------------- -# Copyright (C) 2007-2018 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # ---------------------------------------------------------------------- @@ -25,6 +25,7 @@ class CfgPingDataStream(DataStream): "bi_id", "is_managed", "pool", + "fm_pool", "address", "time_pattern", "object_profile__enable_ping", @@ -44,6 +45,7 @@ class CfgPingDataStream(DataStream): bi_id, is_managed, pool, + fm_pool, address, time_pattern, enable_ping, @@ -63,9 +65,11 @@ class CfgPingDataStream(DataStream): or ping_interval < 0 ): raise KeyError() + pool = str(Pool.get_by_id(pool).name) r = { "id": str(mo_id), - "pool": str(Pool.get_by_id(pool).name), + "pool": pool, + "fm_pool": str(Pool.get_by_id(fm_pool).name) if fm_pool else pool, "address": str(address), "interval": ping_interval, "policy": ping_policy, diff --git a/services/datastream/streams/cfgsyslog.py b/services/datastream/streams/cfgsyslog.py index 722a288660cc817e13c67b1b0b47b02ee8f0984b..9222196915122d02e8f0afd3299f6d5cecee6edb 100644 --- a/services/datastream/streams/cfgsyslog.py +++ b/services/datastream/streams/cfgsyslog.py @@ -2,7 +2,7 @@ # ---------------------------------------------------------------------- # cfgsyslog datastream # ---------------------------------------------------------------------- -# Copyright (C) 2007-2018 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # ---------------------------------------------------------------------- @@ -23,6 +23,7 @@ class CfgSyslogDataStream(DataStream): "bi_id", "is_managed", "pool", + "fm_pool", "address", "syslog_source_ip", "syslog_source_type", @@ -38,6 +39,7 @@ class CfgSyslogDataStream(DataStream): bi_id, is_managed, pool, + fm_pool, address, syslog_source_ip, syslog_source_type, @@ -65,10 +67,12 @@ class CfgSyslogDataStream(DataStream): if not effective_epp and not effective_sap: raise KeyError() # Process syslog sources + pool = str(Pool.get_by_id(pool).name) r = { "id": str(mo_id), "bi_id": str(bi_id), - "pool": str(Pool.get_by_id(pool).name), + "pool": pool, + "fm_pool": str(Pool.get_by_id(fm_pool).name) if fm_pool else pool, "addresses": [], "process_events": effective_epp, "archive_events": effective_sap, diff --git a/services/datastream/streams/cfgtrap.py b/services/datastream/streams/cfgtrap.py index 8a9fc2c37e26e27aaa2c274bce7a50772878fcae..4424f712974a87382ac1e669a028377080927aa4 100644 --- a/services/datastream/streams/cfgtrap.py +++ b/services/datastream/streams/cfgtrap.py @@ -2,7 +2,7 @@ # ---------------------------------------------------------------------- # cfgtrap datastream # ---------------------------------------------------------------------- -# Copyright (C) 2007-2018 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # ---------------------------------------------------------------------- @@ -22,6 +22,7 @@ class CfgTrapDataStream(DataStream): "id", "is_managed", "pool", + "fm_pool", "address", "trap_community", "trap_source_ip", @@ -35,6 +36,7 @@ class CfgTrapDataStream(DataStream): mo_id, is_managed, pool, + fm_pool, address, trap_community, trap_source_ip, @@ -51,9 +53,11 @@ class CfgTrapDataStream(DataStream): ): raise KeyError() # Process trap sources + pool = str(Pool.get_by_id(pool).name) r = { "id": str(mo_id), - "pool": str(Pool.get_by_id(pool).name), + "pool": pool, + "fm_pool": str(Pool.get_by_id(fm_pool).name) if fm_pool else pool, "addresses": [], "trap_community": trap_community, } diff --git a/services/ping/probesetting.py b/services/ping/probesetting.py index b06b42e1c8491338ed61b058d6467ccdbcc07bcd..17c4a5d357eee4a3aabaa5247a3bbf273b0eb0b2 100644 --- a/services/ping/probesetting.py +++ b/services/ping/probesetting.py @@ -2,13 +2,16 @@ # ---------------------------------------------------------------------- # Probe Setting # ---------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # ---------------------------------------------------------------------- # Third-party modules import cachetools +# NOC modules +from noc.config import config + tp_cache = {} POLICY_MAP = {"f": 0, "a": 1} @@ -32,6 +35,7 @@ class ProbeSetting(object): "time_cond", "bi_id", "task", + "fm_pool", ] def __init__( @@ -49,6 +53,7 @@ class ProbeSetting(object): report_attempts=False, time_expr=None, bi_id=None, + fm_pool=None, *args, **kwargs ): @@ -68,6 +73,7 @@ class ProbeSetting(object): self.time_cond = self.compile(time_expr) self.task = None self.bi_id = bi_id + self.fm_pool = fm_pool or config.pool def update( self, @@ -79,6 +85,7 @@ class ProbeSetting(object): count=3, timeout=1000, time_expr=None, + fm_pool=None, *args, **kwargs ): @@ -91,6 +98,7 @@ class ProbeSetting(object): self.report_attempts = report_attempts self.time_expr = time_expr self.time_cond = self.compile(time_expr) + self.fm_pool = fm_pool or config.pool def is_differ(self, data): return ( @@ -102,6 +110,7 @@ class ProbeSetting(object): or self.report_rtt != data.get("report_rtt", False) or self.report_attempts != data.get("report_attempts", False) or self.time_expr != data.get("time_expr") + or self.fm_pool != data.get("fm_pool") ) @classmethod diff --git a/services/ping/service.py b/services/ping/service.py index 0432458b66aed98bf85b9b053ca28feb651870a1..a13bb86febf8742be460c68178c204a146faad9f 100755 --- a/services/ping/service.py +++ b/services/ping/service.py @@ -3,7 +3,7 @@ # --------------------------------------------------------------------- # Ping service # --------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -74,11 +74,11 @@ class PingService(Service): r["throttled"] = self.is_throttled return r - def register_message(self, object, timestamp, data): + def register_message(self, cfg, timestamp, data): """ Spool message to be sent """ - self.pub("events.%s" % config.pool, {"ts": timestamp, "object": object, "data": data}) + self.pub("events.%s" % cfg.fm_pool, {"ts": timestamp, "object": cfg.id, "data": data}) @tornado.gen.coroutine def get_object_mappings(self): @@ -144,6 +144,8 @@ class PingService(Service): if ps.address != data["address"]: self.logger.info("Changing address: %s -> %s", ps.address, data["address"]) ps.address = data["address"] + if ps.fm_pool != data["fm_pool"]: + ps.fm_pool = data["fm_pool"] ps.update(**data) metrics["ping_probe_update"] += 1 metrics["ping_objects"] = len(self.probes) @@ -200,7 +202,7 @@ class PingService(Service): ps.status = s if ps and not self.is_throttled and s != ps.sent_status: self.register_message( - ps.id, t0, {"source": "system", "$event": {"class": self.PING_CLS[s], "vars": {}}} + ps, t0, {"source": "system", "$event": {"class": self.PING_CLS[s], "vars": {}}} ) ps.sent_status = s self.logger.debug("[%s] status=%s rtt=%s", address, s, rtt) diff --git a/services/syslogcollector/service.py b/services/syslogcollector/service.py index 21731f11aa2f71e4144560cc10699943dfd932f6..305246a37daf067e68c5fc241e8c2104515cea49 100755 --- a/services/syslogcollector/service.py +++ b/services/syslogcollector/service.py @@ -25,7 +25,7 @@ from noc.services.syslogcollector.syslogserver import SyslogServer from noc.services.syslogcollector.datastream import SysologDataStreamClient SourceConfig = namedtuple( - "SourceConfig", ["id", "addresses", "bi_id", "process_events", "archive_events"] + "SourceConfig", ["id", "addresses", "bi_id", "process_events", "archive_events", "fm_pool"] ) @@ -86,7 +86,7 @@ class SyslogCollectorService(Service): # Send to classifier metrics["events_out"] += 1 self.pub( - "events.%s" % config.pool, + "events.%s" % cfg.fm_pool, { "ts": timestamp, "object": cfg.id, @@ -162,6 +162,7 @@ class SyslogCollectorService(Service): data.get("bi_id"), # For backward compatibility data.get("process_events", True), # For backward compatibility data.get("archive_events", False), + data.get("fm_pool", None) or config.pool, ) new_addresses = set(cfg.addresses) # Add new addresses, update remaining diff --git a/services/trapcollector/service.py b/services/trapcollector/service.py index b3fb4b1325bb45fac7b2198dd493d4dd6df2af81..401a34b0aff80eb4bdc46f37c4635e62e9eea81b 100755 --- a/services/trapcollector/service.py +++ b/services/trapcollector/service.py @@ -23,7 +23,7 @@ from noc.core.service.base import Service from noc.services.trapcollector.trapserver import TrapServer from noc.services.trapcollector.datastream import TrapDataStreamClient -SourceConfig = namedtuple("SourceConfig", ["id", "addresses"]) +SourceConfig = namedtuple("SourceConfig", ["id", "addresses", "fm_pool"]) class TrapCollectorService(Service): @@ -75,12 +75,12 @@ class TrapCollectorService(Service): return None return cfg - def register_message(self, object, timestamp, data): + def register_message(self, cfg, timestamp, data): """ Spool message to be sent """ metrics["events_out"] += 1 - self.pub("events.%s" % config.pool, {"ts": timestamp, "object": object, "data": data}) + self.pub("events.%s" % cfg.fm_pool, {"ts": timestamp, "object": cfg.id, "data": data}) @tornado.gen.coroutine def get_object_mappings(self): @@ -126,7 +126,9 @@ class TrapCollectorService(Service): else: old_addresses = set() # Build new config - cfg = SourceConfig(data["id"], tuple(data["addresses"])) + cfg = SourceConfig( + data["id"], tuple(data["addresses"]), data.get("fm_pool", None) or config.pool, + ) new_addresses = set(cfg.addresses) # Add new addresses, update remaining for addr in new_addresses: diff --git a/services/trapcollector/trapserver.py b/services/trapcollector/trapserver.py index e72f3c78cf8c26f0669fb48a191bbd3c073072e8..d0eed6eeca3e3b88867e15d5c1039604481e9b53 100644 --- a/services/trapcollector/trapserver.py +++ b/services/trapcollector/trapserver.py @@ -2,7 +2,7 @@ # --------------------------------------------------------------------- # SNMP Trap Server # --------------------------------------------------------------------- -# Copyright (C) 2007-2019 The NOC Project +# Copyright (C) 2007-2020 The NOC Project # See LICENSE for details # --------------------------------------------------------------------- @@ -51,4 +51,4 @@ class TrapServer(UDPServer): body = {"source": "SNMP Trap", "collector": config.pool} body.update(varbinds) body = dict((k, fm_escape(body[k])) for k in body) - self.service.register_message(cfg.id, ts, body) + self.service.register_message(cfg, ts, body) diff --git a/ui/web/sa/managedobject/Application.js b/ui/web/sa/managedobject/Application.js index 2335e25f875fb122c0b38a53da4a4f86b38396b3..8ea944a6de135c48d10ce5e8e9db693a03f96fab 100644 --- a/ui/web/sa/managedobject/Application.js +++ b/ui/web/sa/managedobject/Application.js @@ -1,7 +1,7 @@ //--------------------------------------------------------------------- // sa.managedobject application //--------------------------------------------------------------------- -// Copyright (C) 2007-2019 The NOC Project +// Copyright (C) 2007-2020 The NOC Project // See LICENSE for details //--------------------------------------------------------------------- console.debug("Defining NOC.sa.managedobject.Application"); @@ -976,6 +976,20 @@ Ext.define("NOC.sa.managedobject.Application", { { xtype: "container", items: [ + { + name: "fm_pool", + xtype: "main.pool.LookupField", + fieldLabel: __("FM Pool"), + tooltip: __( + "Use to override pool for events processing" + ), + allowBlank: true, + tabIndex: 130, + groupEdit: true, + listeners: { + render: me.addTooltip + } + }, { name: "event_processing_policy", xtype: "combobox", @@ -986,7 +1000,6 @@ Ext.define("NOC.sa.managedobject.Application", { ["D", __("Disable")] ], allowBlank: false, - tabIndex: 130, groupEdit: true }, { diff --git a/ui/web/sa/managedobject/Model.js b/ui/web/sa/managedobject/Model.js index d74fd44a924ebf7aede1a94d4b8141a29f8fd7cf..d9756a47e516924acacf2cd84fe3971866725ecc 100644 --- a/ui/web/sa/managedobject/Model.js +++ b/ui/web/sa/managedobject/Model.js @@ -1,7 +1,7 @@ //--------------------------------------------------------------------- // sa.managedobject Model //--------------------------------------------------------------------- -// Copyright (C) 2007-2019 The NOC Project +// Copyright (C) 2007-2020 The NOC Project // See LICENSE for details //--------------------------------------------------------------------- console.debug("Defining NOC.sa.managedobject.Model"); @@ -53,6 +53,15 @@ Ext.define("NOC.sa.managedobject.Model", { type: "string", persist: false }, + { + name: "fm_pool", + type: "string" + }, + { + name: "fm_pool__label", + type: "string", + persist: false + }, { name: "segment", type: "string"