Skip to content

Commit

Permalink
[#2131] Check for tenant existence in device registration operations …
Browse files Browse the repository at this point in the history
…in MongoDB device registry

Signed-off-by: Kartheeswaran Kalidass <kartheeswaran.kalidass@bosch.io>
  • Loading branch information
kaniyan committed Sep 4, 2020
1 parent 52ce31c commit c349b86
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.eclipse.hono.deviceregistry.mongodb.service.MongoDbBasedTenantService;
import org.eclipse.hono.deviceregistry.server.DeviceRegistryAmqpServer;
import org.eclipse.hono.deviceregistry.server.DeviceRegistryHttpServer;
import org.eclipse.hono.deviceregistry.service.tenant.AutowiredTenantInformationService;
import org.eclipse.hono.service.HealthCheckServer;
import org.eclipse.hono.service.VertxBasedHealthCheckServer;
import org.eclipse.hono.service.amqp.AmqpEndpoint;
Expand Down Expand Up @@ -296,7 +297,8 @@ public MongoDbBasedRegistrationService registrationService() {
return new MongoDbBasedRegistrationService(
vertx(),
mongoClient(),
registrationServiceProperties());
registrationServiceProperties(),
tenantInformationService());
}

/**
Expand Down Expand Up @@ -330,6 +332,17 @@ public MongoDbBasedTenantService tenantService() {
);
}

/**
* Exposes the autowired tenant information service as a Spring bean.
*
* @return The MongoDB tenant service.
*/
@Bean
@Scope("prototype")
public AutowiredTenantInformationService tenantInformationService() {
return new AutowiredTenantInformationService();
}

/**
* Creates a new instance of an AMQP 1.0 protocol handler for Hono's <em>Device Registration</em> API.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@
import java.util.stream.Collectors;

import org.eclipse.hono.client.ClientErrorException;
import org.eclipse.hono.client.StatusCodeMapper;
import org.eclipse.hono.deviceregistry.mongodb.config.MongoDbBasedRegistrationConfigProperties;
import org.eclipse.hono.deviceregistry.mongodb.model.DeviceDto;
import org.eclipse.hono.deviceregistry.mongodb.utils.MongoDbCallExecutor;
import org.eclipse.hono.deviceregistry.mongodb.utils.MongoDbDeviceRegistryUtils;
import org.eclipse.hono.deviceregistry.mongodb.utils.MongoDbDocumentBuilder;
import org.eclipse.hono.deviceregistry.service.device.AbstractRegistrationService;
import org.eclipse.hono.deviceregistry.service.device.DeviceKey;
import org.eclipse.hono.deviceregistry.service.tenant.TenantInformationService;
import org.eclipse.hono.deviceregistry.util.DeviceRegistryUtils;
import org.eclipse.hono.deviceregistry.util.Versioned;
import org.eclipse.hono.service.Lifecycle;
Expand Down Expand Up @@ -87,16 +89,19 @@ public final class MongoDbBasedRegistrationService extends AbstractRegistrationS
* @param vertx The vert.x instance to run on.
* @param mongoClient The client for accessing the Mongo DB instance.
* @param config The properties for configuring this service.
* @param tenantInformationService An implementation of the tenant information service.
* @throws NullPointerException if any of the parameters are {@code null}.
*/
public MongoDbBasedRegistrationService(
final Vertx vertx,
final MongoClient mongoClient,
final MongoDbBasedRegistrationConfigProperties config) {
final MongoDbBasedRegistrationConfigProperties config,
final TenantInformationService tenantInformationService) {

Objects.requireNonNull(vertx);
Objects.requireNonNull(mongoClient);
Objects.requireNonNull(config);
Objects.requireNonNull(tenantInformationService);

this.mongoClient = mongoClient;
this.mongoDbCallExecutor = new MongoDbCallExecutor(vertx, mongoClient);
Expand Down Expand Up @@ -135,6 +140,7 @@ public Future<OperationResult<Id>> createDevice(
Objects.requireNonNull(span);

return MongoDbDeviceRegistryUtils.isModificationEnabled(config)
.compose(ok -> tenantExists(tenantId, span))
.compose(ok -> isMaxDevicesLimitReached(tenantId))
.compose(ok -> processCreateDevice(
new DeviceDto(
Expand All @@ -153,7 +159,8 @@ public Future<OperationResult<Device>> readDevice(final String tenantId, final S
Objects.requireNonNull(deviceId);
Objects.requireNonNull(span);

return processReadDevice(tenantId, deviceId)
return tenantExists(tenantId, span)
.compose(ok -> processReadDevice(tenantId, deviceId))
.recover(error -> Future.succeededFuture(MongoDbDeviceRegistryUtils.mapErrorToResult(error, span)));
}

Expand All @@ -171,7 +178,8 @@ public Future<OperationResult<SearchDevicesResult>> searchDevices(
Objects.requireNonNull(sortOptions);
Objects.requireNonNull(span);

return processSearchDevices(tenantId, pageSize, pageOffset, filters, sortOptions)
return tenantExists(tenantId, span)
.compose(ok -> processSearchDevices(tenantId, pageSize, pageOffset, filters, sortOptions))
.recover(error -> Future.succeededFuture(MongoDbDeviceRegistryUtils.mapErrorToResult(error, span)));
}

Expand All @@ -185,6 +193,7 @@ public Future<OperationResult<Id>> updateDevice(final String tenantId, final Str
Objects.requireNonNull(span);

return MongoDbDeviceRegistryUtils.isModificationEnabled(config)
.compose(ok -> tenantExists(tenantId, span))
.compose(deviceDto -> processUpdateDevice(tenantId, deviceId, device, resourceVersion, span))
.recover(error -> Future.succeededFuture(MongoDbDeviceRegistryUtils.mapErrorToResult(error, span)));
}
Expand All @@ -199,6 +208,7 @@ public Future<Result<Void>> deleteDevice(final String tenantId, final String dev
Objects.requireNonNull(span);

return MongoDbDeviceRegistryUtils.isModificationEnabled(config)
.compose(ok -> tenantExists(tenantId, span))
.compose(ok -> processDeleteDevice(tenantId, deviceId, resourceVersion, span))
.recover(error -> Future.succeededFuture(MongoDbDeviceRegistryUtils.mapErrorToResult(error, span)));
}
Expand Down Expand Up @@ -508,4 +518,12 @@ private <T> Future<T> isMaxDevicesLimitReached(final String tenantId) {
return Future.succeededFuture();
});
}

private Future<Void> tenantExists(final String tenantId, final Span span) {

return tenantInformationService.tenantExists(tenantId, span)
.compose(result -> result.isOk() ? Future.succeededFuture()
: Future.failedFuture(StatusCodeMapper.from(result.getStatus(), null)));

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.concurrent.TimeUnit;

import org.eclipse.hono.deviceregistry.mongodb.config.MongoDbBasedRegistrationConfigProperties;
import org.eclipse.hono.deviceregistry.service.tenant.NoopTenantInformationService;
import org.eclipse.hono.service.management.device.AbstractDeviceManagementSearchDevicesTest;
import org.eclipse.hono.service.management.device.DeviceManagementService;
import org.junit.jupiter.api.AfterAll;
Expand Down Expand Up @@ -63,7 +64,8 @@ public void setup(final VertxTestContext testContext) {
registrationService = new MongoDbBasedRegistrationService(
vertx,
mongoClient,
config);
config,
new NoopTenantInformationService());
registrationService.start().onComplete(testContext.completing());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.eclipse.hono.auth.SpringBasedHonoPasswordEncoder;
import org.eclipse.hono.deviceregistry.mongodb.config.MongoDbBasedCredentialsConfigProperties;
import org.eclipse.hono.deviceregistry.mongodb.config.MongoDbBasedRegistrationConfigProperties;
import org.eclipse.hono.deviceregistry.service.tenant.NoopTenantInformationService;
import org.eclipse.hono.service.credentials.AbstractCredentialsServiceTest;
import org.eclipse.hono.service.credentials.CredentialsService;
import org.eclipse.hono.service.management.credentials.CredentialsManagementService;
Expand Down Expand Up @@ -79,7 +80,8 @@ public void setup(final VertxTestContext testContext) throws IOException {
registrationService = new MongoDbBasedRegistrationService(
vertx,
mongoClient,
registrationServiceConfig);
registrationServiceConfig,
new NoopTenantInformationService());
deviceBackendService = new MongoDbBasedDeviceBackend(this.registrationService, this.credentialsService);
credentialsService.start().onSuccess(ok -> started.flag());
registrationService.start().onSuccess(ok -> started.flag());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.concurrent.TimeUnit;

import org.eclipse.hono.deviceregistry.mongodb.config.MongoDbBasedRegistrationConfigProperties;
import org.eclipse.hono.deviceregistry.service.tenant.NoopTenantInformationService;
import org.eclipse.hono.service.management.device.DeviceManagementService;
import org.eclipse.hono.service.registration.RegistrationService;
import org.eclipse.hono.service.registration.RegistrationServiceTests;
Expand Down Expand Up @@ -65,7 +66,8 @@ public void setup(final VertxTestContext testContext) throws IOException {
registrationService = new MongoDbBasedRegistrationService(
vertx,
mongoClient,
config);
config,
new NoopTenantInformationService());
registrationService.start().onComplete(testContext.completing());
}

Expand Down

0 comments on commit c349b86

Please sign in to comment.