Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DEV-2209] Support NetworkState for getEquipmentContainer #200

Merged
merged 4 commits into from
Jan 14, 2025
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
* Added collection of `EndDeviceFunctionKind` to `EndDevice`
* Added an unordered collection comparator.
* Added the energized relationship for the current state of network between `Feeder` and `LvFeeder`.
* Updated `NetworkConsumer.getEquipmentForContainers` to allow requesting normal, current or all equipments.
* Updated `NetworkConsumer`'s `getEquipmentForContainers` and `getEquipmentContainers` to allow requesting normal, current or all equipments.
charlta marked this conversation as resolved.
Show resolved Hide resolved

### Fixes
* None.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ class NetworkConsumerClient(
* @param expectedClass The expected type of the fetched container.
* @param includeEnergizingContainers The level of energizing containers to include equipment from.
* @param includeEnergizedContainers The level of energized containers to include equipment from.
* @param networkState The network state of the equipment.
*
* @return A [GrpcResult] of a [MultiObjectResult]. If successful, containing a map keyed by mRID of all the objects retrieved. If an item couldn't be added to
* [service], its mRID will be present in [MultiObjectResult.failed].
Expand All @@ -287,10 +288,11 @@ class NetworkConsumerClient(
mRID: String,
expectedClass: Class<out EquipmentContainer> = EquipmentContainer::class.java,
includeEnergizingContainers: IncludedEnergizingContainers = IncludedEnergizingContainers.EXCLUDE_ENERGIZING_CONTAINERS,
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS,
networkState: NetworkState = NetworkState.NORMAL_NETWORK_STATE
): GrpcResult<MultiObjectResult> =
tryRpc {
val result = getEquipmentContainers(sequenceOf(mRID), expectedClass, includeEnergizingContainers, includeEnergizedContainers)
val result = getEquipmentContainers(sequenceOf(mRID), expectedClass, includeEnergizingContainers, includeEnergizedContainers, networkState)
if (result.wasFailure)
throw result.thrown

Expand All @@ -310,6 +312,7 @@ class NetworkConsumerClient(
* @param expectedClass The expected type of the fetched containers.
* @param includeEnergizingContainers The level of energizing containers to include equipment from.
* @param includeEnergizedContainers The level of energized containers to include equipment from.
* @param networkState The network state of the equipment.
*
* @return A [GrpcResult] of a [MultiObjectResult]. If successful, containing a map keyed by mRID of all the objects retrieved. If an item was not found, or
* couldn't be added to [service], it will be excluded from the map and its mRID will be present in [MultiObjectResult.failed]
Expand All @@ -322,9 +325,10 @@ class NetworkConsumerClient(
mRIDs: Iterable<String>,
expectedClass: Class<out EquipmentContainer> = EquipmentContainer::class.java,
includeEnergizingContainers: IncludedEnergizingContainers = IncludedEnergizingContainers.EXCLUDE_ENERGIZING_CONTAINERS,
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS,
networkState: NetworkState = NetworkState.NORMAL_NETWORK_STATE
): GrpcResult<MultiObjectResult> =
getEquipmentContainers(mRIDs.asSequence(), expectedClass, includeEnergizingContainers, includeEnergizedContainers)
getEquipmentContainers(mRIDs.asSequence(), expectedClass, includeEnergizingContainers, includeEnergizedContainers, networkState)

/***
* Retrieve the equipment container networks for the specified [mRID]s and store the results in the [service].
Expand All @@ -336,6 +340,7 @@ class NetworkConsumerClient(
* @param expectedClass The expected type of the fetched containers.
* @param includeEnergizingContainers The level of energizing containers to include equipment from.
* @param includeEnergizedContainers The level of energized containers to include equipment from.
* @param networkState The network state of the equipment.
*
* @return A [GrpcResult] of a [MultiObjectResult]. If successful, containing a map keyed by mRID of all the objects retrieved. If an item was not found, or
* couldn't be added to [service], it will be excluded from the map and its mRID will be present in [MultiObjectResult.failed]
Expand All @@ -348,10 +353,11 @@ class NetworkConsumerClient(
mRIDs: Sequence<String>,
expectedClass: Class<out EquipmentContainer> = EquipmentContainer::class.java,
includeEnergizingContainers: IncludedEnergizingContainers = IncludedEnergizingContainers.EXCLUDE_ENERGIZING_CONTAINERS,
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS,
networkState: NetworkState = NetworkState.NORMAL_NETWORK_STATE
): GrpcResult<MultiObjectResult> =
getWithReferences(mRIDs, expectedClass) { it, (objects, _) ->
objects.putAll(getEquipmentForContainers(it.map { eq -> eq.mRID }, includeEnergizingContainers, includeEnergizedContainers)
objects.putAll(getEquipmentForContainers(it.map { eq -> eq.mRID }, includeEnergizingContainers, includeEnergizedContainers, networkState)
.onError { thrown, wasHandled -> return@getWithReferences GrpcResult.ofError(thrown, wasHandled) }
.value.objects
)
Expand Down Expand Up @@ -680,10 +686,29 @@ class NetworkConsumerClient(

}

/***
* Retrieve the equipment container network for the specified [mRID] and store the results in the [NetworkConsumerClient.service].
*
* This is a Kotlin's generic convenience method that will fetch the container object and all the equipment contained, along with all subsequent
* references. This should entail a complete connectivity model for the container, however not the connectivity between multiple containers.
*
* @param mRID The mRID of the [EquipmentContainer] to fetch.
* @param includeEnergizingContainers The level of energizing containers to include equipment from.
* @param includeEnergizedContainers The level of energized containers to include equipment from.
* @param networkState The network state of the equipment.
*
* @return A [GrpcResult] of a [MultiObjectResult]. If successful, containing a map keyed by mRID of all the objects retrieved. If an item couldn't be added to
* [NetworkConsumerClient.service], its mRID will be present in [MultiObjectResult.failed].
*
* In addition to normal gRPC errors, you may also receive an unsuccessful [GrpcResult] with the following errors:
* - [NoSuchElementException] if the requested object was not found.
* - [ClassCastException] if the requested object was of the wrong type.
*/
inline fun <reified T : EquipmentContainer> NetworkConsumerClient.getEquipmentContainer(
mRID: String,
includeEnergizingContainers: IncludedEnergizingContainers = IncludedEnergizingContainers.EXCLUDE_ENERGIZING_CONTAINERS,
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS
includeEnergizedContainers: IncludedEnergizedContainers = IncludedEnergizedContainers.EXCLUDE_ENERGIZED_CONTAINERS,
networkState: NetworkState = NetworkState.NORMAL_NETWORK_STATE
): GrpcResult<MultiObjectResult> {
return getEquipmentContainer(mRID, T::class.java, includeEnergizingContainers, includeEnergizedContainers)
return getEquipmentContainer(mRID, T::class.java, includeEnergizingContainers, includeEnergizedContainers, networkState)
}
Original file line number Diff line number Diff line change
Expand Up @@ -161,22 +161,31 @@ internal class NetworkConsumerClientTest {
}

@Test
internal fun `server receives container options for getEquipmentForContainers`() {
internal fun `server receives container options for getting equipment containers`() {
val mRID = "f001"
val includeEnergizingContainers = IncludedEnergizingContainers.INCLUDE_ENERGIZING_SUBSTATIONS
val includeEnergizedContainers = IncludedEnergizedContainers.INCLUDE_ENERGIZED_LV_FEEDERS
val networkState = NetworkState.CURRENT_NETWORK_STATE
consumerService.onGetEquipmentForContainers = spy { request, _ ->
assertThat(request.mridsList, containsInAnyOrder("id"))
assertThat(request.includeEnergizingContainers, equalTo(IncludedEnergizingContainers.INCLUDE_ENERGIZING_SUBSTATIONS))
assertThat(request.includeEnergizedContainers, equalTo(IncludedEnergizedContainers.INCLUDE_ENERGIZED_LV_FEEDERS))
assertThat(request.networkState, equalTo(NetworkState.CURRENT_NETWORK_STATE))
assertThat(request.mridsList, containsInAnyOrder(mRID))
assertThat(request.includeEnergizingContainers, equalTo(includeEnergizingContainers))
assertThat(request.includeEnergizedContainers, equalTo(includeEnergizedContainers))
assertThat(request.networkState, equalTo(networkState))
}

consumerClient.getEquipmentForContainer(
"id",
includeEnergizingContainers = IncludedEnergizingContainers.INCLUDE_ENERGIZING_SUBSTATIONS,
includeEnergizedContainers = IncludedEnergizedContainers.INCLUDE_ENERGIZED_LV_FEEDERS,
networkState = NetworkState.CURRENT_NETWORK_STATE
)
val expectedService = FeederNetwork.create()
configureFeederResponses(expectedService)

consumerClient.getEquipmentForContainer(mRID, includeEnergizingContainers, includeEnergizedContainers, networkState)
consumerClient.getEquipmentForContainer(Feeder(mRID), includeEnergizingContainers, includeEnergizedContainers, networkState)
consumerClient.getEquipmentForContainers(listOf(mRID), includeEnergizingContainers, includeEnergizedContainers, networkState)
consumerClient.getEquipmentForContainers(sequenceOf(mRID), includeEnergizingContainers, includeEnergizedContainers, networkState)
consumerClient.getEquipmentContainer<Feeder>(mRID, includeEnergizingContainers, includeEnergizedContainers, networkState)
consumerClient.getEquipmentContainer(mRID, Feeder::class.java, includeEnergizingContainers, includeEnergizedContainers, networkState)
consumerClient.getEquipmentContainers(listOf(mRID), Feeder::class.java, includeEnergizingContainers, includeEnergizedContainers, networkState)
consumerClient.getEquipmentContainers(sequenceOf(mRID), Feeder::class.java, includeEnergizingContainers, includeEnergizedContainers, networkState)

verify(consumerService.onGetEquipmentForContainers).invoke(any(), any())
verify(consumerService.onGetEquipmentForContainers, times(8)).invoke(any(), any())
}

@Test
Expand Down Expand Up @@ -470,11 +479,11 @@ internal class NetworkConsumerClientTest {
@Test
internal fun `get equipment containers sequence variant coverage`() {
val expectedResult = mock<GrpcResult<MultiObjectResult>>()
doReturn(expectedResult).`when`(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any())
doReturn(expectedResult).`when`(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any(), any())

assertThat(consumerClient.getEquipmentContainers(sequenceOf("f001")), equalTo(expectedResult))

verify(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any())
verify(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any(), any())
}

@Test
Expand Down Expand Up @@ -563,7 +572,7 @@ internal class NetworkConsumerClientTest {
val connectivityNode = ConnectivityNode()

doReturn(expectedResult).`when`(consumerClient).getEquipmentForContainer(eq(feeder.mRID), any(), any(), any())
doReturn(expectedResult).`when`(consumerClient).getEquipmentContainer(eq(feeder.mRID), any(), any(), any())
doReturn(expectedResult).`when`(consumerClient).getEquipmentContainer(eq(feeder.mRID), any(), any(), any(), any())
doReturn(expectedResult).`when`(consumerClient).getEquipmentForRestriction(eq(operationalRestriction.mRID))
doReturn(expectedResult).`when`(consumerClient).getTerminalsForConnectivityNode(eq(connectivityNode.mRID))

Expand All @@ -578,13 +587,13 @@ internal class NetworkConsumerClientTest {
val result1 = mock<GrpcResult<MultiObjectResult>>()
val result2 = mock<GrpcResult<MultiObjectResult>>()

doReturn(result1).`when`(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any())
doReturn(result1).`when`(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any(), any())
doReturn(result2).`when`(consumerClient).getEquipmentForContainers(any<Sequence<String>>(), any(), any(), any())

assertThat(consumerClient.getEquipmentContainers(listOf("id")), equalTo(result1))
assertThat(consumerClient.getEquipmentForContainers(listOf("id")), equalTo(result2))

verify(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any())
verify(consumerClient).getEquipmentContainers(any<Sequence<String>>(), any(), any(), any(), any())
verify(consumerClient).getEquipmentForContainers(any<Sequence<String>>(), any(), any(), any())
}

Expand Down Expand Up @@ -675,13 +684,14 @@ internal class NetworkConsumerClientTest {
internal fun `generic get equipment container calls java interop`() {
val result = mock<GrpcResult<MultiObjectResult>>()

doReturn(result).`when`(consumerClient).getEquipmentContainer(any(), any(), any(), any())
doReturn(result).`when`(consumerClient).getEquipmentContainer(any(), any(), any(), any(), any())

assertThat(
consumerClient.getEquipmentContainer<Feeder>(
"fdr",
IncludedEnergizingContainers.INCLUDE_ENERGIZING_SUBSTATIONS,
IncludedEnergizedContainers.INCLUDE_ENERGIZED_LV_FEEDERS
IncludedEnergizedContainers.INCLUDE_ENERGIZED_LV_FEEDERS,
NetworkState.ALL_NETWORK_STATE
),
equalTo(result)
)
Expand All @@ -690,7 +700,8 @@ internal class NetworkConsumerClientTest {
"fdr",
Feeder::class.java,
IncludedEnergizingContainers.INCLUDE_ENERGIZING_SUBSTATIONS,
IncludedEnergizedContainers.INCLUDE_ENERGIZED_LV_FEEDERS
IncludedEnergizedContainers.INCLUDE_ENERGIZED_LV_FEEDERS,
NetworkState.ALL_NETWORK_STATE
)
}

Expand Down
Loading