Search in sources :

Example 1 with Tenant

use of org.eclipse.hono.service.management.tenant.Tenant in project hono by eclipse.

the class EdgeDeviceAutoProvisionerTest method verifySuccessfulAutoProvisioning.

@SuppressWarnings("unchecked")
private void verifySuccessfulAutoProvisioning() {
    final ArgumentCaptor<Device> registeredDeviceArgumentCaptor = ArgumentCaptor.forClass(Device.class);
    verify(deviceManagementService).createDevice(eq(Constants.DEFAULT_TENANT), eq(Optional.of(DEVICE_ID)), registeredDeviceArgumentCaptor.capture(), any());
    final Device registeredDevice = registeredDeviceArgumentCaptor.getValue();
    assertThat(registeredDevice).isEqualTo(NEW_EDGE_DEVICE);
    final ArgumentCaptor<Map<String, Object>> messageArgumentCaptor = ArgumentCaptor.forClass(Map.class);
    verify(sender).sendEvent(argThat(tenant -> tenant.getTenantId().equals(Constants.DEFAULT_TENANT)), argThat(assertion -> assertion.getDeviceId().equals(DEVICE_ID)), eq(EventConstants.CONTENT_TYPE_DEVICE_PROVISIONING_NOTIFICATION), any(), messageArgumentCaptor.capture(), any());
    verify(deviceManagementService).updateDevice(eq(Constants.DEFAULT_TENANT), eq(DEVICE_ID), argThat(device -> device.getStatus().isAutoProvisioningNotificationSent()), any(Optional.class), any(Span.class));
    final Map<String, Object> applicationProperties = messageArgumentCaptor.getValue();
    verifyApplicationProperties(GATEWAY_ID, DEVICE_ID, applicationProperties);
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) HttpURLConnection(java.net.HttpURLConnection) VertxTestContext(io.vertx.junit5.VertxTestContext) BeforeEach(org.junit.jupiter.api.BeforeEach) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) ArgumentMatchers.argThat(org.mockito.ArgumentMatchers.argThat) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) ServiceInvocationException(org.eclipse.hono.client.ServiceInvocationException) Constants(org.eclipse.hono.util.Constants) Tenant(org.eclipse.hono.service.management.tenant.Tenant) HashSet(java.util.HashSet) DeviceManagementService(org.eclipse.hono.service.management.device.DeviceManagementService) Answer(org.mockito.stubbing.Answer) MessagingType(org.eclipse.hono.util.MessagingType) ArgumentCaptor(org.mockito.ArgumentCaptor) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) Map(java.util.Map) TracingMockSupport(org.eclipse.hono.test.TracingMockSupport) RegistryManagementConstants(org.eclipse.hono.util.RegistryManagementConstants) Device(org.eclipse.hono.service.management.device.Device) EventSender(org.eclipse.hono.client.telemetry.EventSender) MessagingClientProvider(org.eclipse.hono.client.util.MessagingClientProvider) NoopTracerFactory(io.opentracing.noop.NoopTracerFactory) Vertx(io.vertx.core.Vertx) RegistrationAssertion(org.eclipse.hono.util.RegistrationAssertion) Mockito.when(org.mockito.Mockito.when) Truth.assertThat(com.google.common.truth.Truth.assertThat) DeviceStatus(org.eclipse.hono.service.management.device.DeviceStatus) MessageHelper(org.eclipse.hono.util.MessageHelper) VertxExtension(io.vertx.junit5.VertxExtension) EventConstants(org.eclipse.hono.util.EventConstants) Future(io.vertx.core.Future) Mockito.verify(org.mockito.Mockito.verify) TenantObject(org.eclipse.hono.util.TenantObject) Test(org.junit.jupiter.api.Test) Mockito.never(org.mockito.Mockito.never) List(java.util.List) VertxMockSupport(org.eclipse.hono.test.VertxMockSupport) Optional(java.util.Optional) OperationResult(org.eclipse.hono.service.management.OperationResult) Span(io.opentracing.Span) Collections(java.util.Collections) Id(org.eclipse.hono.service.management.Id) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Mockito.mock(org.mockito.Mockito.mock) Optional(java.util.Optional) Device(org.eclipse.hono.service.management.device.Device) TenantObject(org.eclipse.hono.util.TenantObject) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Map(java.util.Map) Span(io.opentracing.Span)

Example 2 with Tenant

use of org.eclipse.hono.service.management.tenant.Tenant in project hono by eclipse.

the class AbstractTenantManagementServiceTest method testNotificationOnUpdateTenant.

/**
 * Verifies that {@link AbstractTenantManagementService#updateTenant(String, Tenant, Optional, Span)} publishes the
 * expected notification.
 *
 * @param context The vert.x test context.
 */
@Test
public void testNotificationOnUpdateTenant(final VertxTestContext context) {
    final var notificationArgumentCaptor = ArgumentCaptor.forClass(TenantChangeNotification.class);
    tenantManagementService.createTenant(Optional.of(DEFAULT_TENANT_ID), new Tenant(), SPAN).compose(result -> tenantManagementService.updateTenant(DEFAULT_TENANT_ID, new Tenant().setEnabled(false), Optional.empty(), SPAN)).onComplete(context.succeeding(result -> {
        context.verify(() -> {
            verify(eventBus, times(2)).publish(eq(NotificationEventBusSupport.getEventBusAddress(TenantChangeNotification.TYPE)), notificationArgumentCaptor.capture(), any());
            assertThat(notificationArgumentCaptor.getAllValues().size()).isEqualTo(2);
            final var notification = notificationArgumentCaptor.getValue();
            assertThat(notification).isNotNull();
            assertThat(notification.getChange()).isEqualTo(LifecycleChange.UPDATE);
            assertThat(notification.getTenantId()).isEqualTo(DEFAULT_TENANT_ID);
            assertThat(notification.getCreationTime()).isNotNull();
            assertThat(notification.isEnabled()).isFalse();
        });
        context.completeNow();
    }));
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) HttpURLConnection(java.net.HttpURLConnection) VertxTestContext(io.vertx.junit5.VertxTestContext) BeforeEach(org.junit.jupiter.api.BeforeEach) LifecycleChange(org.eclipse.hono.notification.deviceregistry.LifecycleChange) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Tenant(org.eclipse.hono.service.management.tenant.Tenant) ArgumentCaptor(org.mockito.ArgumentCaptor) EventBus(io.vertx.core.eventbus.EventBus) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) TenantChangeNotification(org.eclipse.hono.notification.deviceregistry.TenantChangeNotification) Vertx(io.vertx.core.Vertx) Mockito.times(org.mockito.Mockito.times) Mockito.when(org.mockito.Mockito.when) Truth.assertThat(com.google.common.truth.Truth.assertThat) VertxExtension(io.vertx.junit5.VertxExtension) Result(org.eclipse.hono.service.management.Result) Future(io.vertx.core.Future) Mockito.verify(org.mockito.Mockito.verify) Test(org.junit.jupiter.api.Test) Optional(java.util.Optional) OperationResult(org.eclipse.hono.service.management.OperationResult) Span(io.opentracing.Span) NotificationEventBusSupport(org.eclipse.hono.notification.NotificationEventBusSupport) NoopSpan(io.opentracing.noop.NoopSpan) Id(org.eclipse.hono.service.management.Id) Mockito.mock(org.mockito.Mockito.mock) Tenant(org.eclipse.hono.service.management.tenant.Tenant) Test(org.junit.jupiter.api.Test)

Example 3 with Tenant

use of org.eclipse.hono.service.management.tenant.Tenant in project hono by eclipse.

the class AbstractTenantManagementServiceTest method testNotificationOnDeleteTenant.

/**
 * Verifies that {@link AbstractTenantManagementService#deleteTenant(String, Optional, Span)} publishes the expected
 * notification.
 *
 * @param context The vert.x test context.
 */
@Test
public void testNotificationOnDeleteTenant(final VertxTestContext context) {
    final var notificationArgumentCaptor = ArgumentCaptor.forClass(TenantChangeNotification.class);
    tenantManagementService.createTenant(Optional.of(DEFAULT_TENANT_ID), new Tenant(), SPAN).compose(result -> tenantManagementService.deleteTenant(DEFAULT_TENANT_ID, Optional.empty(), SPAN)).onComplete(context.succeeding(result -> {
        context.verify(() -> {
            verify(eventBus, times(2)).publish(eq(NotificationEventBusSupport.getEventBusAddress(TenantChangeNotification.TYPE)), notificationArgumentCaptor.capture(), any());
            assertThat(notificationArgumentCaptor.getAllValues().size()).isEqualTo(2);
            final var notification = notificationArgumentCaptor.getValue();
            assertThat(notification).isNotNull();
            assertThat(notification.getChange()).isEqualTo(LifecycleChange.DELETE);
            assertThat(notification.getTenantId()).isEqualTo(DEFAULT_TENANT_ID);
            assertThat(notification.getCreationTime()).isNotNull();
            assertThat(notification.isEnabled()).isFalse();
        });
        context.completeNow();
    }));
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) HttpURLConnection(java.net.HttpURLConnection) VertxTestContext(io.vertx.junit5.VertxTestContext) BeforeEach(org.junit.jupiter.api.BeforeEach) LifecycleChange(org.eclipse.hono.notification.deviceregistry.LifecycleChange) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Tenant(org.eclipse.hono.service.management.tenant.Tenant) ArgumentCaptor(org.mockito.ArgumentCaptor) EventBus(io.vertx.core.eventbus.EventBus) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) TenantChangeNotification(org.eclipse.hono.notification.deviceregistry.TenantChangeNotification) Vertx(io.vertx.core.Vertx) Mockito.times(org.mockito.Mockito.times) Mockito.when(org.mockito.Mockito.when) Truth.assertThat(com.google.common.truth.Truth.assertThat) VertxExtension(io.vertx.junit5.VertxExtension) Result(org.eclipse.hono.service.management.Result) Future(io.vertx.core.Future) Mockito.verify(org.mockito.Mockito.verify) Test(org.junit.jupiter.api.Test) Optional(java.util.Optional) OperationResult(org.eclipse.hono.service.management.OperationResult) Span(io.opentracing.Span) NotificationEventBusSupport(org.eclipse.hono.notification.NotificationEventBusSupport) NoopSpan(io.opentracing.noop.NoopSpan) Id(org.eclipse.hono.service.management.Id) Mockito.mock(org.mockito.Mockito.mock) Tenant(org.eclipse.hono.service.management.tenant.Tenant) Test(org.junit.jupiter.api.Test)

Example 4 with Tenant

use of org.eclipse.hono.service.management.tenant.Tenant in project hono by eclipse.

the class DeviceRegistryUtils method convertTenant.

/**
 * Converts a {@link Tenant} instance to a {@link TenantObject}.
 *
 * @param tenantId The identifier of the tenant.
 * @param source The source tenant object.
 * @param filterAuthorities {@code true} if CAs which are not valid at this point in time should be filtered out.
 * @return The converted tenant object.
 * @throws NullPointerException if tenantId or source are {@code null}.
 */
public static JsonObject convertTenant(final String tenantId, final Tenant source, final boolean filterAuthorities) {
    final Instant now = Instant.now();
    Objects.requireNonNull(tenantId);
    Objects.requireNonNull(source);
    final TenantObject target = TenantObject.from(tenantId, source.isEnabled());
    target.setResourceLimits(source.getResourceLimits());
    target.setTracingConfig(source.getTracing());
    Optional.ofNullable(source.getMinimumMessageSize()).ifPresent(size -> target.setMinimumMessageSize(size));
    Optional.ofNullable(source.getDefaults()).map(JsonObject::new).ifPresent(defaults -> target.setDefaults(defaults));
    Optional.ofNullable(source.getAdapters()).filter(adapters -> !adapters.isEmpty()).map(adapters -> adapters.stream().map(adapter -> JsonObject.mapFrom(adapter)).map(json -> json.mapTo(org.eclipse.hono.util.Adapter.class)).collect(Collectors.toList())).ifPresent(adapters -> target.setAdapters(adapters));
    Optional.ofNullable(source.getExtensions()).map(JsonObject::new).ifPresent(extensions -> target.setProperty(RegistryManagementConstants.FIELD_EXT, extensions));
    Optional.ofNullable(source.getTrustedCertificateAuthorities()).map(list -> list.stream().filter(ca -> {
        if (filterAuthorities) {
            // filter out CAs which are not valid at this point in time
            return !now.isBefore(ca.getNotBefore()) && !now.isAfter(ca.getNotAfter());
        } else {
            return true;
        }
    }).map(ca -> JsonObject.mapFrom(ca)).map(json -> {
        // validity period is not included in TenantObject
        json.remove(RegistryManagementConstants.FIELD_SECRETS_NOT_BEFORE);
        json.remove(RegistryManagementConstants.FIELD_SECRETS_NOT_AFTER);
        // remove the attributes that are internal to the device registry
        // and not to be exposed to the adapters
        json.remove(RegistryManagementConstants.FIELD_AUTO_PROVISION_AS_GATEWAY);
        json.remove(RegistryManagementConstants.FIELD_AUTO_PROVISIONING_DEVICE_ID_TEMPLATE);
        return json;
    }).collect(JsonArray::new, JsonArray::add, JsonArray::addAll)).ifPresent(authorities -> target.setProperty(TenantConstants.FIELD_PAYLOAD_TRUSTED_CA, authorities));
    return JsonObject.mapFrom(target);
}
Also used : HttpURLConnection(java.net.HttpURLConnection) X509Certificate(java.security.cert.X509Certificate) CacheDirective(org.eclipse.hono.util.CacheDirective) CertificateFactory(java.security.cert.CertificateFactory) TenantConstants(org.eclipse.hono.util.TenantConstants) LoggerFactory(org.slf4j.LoggerFactory) PasswordSecret(org.eclipse.hono.service.management.credentials.PasswordSecret) ClientErrorException(org.eclipse.hono.client.ClientErrorException) Tenant(org.eclipse.hono.service.management.tenant.Tenant) HonoPasswordEncoder(org.eclipse.hono.auth.HonoPasswordEncoder) ByteArrayInputStream(java.io.ByteArrayInputStream) StringTokenizer(java.util.StringTokenizer) JsonObject(io.vertx.core.json.JsonObject) TracingHelper(org.eclipse.hono.tracing.TracingHelper) RegistryManagementConstants(org.eclipse.hono.util.RegistryManagementConstants) Logger(org.slf4j.Logger) Set(java.util.Set) CertificateException(java.security.cert.CertificateException) UUID(java.util.UUID) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) Future(io.vertx.core.Future) CredentialsConstants(org.eclipse.hono.util.CredentialsConstants) TenantObject(org.eclipse.hono.util.TenantObject) Objects(java.util.Objects) JsonArray(io.vertx.core.json.JsonArray) List(java.util.List) CommonCredential(org.eclipse.hono.service.management.credentials.CommonCredential) Optional(java.util.Optional) Span(io.opentracing.Span) Pattern(java.util.regex.Pattern) Collections(java.util.Collections) PasswordCredential(org.eclipse.hono.service.management.credentials.PasswordCredential) JsonArray(io.vertx.core.json.JsonArray) TenantObject(org.eclipse.hono.util.TenantObject) Instant(java.time.Instant)

Example 5 with Tenant

use of org.eclipse.hono.service.management.tenant.Tenant in project hono by eclipse.

the class AmqpConnectionIT method testConnectFailsAfterDeviceDeleted.

/**
 * Verifies that after a device has already connected successfully to the adapter, the deletion of device
 * registration data causes the adapter to refuse any following connection attempts.
 * <p>
 * This test relies upon the registration client cache data in the adapter getting deleted when the device is
 * deleted (triggered via a corresponding notification from the device registry).
 *
 * @param ctx The test context.
 */
@Test
public void testConnectFailsAfterDeviceDeleted(final VertxTestContext ctx) {
    final String tenantId = helper.getRandomTenantId();
    final String deviceId = helper.getRandomDeviceId(tenantId);
    final String password = "secret";
    final Tenant tenant = new Tenant();
    helper.registry.addDeviceForTenant(tenantId, tenant, deviceId, password).compose(ok -> connectToAdapter(IntegrationTestSupport.getUsername(deviceId, tenantId), password)).compose(con -> {
        // first connection attempt successful
        con.close();
        // now remove device
        return helper.registry.deregisterDevice(tenantId, deviceId);
    }).compose(ok -> {
        final Promise<Void> resultPromise = Promise.promise();
        // device deleted, now wait a bit for the device registry notifications to trigger registration cache invalidation
        vertx.setTimer(500, tid -> resultPromise.complete());
        return resultPromise.future();
    }).compose(ok -> connectToAdapter(IntegrationTestSupport.getUsername(deviceId, tenantId), password)).onComplete(ctx.failing(t -> {
        ctx.verify(() -> assertThat(t).isInstanceOf(AuthenticationException.class));
        ctx.completeNow();
    }));
}
Also used : HttpURLConnection(java.net.HttpURLConnection) VertxTestContext(io.vertx.junit5.VertxTestContext) KeyPair(java.security.KeyPair) CsvSource(org.junit.jupiter.params.provider.CsvSource) SelfSignedCertificate(io.vertx.core.net.SelfSignedCertificate) ClientErrorException(org.eclipse.hono.client.ClientErrorException) SaslException(javax.security.sasl.SaslException) Supplier(java.util.function.Supplier) Constants(org.eclipse.hono.util.Constants) Tenant(org.eclipse.hono.service.management.tenant.Tenant) Timeout(io.vertx.junit5.Timeout) GeneralSecurityException(java.security.GeneralSecurityException) IntegrationTestSupport(org.eclipse.hono.tests.IntegrationTestSupport) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) Assumptions.assumeTrue(org.junit.jupiter.api.Assumptions.assumeTrue) JsonObject(io.vertx.core.json.JsonObject) Tenants(org.eclipse.hono.tests.Tenants) RegistryManagementConstants(org.eclipse.hono.util.RegistryManagementConstants) ValueSource(org.junit.jupiter.params.provider.ValueSource) SSLHandshakeException(javax.net.ssl.SSLHandshakeException) Promise(io.vertx.core.Promise) RegistrationConstants(org.eclipse.hono.util.RegistrationConstants) UUID(java.util.UUID) Truth.assertThat(com.google.common.truth.Truth.assertThat) VertxExtension(io.vertx.junit5.VertxExtension) Future(io.vertx.core.Future) TimeUnit(java.util.concurrent.TimeUnit) Test(org.junit.jupiter.api.Test) Adapter(org.eclipse.hono.util.Adapter) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) AuthenticationException(javax.security.sasl.AuthenticationException) Tenant(org.eclipse.hono.service.management.tenant.Tenant) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Aggregations

Tenant (org.eclipse.hono.service.management.tenant.Tenant)165 Test (org.junit.jupiter.api.Test)138 VertxTestContext (io.vertx.junit5.VertxTestContext)137 HttpURLConnection (java.net.HttpURLConnection)122 Truth.assertThat (com.google.common.truth.Truth.assertThat)113 TimeUnit (java.util.concurrent.TimeUnit)109 JsonObject (io.vertx.core.json.JsonObject)108 Future (io.vertx.core.Future)107 Timeout (io.vertx.junit5.Timeout)99 IntegrationTestSupport (org.eclipse.hono.tests.IntegrationTestSupport)98 RegistryManagementConstants (org.eclipse.hono.util.RegistryManagementConstants)97 Constants (org.eclipse.hono.util.Constants)95 Tenants (org.eclipse.hono.tests.Tenants)92 Optional (java.util.Optional)91 Promise (io.vertx.core.Promise)86 Device (org.eclipse.hono.service.management.device.Device)80 Adapter (org.eclipse.hono.util.Adapter)78 VertxExtension (io.vertx.junit5.VertxExtension)77 ExtendWith (org.junit.jupiter.api.extension.ExtendWith)77 Logger (org.slf4j.Logger)74