예제 #1
0
    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')
예제 #2
0
    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
예제 #3
0
    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'])
예제 #4
0
 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, [])
예제 #5
0
 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, [])
예제 #6
0
    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"])
예제 #7
0
    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
예제 #8
0
    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")
예제 #9
0
    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"])
예제 #10
0
 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, [])
예제 #11
0
    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
예제 #12
0
    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
예제 #13
0
파일: sensors.py 프로젝트: StackStorm/st2
    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
예제 #14
0
    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
예제 #15
0
파일: sensors.py 프로젝트: agilee/st2
    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