Skip to content

Commit

Permalink
Merge pull request #20 from FIWARE/skipFailingDids
Browse files Browse the repository at this point in the history
Skip failing dids when building partylist
  • Loading branch information
pulledtim authored Jun 7, 2024
2 parents c31b50e + ae085dc commit 0ab2a53
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package org.fiware.iam.tir.repository;

import io.micronaut.http.annotation.Part;
import io.micronaut.scheduling.annotation.Scheduled;
import jakarta.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
import org.fiware.iam.did.model.DIDDocumentVO;
import org.fiware.iam.satellite.model.TrustedCAVO;
import org.fiware.iam.tir.auth.CertificateMapper;
import org.fiware.iam.tir.configuration.Party;
Expand All @@ -21,7 +19,6 @@
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

@Slf4j
@Singleton
Expand Down Expand Up @@ -66,34 +63,43 @@ private String isValid(X509Certificate cert) {

@Scheduled(fixedDelay = "15s")
public void updateParties() {
List<Party> updatedParties = new ArrayList<>(satelliteProperties.getParties());

issuersProvider.getAllTrustedIssuers()
.flatMap(til -> Mono.zip(til.stream().map(this::getPartyForIssuer).toList(), parties -> Arrays.stream(parties).toList()))
.subscribe(partiesList -> {
for (Object partyObject : partiesList) {
if (partyObject instanceof Party party) {
updatedParties.add(party);
} else {
log.warn("Object {} is not a party.", partyObject);
try {
List<Party> updatedParties = new ArrayList<>(satelliteProperties.getParties());
issuersProvider.getAllTrustedIssuers()
.flatMap(til -> Mono.zip(til.stream().map(this::getPartyForIssuer).toList(), parties -> Arrays.stream(parties).toList()))
.subscribe(partiesList -> {
for (Object partyObject : partiesList) {
if (partyObject instanceof Optional<?> optional && optional.isPresent() && optional.get() instanceof Party party) {
updatedParties.add(party);
} else {
log.warn("Optional Object {} is not a party or was empty.", partyObject);
}
}
}
parties.clear();
parties.addAll(updatedParties);
});
parties.clear();
parties.addAll(updatedParties);
log.trace("Current parties: {}", updatedParties.stream().map(party -> "%s -> %s".formatted(party.did(), party.crt())));
});
} catch (Exception e) {
log.error("Exception occurred while updating parties", e);
throw e;
}
}


private Mono<Party> getPartyForIssuer(TrustedIssuer trustedIssuer) {
private Mono<Optional<Party>> getPartyForIssuer(TrustedIssuer trustedIssuer) {

return didService.retrieveDidDocument(trustedIssuer.getIssuer())
.filter(Optional::isPresent)
.map(Optional::get)
.flatMap(didDoc -> didService
.getCertificate(didDoc)
.filter(Optional::isPresent)
.map(Optional::get)
.map(cert -> new Party(didDoc.getId(), didDoc.getId(), didDoc.getId(), "Active", cert, didDoc))
);
.map(cert -> Optional.of(new Party(didDoc.getId(), didDoc.getId(), didDoc.getId(), "Active", cert, didDoc)))
).onErrorResume(err -> {
log.error("Failed to retrieve data for issuer {}", trustedIssuer.getIssuer(), err);
return Mono.just(Optional.empty());
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.fiware.iam.tir.repository;

import io.micronaut.http.client.BlockingHttpClient;
import io.micronaut.http.client.HttpClient;
import org.assertj.core.api.Assertions;
import org.fiware.iam.did.model.DIDDocumentVO;
import org.fiware.iam.tir.auth.CertificateMapper;
import org.fiware.iam.tir.configuration.Party;
import org.fiware.iam.tir.configuration.SatelliteProperties;
import org.fiware.iam.tir.issuers.IssuersProvider;
import org.fiware.iam.tir.issuers.TrustedIssuer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class InMemoryPartiesRepoTest {

@Spy
private SatelliteProperties satelliteProperties = spy(new SatelliteProperties().setParties(List.of()));
@Mock
private IssuersProvider issuersProvider;
@Spy
private List<Party> parties = spy(new ArrayList<>());
@Mock
private DidService didService;
@Mock
private CertificateMapper certificateMapper;

@InjectMocks
private InMemoryPartiesRepo classUnderTest;

@Test
void updateParties() throws Exception{
var didDocument = new DIDDocumentVO().id("someId");

when(issuersProvider.getAllTrustedIssuers()).thenReturn(Mono.just(List.of(new TrustedIssuer("someId").setIssuer("good"),new TrustedIssuer("someOtherId").setIssuer("failing"))));
when(didService.retrieveDidDocument("good")).thenReturn(Mono.just(Optional.of(didDocument)));
when(didService.retrieveDidDocument("failing")).thenReturn(Mono.error(new IllegalStateException()));
when(didService.getCertificate(any())).thenReturn(Mono.just(Optional.of("cert")));
classUnderTest.updateParties();
Assertions.assertThat(classUnderTest.getParties()).hasSize(1);
Assertions.assertThat(classUnderTest.getParties()).element(0).isEqualTo(new Party("someId","someId","someId","Active","cert",didDocument));

}
}

0 comments on commit 0ab2a53

Please sign in to comment.