Ejemplo n.º 1
0
def _update_device(device, update_device_json, validate_required=True):
    fields = ({
        field['name']: field['value']
        for field in update_device_json['fields']
    } if 'fields' in update_device_json else None)
    app = update_device_json['app_name']
    device_type = update_device_json[
        'type'] if 'type' in update_device_json else device.type
    try:
        device_api = get_app_device_api(app, device_type)
        device_fields_api = device_api['fields']
        if fields is not None:
            validate_device_fields(device_fields_api,
                                   fields,
                                   device_type,
                                   app,
                                   validate_required=validate_required)
    except (UnknownApp, UnknownDevice, InvalidArgument) as e:
        return __crud_device_error_handler('update', e, app, device_type)
    else:
        if fields is not None:
            fields = update_device_json[
                'fields'] if 'fields' in update_device_json else None
            add_configuration_keys_to_device_json(fields, device_fields_api)
        device.update_from_json(update_device_json)
        executiondb.execution_db.session.commit()
        device_json = get_device_json_with_app_name(device)
        # remove_configuration_keys_from_device_json(device_json)
        return device_json, SUCCESS
Ejemplo n.º 2
0
def import_device(app, device, device_type, fields):
    try:
        device_api = get_app_device_api(app, device_type)
        device_fields_api = device_api['fields']
        validate_device_fields(device_fields_api, fields, device_type, app)
    except UnknownDevice:
        current_app.logger.error('Cannot import device for app {0}, type {1}. '
                                 'Type does not exist'.format(
                                     app, device_type))
    except InvalidArgument as e:
        current_app.logger.error('Cannot import device for app {0}, type {1}. '
                                 'Invalid input'.format(
                                     app, device_type,
                                     format_exception_message(e)))
    else:
        fields = device['fields']
        add_configuration_keys_to_device_json(fields, device_fields_api)
        app = device_db.session.query(App).filter(App.name == app).first()
        if app is not None:
            device_obj = Device.from_json(device)
            app.add_device(device_obj)
            device_db.session.add(device_obj)
            device_db.session.commit()
        else:
            current_app.logger.error(
                'SEVERE: App defined in api does not have corresponding entry in database. '
                'Cannot import device')
    return app
Ejemplo n.º 3
0
 def test_basic_device_fields_validation(self):
     device_fields = [{
         'name': 'param1',
         'type': 'string'
     }, {
         'name': 'param2',
         'type': 'boolean'
     }]
     device_in = {'param1': 'somevalue', 'param2': True}
     validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 4
0
 def test_device_fields_validation_with_no_fields_none_required(self):
     device_fields = [{
         'name': 'param1',
         'type': 'string'
     }, {
         'name': 'param2',
         'type': 'boolean'
     }]
     device_in = {}
     validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 5
0
 def test_device_fields_validation_with_some_required_in_api(self):
     device_fields = [{
         'name': 'param1',
         'type': 'string',
         'required': True
     }, {
         'name': 'param2',
         'type': 'boolean'
     }]
     device_in = {'param1': 'somevalue', 'param2': True}
     validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 6
0
 def test_basic_device_fields_validation_invalid_type(self):
     device_fields = [{
         'name': 'param1',
         'type': 'string'
     }, {
         'name': 'param2',
         'type': 'boolean'
     }]
     device_in = {'param1': 'somevalue', 'param2': 'invalid'}
     with self.assertRaises(InvalidArgument):
         validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 7
0
 def test_device_fields_validation_with_encryption_false(self):
     device_fields = [{
         'name': 'param1',
         'type': 'string',
         'encrypted': False
     }, {
         'name': 'param2',
         'type': 'boolean'
     }]
     device_in = {'param1': 'somevalue', 'param2': True}
     validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 8
0
 def test_device_fields_validation_with_encryption_with_invalid_value(self):
     device_fields = [{
         'name': 'param1',
         'type': 'integer',
         'encrypted': True
     }, {
         'name': 'param2',
         'type': 'boolean'
     }]
     device_in = {'param1': 'somevalue', 'param2': True}
     with self.assertRaises(InvalidArgument):
         validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 9
0
 def test_device_fields_validation_with_some_required_in_api_too_few_fields(
         self):
     device_fields = [{
         'name': 'param1',
         'type': 'string',
         'required': True
     }, {
         'name': 'param2',
         'type': 'boolean'
     }]
     device_in = {'param2': True}
     with self.assertRaises(InvalidArgument):
         validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 10
0
    def __func():
        if request.files and 'file' in request.files:
            f = request.files['file']
            add_device_json = json.loads(f.read().decode('utf-8'))
        else:
            add_device_json = request.get_json()
        if current_app.running_context.execution_db.session.query(
                Device).filter(Device.name ==
                               add_device_json['name']).first() is not None:
            current_app.logger.error('Could not create device {0}. '
                                     'Device already exists.'.format(
                                         add_device_json['name']))
            return Problem.from_crud_resource(
                OBJECT_EXISTS_ERROR, 'device', 'create',
                'Device with name {} already exists.'.format(
                    add_device_json['name']))

        fields = {
            field['name']: field['value']
            for field in add_device_json['fields']
        }
        app = add_device_json['app_name']
        device_type = add_device_json['type']
        try:
            device_api = get_app_device_api(app, device_type)
            device_fields_api = device_api['fields']
            validate_device_fields(device_fields_api, fields, device_type, app)
        except (UnknownApp, UnknownDevice, InvalidArgument) as e:
            return __crud_device_error_handler('create', e, app, device_type)
        else:
            fields = add_device_json['fields']
            add_configuration_keys_to_device_json(fields, device_fields_api)
            app = current_app.running_context.execution_db.session.query(
                App).filter(App.name == app).first()
            if app is None:
                current_app.logger.error(
                    'SEVERE: App defined in api does not have corresponding entry in database. '
                    'Cannot add device')
                return Problem.from_crud_resource(
                    INVALID_INPUT_ERROR, 'device', 'create',
                    'App {} does not exist.'.format(
                        add_device_json['app_name']))
            device = Device.from_json(add_device_json)
            app.add_device(device)
            current_app.running_context.execution_db.session.add(device)
            current_app.running_context.execution_db.session.commit()
            device_json = get_device_json_with_app_name(device)
            return device_json, OBJECT_CREATED
 def test_device_fields_validation_with_defaults_with_required(self):
     device_fields = [{'name': 'param1', 'type': 'string', 'encrypted': True},
                      {'name': 'param2', 'type': 'boolean', 'default': False, 'required': True}]
     device_in = {'param1': 'somevalue'}
     validated = validate_device_fields(device_fields, device_in, '', '')
     device_in['param2'] = False
     self.assertDictEqual(validated, device_in)
Ejemplo n.º 12
0
    def __func():
        if request.files and 'file' in request.files:
            f = request.files['file']
            add_device_json = json.loads(f.read().decode('utf-8'))
        else:
            add_device_json = request.get_json()
        if current_app.running_context.execution_db.session.query(Device).filter(
                Device.name == add_device_json['name']).first() is not None:
            current_app.logger.error('Could not create device {0}. '
                                     'Device already exists.'.format(add_device_json['name']))
            return Problem.from_crud_resource(
                OBJECT_EXISTS_ERROR,
                'device',
                'create',
                'Device with name {} already exists.'.format(add_device_json['name']))

        fields = {field['name']: field['value'] for field in add_device_json['fields']}
        app = add_device_json['app_name']
        device_type = add_device_json['type']
        try:
            device_api = get_app_device_api(app, device_type)
            device_fields_api = device_api['fields']
            validate_device_fields(device_fields_api, fields, device_type, app)
        except (UnknownApp, UnknownDevice, InvalidArgument) as e:
            return __crud_device_error_handler('create', e, app, device_type)
        else:
            fields = add_device_json['fields']
            add_configuration_keys_to_device_json(fields, device_fields_api)
            app = current_app.running_context.execution_db.session.query(App).filter(App.name == app).first()
            if app is None:
                current_app.logger.error('SEVERE: App defined in api does not have corresponding entry in database. '
                                         'Cannot add device')
                return Problem.from_crud_resource(
                    INVALID_INPUT_ERROR,
                    'device',
                    'create',
                    'App {} does not exist.'.format(add_device_json['app_name']))
            device = Device.from_json(add_device_json)
            app.add_device(device)
            current_app.running_context.execution_db.session.add(device)
            current_app.running_context.execution_db.session.commit()
            device_json = get_device_json_with_app_name(device)
            return device_json, OBJECT_CREATED
Ejemplo n.º 13
0
def _update_device(device, update_device_json, validate_required=True):
    fields = ({field['name']: field['value'] for field in update_device_json['fields']}
              if 'fields' in update_device_json else None)
    app = update_device_json['app_name']
    device_type = update_device_json['type'] if 'type' in update_device_json else device.type
    try:
        device_api = get_app_device_api(app, device_type)
        device_fields_api = device_api['fields']
        if fields is not None:
            validate_device_fields(device_fields_api, fields, device_type, app, validate_required=validate_required)
    except (UnknownApp, UnknownDevice, InvalidArgument) as e:
        return __crud_device_error_handler('update', e, app, device_type)
    else:
        if fields is not None:
            fields = update_device_json['fields'] if 'fields' in update_device_json else None
            add_configuration_keys_to_device_json(fields, device_fields_api)
        device.update_from_json(update_device_json, complete_object=validate_required)
        current_app.running_context.execution_db.session.commit()
        device_json = get_device_json_with_app_name(device)
        return device_json, SUCCESS
Ejemplo n.º 14
0
    def __func():
        add_device_json = request.get_json()
        if device_db.session.query(Device).filter(
                Device.name == add_device_json['name']).first() is not None:
            current_app.logger.error('Could not create device {0}. '
                                     'Device already exists.'.format(
                                         add_device_json['name']))
            return {"error": "Device already exists."}, OBJECT_EXISTS_ERROR

        fields = {
            field['name']: field['value']
            for field in add_device_json['fields']
        }
        app = add_device_json['app_name']
        device_type = add_device_json['type']
        try:
            device_api = get_app_device_api(app, device_type)
            device_fields_api = device_api['fields']
            validate_device_fields(device_fields_api, fields, device_type, app)
        except (UnknownApp, UnknownDevice, InvalidArgument) as e:
            return __crud_device_error_handler('create', e, app, device_type)
        else:
            fields = add_device_json['fields']
            add_configuration_keys_to_device_json(fields, device_fields_api)
            app = device_db.session.query(App).filter(App.name == app).first()
            if app is None:
                current_app.logger.error(
                    'SEVERE: App defined in api does not have corresponding entry in database. '
                    'Cannot add device')
                return {'error': 'Unknown app'}, INVALID_INPUT_ERROR
            device = Device.from_json(add_device_json)
            app.add_device(device)
            device_db.session.add(device)
            device_db.session.commit()
            device_json = get_device_json_with_app_name(device)
            # remove_configuration_keys_from_device_json(device_json)
            return device_json, OBJECT_CREATED
Ejemplo n.º 15
0
 def test_device_fields_validation_with_required_and_encrypted(self):
     device_fields = [{'name': 'param1', 'type': 'string', 'required': True, 'encrypted': True},
                      {'name': 'param2', 'type': 'boolean'}]
     device_in = {'param1': 'somevalue', 'param2': True}
     validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 16
0
 def test_basic_device_fields_validation_invalid_type(self):
     device_fields = [{'name': 'param1', 'type': 'string'}, {'name': 'param2', 'type': 'boolean'}]
     device_in = {'param1': 'somevalue', 'param2': 'invalid'}
     with self.assertRaises(InvalidArgument):
         validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 17
0
 def test_basic_device_fields_validation(self):
     device_fields = [{'name': 'param1', 'type': 'string'}, {'name': 'param2', 'type': 'boolean'}]
     device_in = {'param1': 'somevalue', 'param2': True}
     validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 18
0
 def test_device_fields_validation_with_some_required_in_api_too_few_fields(self):
     device_fields = [{'name': 'param1', 'type': 'string', 'required': True},
                      {'name': 'param2', 'type': 'boolean'}]
     device_in = {'param2': True}
     with self.assertRaises(InvalidArgument):
         validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 19
0
 def test_device_fields_validation_with_all_required_in_api(self):
     device_fields = [{'name': 'param1', 'type': 'string', 'required': True},
                      {'name': 'param2', 'type': 'boolean', 'required': True}]
     device_in = {'param1': 'somevalue', 'param2': True}
     validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 20
0
 def test_device_fields_validation_with_encryption_with_invalid_value(self):
     device_fields = [{'name': 'param1', 'type': 'integer', 'encrypted': True},
                      {'name': 'param2', 'type': 'boolean'}]
     device_in = {'param1': 'somevalue', 'param2': True}
     with self.assertRaises(InvalidArgument):
         validate_device_fields(device_fields, device_in, '', '')
Ejemplo n.º 21
0
 def test_device_fields_validation_with_no_fields_none_required(self):
     device_fields = [{'name': 'param1', 'type': 'string'}, {'name': 'param2', 'type': 'boolean'}]
     device_in = {}
     validate_device_fields(device_fields, device_in, '', '')