* ========================LICENSE_START=================================
* O-RAN-SC
* %%
- * Copyright (C) 2019 Nordix Foundation
+ * Copyright (C) 2020 Nordix Foundation
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.oransc.policyagent.clients.A1Client;
import org.oransc.policyagent.clients.A1ClientFactory;
+import org.oransc.policyagent.repository.Lock.LockType;
import org.oransc.policyagent.repository.Policies;
import org.oransc.policyagent.repository.PolicyTypes;
import org.oransc.policyagent.repository.Ric;
import reactor.core.publisher.Mono;
/**
- * Regularly checks the existing rics towards the local repository to keep it consistent.
+ * Regularly checks the existing rics towards the local repository to keep it
+ * consistent.
*/
@Component
@EnableScheduling
synchronized (this.rics) {
return Flux.fromIterable(rics.getRics()) //
.flatMap(this::createRicData) //
- .flatMap(this::checkRicState) //
- .flatMap(this::checkRicPolicies) //
- .flatMap(this::checkRicPolicyTypes);
+ .flatMap(this::checkOneRic) //
+ .onErrorResume(throwable -> Mono.empty());
}
}
+ private Mono<RicData> checkOneRic(RicData ricData) {
+ return checkRicState(ricData) //
+ .flatMap(x -> ricData.ric.getLock().lock(LockType.EXCLUSIVE)) //
+ .flatMap(x -> checkRicPolicies(ricData)) //
+ .flatMap(x -> ricData.ric.getLock().unlock()) //
+ .doOnError(throwable -> ricData.ric.getLock().unlockBlocking()) //
+ .flatMap(x -> checkRicPolicyTypes(ricData)); //
+ }
+
private static class RicData {
RicData(Ric ric, A1Client a1Client) {
this.ric = ric;
private Mono<RicData> checkRicState(RicData ric) {
if (ric.ric.getState() == RicState.UNDEFINED) {
- return startSynchronization(ric);
+ return startSynchronization(ric) //
+ .onErrorResume(t -> Mono.empty());
} else if (ric.ric.getState() == RicState.SYNCHRONIZING) {
return Mono.empty();
} else {
private Mono<RicData> checkRicPolicies(RicData ric) {
return ric.a1Client.getPolicyIdentities() //
- .onErrorResume(t -> Mono.empty()) //
.flatMap(ricP -> validateInstances(ricP, ric));
}
if (ricPolicies.size() != policies.getForRic(ric.ric.name()).size()) {
return startSynchronization(ric);
}
- }
- for (String policyId : ricPolicies) {
- if (!policies.containsPolicy(policyId)) {
- return startSynchronization(ric);
+
+ for (String policyId : ricPolicies) {
+ if (!policies.containsPolicy(policyId)) {
+ return startSynchronization(ric);
+ }
}
+ return Mono.just(ric);
}
- return Mono.just(ric);
}
private Mono<RicData> checkRicPolicyTypes(RicData ric) {
return ric.a1Client.getPolicyTypeIdentities() //
- .onErrorResume(notUsed -> Mono.empty()) //
.flatMap(ricTypes -> validateTypes(ricTypes, ric));
}
}
private Mono<RicData> startSynchronization(RicData ric) {
- RicSynchronizationTask recovery = createSynchronizationTask();
- recovery.run(ric.ric);
- return Mono.empty();
+ RicSynchronizationTask synchronizationTask = createSynchronizationTask();
+ synchronizationTask.run(ric.ric);
+ return Mono.error(new Exception("Syncronization started"));
}
@SuppressWarnings("squid:S2629")
RicSynchronizationTask createSynchronizationTask() {
return new RicSynchronizationTask(a1ClientFactory, policyTypes, policies, services);
}
-}
\ No newline at end of file
+}