def test_get_sensor_entry_point(self): # System packs file_path = 'file:///data/st/st2reactor/st2reactor/' + \ 'contrib/sensors/st2_generic_webhook_sensor.py' class_name = 'St2GenericWebhooksSensor' sensor = {'artifact_uri': file_path, 'class_name': class_name, 'pack': 'core'} sensor_api = SensorTypeAPI(**sensor) entry_point = sensor_type_utils.get_sensor_entry_point(sensor_api) self.assertEqual(entry_point, class_name) # Non system packs file_path = 'file:///data/st2contrib/packs/jira/sensors/jira_sensor.py' class_name = 'JIRASensor' sensor = {'artifact_uri': file_path, 'class_name': class_name, 'pack': 'jira'} sensor_api = SensorTypeAPI(**sensor) entry_point = sensor_type_utils.get_sensor_entry_point(sensor_api) self.assertEqual(entry_point, 'sensors.jira_sensor.JIRASensor') file_path = 'file:///data/st2contrib/packs/docker/sensors/docker_container_sensor.py' class_name = 'DockerSensor' sensor = {'artifact_uri': file_path, 'class_name': class_name, 'pack': 'docker'} sensor_api = SensorTypeAPI(**sensor) entry_point = sensor_type_utils.get_sensor_entry_point(sensor_api) self.assertEqual(entry_point, 'sensors.docker_container_sensor.DockerSensor')
def _register_sensor_from_pack(self, pack, sensor): sensor_metadata_file_path = sensor LOG.debug("Loading sensor from %s.", sensor_metadata_file_path) content = self._meta_loader.load(file_path=sensor_metadata_file_path) pack_field = content.get("pack", None) if not pack_field: content["pack"] = pack pack_field = pack if pack_field != pack: raise Exception( 'Model is in pack "%s" but field "pack" is different: %s' % (pack, pack_field) ) entry_point = content.get("entry_point", None) if not entry_point: raise ValueError("Sensor definition missing entry_point") # Add in "metadata_file" attribute which stores path to the pack metadata file relative to # the pack directory metadata_file = content_utils.get_relative_path_to_pack_file( pack_ref=pack, file_path=sensor, use_pack_cache=True ) content["metadata_file"] = metadata_file # Pass override information altered = self._override_loader.override(pack, "sensors", content) sensors_dir = os.path.dirname(sensor_metadata_file_path) sensor_file_path = os.path.join(sensors_dir, entry_point) artifact_uri = "file://%s" % (sensor_file_path) content["artifact_uri"] = artifact_uri content["entry_point"] = entry_point sensor_api = SensorTypeAPI(**content) sensor_model = SensorTypeAPI.to_model(sensor_api) sensor_types = SensorType.query(pack=sensor_model.pack, name=sensor_model.name) if len(sensor_types) >= 1: sensor_type = sensor_types[0] LOG.debug( "Found existing sensor id:%s with name:%s. Will update it.", sensor_type.id, sensor_type.name, ) sensor_model.id = sensor_type.id try: sensor_model = SensorType.add_or_update(sensor_model) except: LOG.exception("Failed creating sensor model for %s", sensor) return sensor_model, altered
def test_to_sensor_db_model_with_trigger_types(self): sensor_meta = { 'artifact_uri': 'file:///data/st2contrib/packs/jira/sensors/jira_sensor.py', 'class_name': 'JIRASensor', 'pack': 'jira', 'trigger_types': [{'pack': 'jira', 'name': 'issue_created', 'parameters': {}}] } sensor_api = SensorTypeAPI(**sensor_meta) sensor_model = SensorTypeAPI.to_model(sensor_api) self.assertListEqual(sensor_model.trigger_types, ['mock.trigger_ref'])
def test_to_sensor_db_model_no_trigger_types(self): sensor_meta = { 'artifact_uri': 'file:///data/st2contrib/packs/jira/sensors/jira_sensor.py', 'class_name': 'JIRASensor', 'pack': 'jira' } sensor_api = SensorTypeAPI(**sensor_meta) sensor_model = SensorTypeAPI.to_model(sensor_api) self.assertEqual(sensor_model.name, sensor_meta['class_name']) self.assertEqual(sensor_model.pack, sensor_meta['pack']) self.assertEqual(sensor_model.artifact_uri, sensor_meta['artifact_uri']) self.assertListEqual(sensor_model.trigger_types, [])
def test_to_sensor_db_model_no_trigger_types(self): sensor_meta = { "artifact_uri": "file:///data/st2contrib/packs/jira/sensors/jira_sensor.py", "class_name": "JIRASensor", "pack": "jira", } sensor_api = SensorTypeAPI(**sensor_meta) sensor_model = SensorTypeAPI.to_model(sensor_api) self.assertEqual(sensor_model.name, sensor_meta["class_name"]) self.assertEqual(sensor_model.pack, sensor_meta["pack"]) self.assertEqual(sensor_model.artifact_uri, sensor_meta["artifact_uri"]) self.assertListEqual(sensor_model.trigger_types, [])
def test_to_sensor_db_model_with_trigger_types(self): sensor_meta = { "artifact_uri": "file:///data/st2contrib/packs/jira/sensors/jira_sensor.py", "class_name": "JIRASensor", "pack": "jira", "trigger_types": [{ "pack": "jira", "name": "issue_created", "parameters": {} }], } sensor_api = SensorTypeAPI(**sensor_meta) sensor_model = SensorTypeAPI.to_model(sensor_api) self.assertListEqual(sensor_model.trigger_types, ["mock.trigger_ref"])
def _register_sensor_from_pack(self, pack, sensor): sensor_metadata_file_path = sensor LOG.debug('Loading sensor from %s.', sensor_metadata_file_path) content = self._meta_loader.load(file_path=sensor_metadata_file_path) pack_field = content.get('pack', None) if not pack_field: content['pack'] = pack pack_field = pack if pack_field != pack: raise Exception( 'Model is in pack "%s" but field "pack" is different: %s' % (pack, pack_field)) entry_point = content.get('entry_point', None) if not entry_point: raise ValueError('Sensor definition missing entry_point') sensors_dir = os.path.dirname(sensor_metadata_file_path) sensor_file_path = os.path.join(sensors_dir, entry_point) artifact_uri = 'file://%s' % (sensor_file_path) content['artifact_uri'] = artifact_uri content['entry_point'] = entry_point sensor_api = SensorTypeAPI(**content) sensor_model = SensorTypeAPI.to_model(sensor_api) sensor_types = SensorType.query(pack=sensor_model.pack, name=sensor_model.name) if len(sensor_types) >= 1: sensor_type = sensor_types[0] LOG.debug( 'Found existing sensor id:%s with name:%s. Will update it.', sensor_type.id, sensor_type.name) sensor_model.id = sensor_type.id try: sensor_model = SensorType.add_or_update(sensor_model) except: LOG.exception('Failed creating sensor model for %s', sensor) return sensor_model
def test_get_sensor_entry_point(self): # System packs file_path = ("file:///data/st/st2reactor/st2reactor/" + "contrib/sensors/st2_generic_webhook_sensor.py") class_name = "St2GenericWebhooksSensor" sensor = { "artifact_uri": file_path, "class_name": class_name, "pack": "core" } sensor_api = SensorTypeAPI(**sensor) entry_point = sensor_type_utils.get_sensor_entry_point(sensor_api) self.assertEqual(entry_point, class_name) # Non system packs file_path = "file:///data/st2contrib/packs/jira/sensors/jira_sensor.py" class_name = "JIRASensor" sensor = { "artifact_uri": file_path, "class_name": class_name, "pack": "jira" } sensor_api = SensorTypeAPI(**sensor) entry_point = sensor_type_utils.get_sensor_entry_point(sensor_api) self.assertEqual(entry_point, "sensors.jira_sensor.JIRASensor") file_path = ( "file:///data/st2contrib/packs/docker/sensors/docker_container_sensor.py" ) class_name = "DockerSensor" sensor = { "artifact_uri": file_path, "class_name": class_name, "pack": "docker" } sensor_api = SensorTypeAPI(**sensor) entry_point = sensor_type_utils.get_sensor_entry_point(sensor_api) self.assertEqual(entry_point, "sensors.docker_container_sensor.DockerSensor")
def test_to_sensor_db_model_with_trigger_types(self): sensor_meta = { "artifact_uri": "file:///data/st2contrib/packs/jira/sensors/jira_sensor.py", "class_name": "JIRASensor", "pack": "jira", "trigger_types": [{"pack": "jira", "name": "issue_created", "parameters": {}}], } sensor_api = SensorTypeAPI(**sensor_meta) sensor_model = SensorTypeAPI.to_model(sensor_api) self.assertListEqual(sensor_model.trigger_types, ["mock.trigger_ref"])
def _register_sensor_from_pack(self, pack, sensor): sensor_metadata_file_path = sensor LOG.debug('Loading sensor from %s.', sensor_metadata_file_path) content = self._meta_loader.load(file_path=sensor_metadata_file_path) pack_field = content.get('pack', None) if not pack_field: content['pack'] = pack pack_field = pack if pack_field != pack: raise Exception('Model is in pack "%s" but field "pack" is different: %s' % (pack, pack_field)) entry_point = content.get('entry_point', None) if not entry_point: raise ValueError('Sensor definition missing entry_point') # Add in "metadata_file" attribute which stores path to the pack metadata file relative to # the pack directory metadata_file = content_utils.get_relative_path_to_pack_file(pack_ref=pack, file_path=sensor, use_pack_cache=True) content['metadata_file'] = metadata_file sensors_dir = os.path.dirname(sensor_metadata_file_path) sensor_file_path = os.path.join(sensors_dir, entry_point) artifact_uri = 'file://%s' % (sensor_file_path) content['artifact_uri'] = artifact_uri content['entry_point'] = entry_point sensor_api = SensorTypeAPI(**content) sensor_model = SensorTypeAPI.to_model(sensor_api) sensor_types = SensorType.query(pack=sensor_model.pack, name=sensor_model.name) if len(sensor_types) >= 1: sensor_type = sensor_types[0] LOG.debug('Found existing sensor id:%s with name:%s. Will update it.', sensor_type.id, sensor_type.name) sensor_model.id = sensor_type.id try: sensor_model = SensorType.add_or_update(sensor_model) except: LOG.exception('Failed creating sensor model for %s', sensor) return sensor_model
def put(self, sensor_type, ref_or_id, requester_user): # Note: Right now this function only supports updating of "enabled" # attribute on the SensorType model. # The reason for that is that SensorTypeAPI.to_model right now only # knows how to work with sensor type definitions from YAML files. sensor_type_db = self._get_by_ref_or_id(ref_or_id=ref_or_id) permission_type = PermissionType.SENSOR_MODIFY rbac_utils = get_rbac_backend().get_utils_class() rbac_utils.assert_user_has_resource_db_permission( user_db=requester_user, resource_db=sensor_type_db, permission_type=permission_type, ) sensor_type_id = sensor_type_db.id try: validate_not_part_of_system_pack(sensor_type_db) except ValueValidationException as e: abort(http_client.BAD_REQUEST, six.text_type(e)) return if not getattr(sensor_type, "pack", None): sensor_type.pack = sensor_type_db.pack try: old_sensor_type_db = sensor_type_db sensor_type_db.id = sensor_type_id sensor_type_db.enabled = getattr(sensor_type, "enabled", False) sensor_type_db = SensorType.add_or_update(sensor_type_db) except (ValidationError, ValueError) as e: LOG.exception("Unable to update sensor_type data=%s", sensor_type) abort(http_client.BAD_REQUEST, six.text_type(e)) return extra = { "old_sensor_type_db": old_sensor_type_db, "new_sensor_type_db": sensor_type_db, } LOG.audit("Sensor updated. Sensor.id=%s." % (sensor_type_db.id), extra=extra) sensor_type_api = SensorTypeAPI.from_model(sensor_type_db) return sensor_type_api
def put(self, sensor_type, ref_or_id, requester_user): # Note: Right now this function only supports updating of "enabled" # attribute on the SensorType model. # The reason for that is that SensorTypeAPI.to_model right now only # knows how to work with sensor type definitions from YAML files. sensor_type_db = self._get_by_ref_or_id(ref_or_id=ref_or_id) permission_type = PermissionType.SENSOR_MODIFY rbac_utils = get_rbac_backend().get_utils_class() rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user, resource_db=sensor_type_db, permission_type=permission_type) sensor_type_id = sensor_type_db.id try: validate_not_part_of_system_pack(sensor_type_db) except ValueValidationException as e: abort(http_client.BAD_REQUEST, six.text_type(e)) return if not getattr(sensor_type, 'pack', None): sensor_type.pack = sensor_type_db.pack try: old_sensor_type_db = sensor_type_db sensor_type_db.id = sensor_type_id sensor_type_db.enabled = getattr(sensor_type, 'enabled', False) sensor_type_db = SensorType.add_or_update(sensor_type_db) except (ValidationError, ValueError) as e: LOG.exception('Unable to update sensor_type data=%s', sensor_type) abort(http_client.BAD_REQUEST, six.text_type(e)) return extra = { 'old_sensor_type_db': old_sensor_type_db, 'new_sensor_type_db': sensor_type_db } LOG.audit('Sensor updated. Sensor.id=%s.' % (sensor_type_db.id), extra=extra) sensor_type_api = SensorTypeAPI.from_model(sensor_type_db) return sensor_type_api
def put(self, ref_or_id, sensor_type): # Note: Right now this function only supports updating of "enabled" # attribute on the SensorType model. # The reason for that is that SensorTypeAPI.to_model right now only # knows how to work with sensor type definitions from YAML files. try: sensor_type_db = self._get_by_ref_or_id(ref_or_id=ref_or_id) except Exception as e: LOG.exception(e.message) abort(http_client.NOT_FOUND, e.message) return sensor_type_id = sensor_type_db.id try: validate_not_part_of_system_pack(sensor_type_db) except ValueValidationException as e: abort(http_client.BAD_REQUEST, str(e)) return if not getattr(sensor_type, 'pack', None): sensor_type.pack = sensor_type_db.pack try: old_sensor_type_db = sensor_type_db sensor_type_db.id = sensor_type_id sensor_type_db.enabled = getattr(sensor_type, 'enabled', False) sensor_type_db = SensorType.add_or_update(sensor_type_db) except (ValidationError, ValueError) as e: LOG.exception('Unable to update sensor_type data=%s', sensor_type) abort(http_client.BAD_REQUEST, str(e)) return extra = { 'old_sensor_type_db': old_sensor_type_db, 'new_sensor_type_db': sensor_type_db } LOG.audit('Sensor updated. Sensor.id=%s.' % (sensor_type_db.id), extra=extra) sensor_type_api = SensorTypeAPI.from_model(sensor_type_db) return sensor_type_api