Skip to content

Commit

Permalink
Merge pull request #678 from telefonicaid/task/update_handler_with_ol…
Browse files Browse the repository at this point in the history
…d_device

use oldDevice apikey when update device
  • Loading branch information
fgalan authored Jun 5, 2024
2 parents a8a0791 + 9887a93 commit cf72bd1
Show file tree
Hide file tree
Showing 8 changed files with 188 additions and 10 deletions.
3 changes: 2 additions & 1 deletion CHANGES_NEXT_RELEASE
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
- Fix: update device using previous device apikey to avoid error when apikey is updated (iota-json#833)
- Fix: allow send multiple measures to CB in a batch (POST /v2/op/update) and sorted by TimeInstant when possible, instead of using multiples single request (iotagent-json#825, iotagent-node-lib#1612)
- Fix: default express limit to 1Mb instead default 100Kb and allow change it throught a conf env var 'IOTA_EXPRESS_LIMIT' (iota-json#827)
- Fix: default express limit to 1Mb instead default 100Kb and allow change it throught a conf env var 'IOTA_EXPRESS_LIMIT' (iota-json#827)
2 changes: 1 addition & 1 deletion lib/bindings/AMQPBinding.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ function deviceProvisioningHandler(device, callback) {
*
* @param {Object} device Device object containing all the information about the provisioned device.
*/
function deviceUpdatingHandler(device, callback) {
function deviceUpdatingHandler(device, oldDevice, callback) {
callback(null, device);
}

Expand Down
12 changes: 7 additions & 5 deletions lib/bindings/HTTPBindings.js
Original file line number Diff line number Diff line change
Expand Up @@ -448,19 +448,21 @@ function deviceProvisioningHandler(device, callback) {
*
* @param {Object} device Device object containing all the information about the updated device.
*/
function deviceUpdatingHandler(device, callback) {
context = fillService(context, device);
config.getLogger().debug(context, 'httpbinding.deviceUpdatingHandler %j', device);
function deviceUpdatingHandler(newDevice, oldDevice, callback) {
context = fillService(context, newDevice);
config
.getLogger()
.debug(context, 'httpbinding.deviceUpdatingHandler newDevice %j oldDevice %j', newDevice, oldDevice);
let group = {};
iotAgentLib.getConfigurationSilently(config.getConfig().iota.defaultResource || '', device.apikey, function (
iotAgentLib.getConfigurationSilently(config.getConfig().iota.defaultResource || '', oldDevice.apikey, function (
error,
foundGroup
) {
if (!error) {
group = foundGroup;
}
config.getLogger().debug(context, 'httpbinding.deviceUpdatingHandler group %j', group);
setPollingAndDefaultTransport(device, group, callback);
setPollingAndDefaultTransport(newDevice, group, callback);
});
}

Expand Down
2 changes: 1 addition & 1 deletion lib/bindings/MQTTBinding.js
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ function deviceProvisioningHandler(device, callback) {
*
* @param {Object} device Device object containing all the information about the provisioned device.
*/
function deviceUpdatingHandler(device, callback) {
function deviceUpdatingHandler(device, oldDevice, callback) {
callback(null, device);
}

Expand Down
9 changes: 7 additions & 2 deletions lib/iotagent-ul.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ function commandHandler(id, type, service, subservice, attributes, callback) {
* @param {Object} device Device provisioning information.
*/
function deviceProvisioningHandler(device, callback) {
config.getLogger().debug(context, 'deviceProvisioningHandler for device %j', device);
transportSelector.applyFunctionFromBinding([device], 'deviceProvisioningHandler', null, function (error, devices) {
if (error) {
callback(error);
Expand All @@ -147,8 +148,12 @@ function deviceProvisioningHandler(device, callback) {
*
* @param {Object} device Device updating information.
*/
function deviceUpdatingHandler(device, callback) {
transportSelector.applyFunctionFromBinding([device], 'deviceUpdatingHandler', null, function (error, devices) {
function deviceUpdatingHandler(newDevice, oldDevice, callback) {
config.getLogger().debug(context, 'deviceUpdatingHandler for newDevice %j oldDevice %j', newDevice, oldDevice);
transportSelector.applyFunctionFromBinding([newDevice, oldDevice], 'deviceUpdatingHandler', null, function (
error,
devices
) {
if (error) {
callback(error);
} else {
Expand Down
120 changes: 120 additions & 0 deletions test/unit/ngsiv2/HTTP_update_device_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
* Copyright 2016 Telefonica Investigación y Desarrollo, S.A.U
*
* This file is part of iotagent-json
*
* iotagent-ul is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* iotagent-ul is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with iotagent-json.
* If not, seehttp://www.gnu.org/licenses/.
*
* For those usages not covered by the GNU Affero General Public License
* please contact with::[[email protected]]
*
*/

/* eslint-disable no-unused-vars */

const iotagentMqtt = require('../../../');
const config = require('./config-test.js');
const nock = require('nock');
const should = require('should');
const iotAgentLib = require('iotagent-node-lib');
const async = require('async');
const request = require('request');
const utils = require('../../utils');
let mockedClientServer;
let contextBrokerMock;

describe('HTTP binding - Update provisioned devices with a new apikey', function () {
const provisionOptions = {
url: 'http://localhost:' + config.iota.server.port + '/iot/devices',
method: 'POST',
json: utils.readExampleFile('./test/unit/ngsiv2/deviceProvisioning/provisionDeviceHTTP4.json'),
headers: {
'fiware-service': 'smartgondor',
'fiware-servicepath': '/gardens'
}
};
beforeEach(function (done) {
config.iota.logLevel = 'FATAL';
nock.cleanAll();

iotagentMqtt.start(config, function () {
request(provisionOptions, function (error, response, body) {
done();
});
});
});

it('should have provisioned with APIKEY1', function (done) {
const options = {
url: 'http://localhost:' + config.iota.server.port + '/iot/devices/MQTT_4',
headers: {
'fiware-service': 'smartgondor',
'fiware-servicepath': '/gardens'
},
method: 'GET'
};
request(options, function (error, response, body) {
/* jshint camelcase:false */
const parsedBody = JSON.parse(body);
parsedBody.apikey.should.equal('APIKEY1');
done();
});
});

afterEach(function (done) {
nock.cleanAll();
async.series([iotAgentLib.clearAll, iotagentMqtt.stop], done);
});

describe('When a request to update a provision device arrives', function () {
const optionsUpdate = {
url: 'http://localhost:' + config.iota.server.port + '/iot/devices/MQTT_4',
method: 'PUT',
headers: {
'fiware-service': 'smartgondor',
'fiware-servicepath': '/gardens'
},
json: utils.readExampleFile('./test/unit/ngsiv2/deviceProvisioning/updateProvisionDevice4.json')
};

it('should return a 200 OK and no errors', function (done) {
request(optionsUpdate, function (error, response, body) {
should.not.exist(error);
response.statusCode.should.equal(204);
done();
});
});

it('should have updated device apikey', function (done) {
request(optionsUpdate, function (error, response, body) {
const options = {
url: 'http://localhost:' + config.iota.server.port + '/iot/devices/MQTT_4',
headers: {
'fiware-service': 'smartgondor',
'fiware-servicepath': '/gardens'
},
method: 'GET'
};

request(options, function (error, response, body) {
/* jshint camelcase:false */
const parsedBody = JSON.parse(body);
parsedBody.apikey.should.equal('APIKEY2');
done();
});
});
});
});
});
47 changes: 47 additions & 0 deletions test/unit/ngsiv2/deviceProvisioning/provisionDeviceHTTP4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"devices": [
{
"device_id": "MQTT_4",
"protocol": "GENERIC_PROTO",
"apikey": "APIKEY1",
"entity_name": "Second MQTT Device",
"timezone": "America/Santiago",
"entity_type": "AnMQTTDevice",
"attributes": [
{
"name": "temperature",
"type": "celsius"
},
{
"name": "humidity",
"type": "degrees"
},
{
"name": "luminosity",
"type": "Integer"

},
{
"name": "pollution",
"type": "Float"
},
{
"name": "configuration",
"type": "Object"
},
{
"name": "tags",
"type": "Array"
},
{
"name": "enabled",
"type": "Boolean"
},
{
"name": "alive",
"type": "Null"
}
]
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"apikey": "APIKEY2"
}

0 comments on commit cf72bd1

Please sign in to comment.