2 * Copyright © 2018-2019 AT&T Intellectual Property.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.ccsdk.cds.blueprintsprocessor.core.cluster
19 import com.hazelcast.core.HazelcastInstance
20 import com.hazelcast.cp.CPGroup
21 import com.hazelcast.cp.CPMember
22 import com.hazelcast.cp.CPSubsystemManagementService
23 import com.hazelcast.instance.impl.HazelcastInstanceProxy
24 import org.onap.ccsdk.cds.controllerblueprints.core.logger
26 import java.util.concurrent.TimeUnit
28 object HazlecastClusterUtils {
30 private val log = logger(HazlecastClusterUtils::class)
32 /** Promote [hazelcastInstance] member to CP Member */
33 fun promoteAsCPMember(hazelcastInstance: HazelcastInstance) {
34 when (hazelcastInstance) {
35 is HazelcastInstanceProxy -> {
36 val cpSubsystemManagementService = cpSubsystemManagementService(hazelcastInstance)
37 cpSubsystemManagementService.promoteToCPMember()
38 .toCompletableFuture().get()
39 log.info("Promoted as CP member(${hazelcastInstance.cluster.localMember})")
40 val clusterCPMembers = clusterCPMembers(hazelcastInstance)
41 log.info("CP Members(${clusterCPMembers.size}): $clusterCPMembers")
42 val cpGroupMembers = cpGroupMembers(hazelcastInstance)
43 log.info("CP Group Members(${cpGroupMembers.size}): $cpGroupMembers")
45 else -> log.debug("Client instance not eligible for CP Member promotion")
49 /** Terminate [hazelcastInstance] member */
50 fun terminate(hazelcastInstance: HazelcastInstance) {
51 log.info("Terminating Member : ${hazelcastInstance.cluster.localMember}")
52 hazelcastInstance.lifecycleService.terminate()
55 /** Remove [hazelcastInstance] member from cluster CP Member List*/
56 fun removeFromCPMember(hazelcastInstance: HazelcastInstance) {
57 // check CP Member, then remove */
58 val localCPMemberUuid = localCPMemberUUID(hazelcastInstance)
59 localCPMemberUuid?.let { uuid ->
60 removeFromCPMember(hazelcastInstance, uuid)
64 /** Remove [removeCPMemberUuid] member from cluster CP Member List, using [hazelcastInstance]*/
65 fun removeFromCPMember(hazelcastInstance: HazelcastInstance, removeCPMemberUuid: UUID) {
66 val cpSubsystemManagementService = cpSubsystemManagementService(hazelcastInstance)
67 cpSubsystemManagementService.removeCPMember(removeCPMemberUuid)
68 .toCompletableFuture().get()
69 log.info("Removed CP member($removeCPMemberUuid)")
72 /** Get [hazelcastInstance] CP Group members*/
73 fun cpGroupMembers(hazelcastInstance: HazelcastInstance): List<CPMember> {
74 return cpGroup(hazelcastInstance).members().toList()
77 /** Get [hazelcastInstance] CP Group[groupName] members*/
79 hazelcastInstance: HazelcastInstance,
80 groupName: String? = CPGroup.METADATA_CP_GROUP_NAME
82 return cpSubsystemManagementService(hazelcastInstance).getCPGroup(groupName)
83 .toCompletableFuture().get()
86 /** Get [hazelcastInstance] CP member UUIDs*/
87 fun clusterCPMemberUUIDs(hazelcastInstance: HazelcastInstance): List<UUID> {
88 return clusterCPMembers(hazelcastInstance).map { it.uuid }
91 /** Get [hazelcastInstance] CP members*/
92 fun clusterCPMembers(hazelcastInstance: HazelcastInstance): List<CPMember> {
93 return cpSubsystemManagementService(hazelcastInstance).cpMembers.toCompletableFuture().get().toList()
96 /** Get CPSubsystemManagementService for [hazelcastInstance] */
97 fun cpSubsystemManagementService(hazelcastInstance: HazelcastInstance): CPSubsystemManagementService {
98 val cpSubsystemManagementService = hazelcastInstance.cpSubsystem.cpSubsystemManagementService
99 cpSubsystemManagementService.awaitUntilDiscoveryCompleted(3, TimeUnit.MINUTES)
100 return cpSubsystemManagementService
103 /** Get local CPMemberUUID for [hazelcastInstance] */
104 fun localCPMemberUUID(hazelcastInstance: HazelcastInstance) = localCPMember(hazelcastInstance)?.uuid
106 /** Check local member is CP member for [hazelcastInstance] */
107 fun checkLocalMemberIsCPMember(hazelcastInstance: HazelcastInstance): Boolean {
108 return localCPMember(hazelcastInstance) != null
111 /** Get local CP member for [hazelcastInstance] */
112 fun localCPMember(hazelcastInstance: HazelcastInstance) =
113 cpSubsystemManagementService(hazelcastInstance).localCPMember
115 /** Get local CP member UUID for [hazelcastInstance] */
116 fun localMemberUUID(hazelcastInstance: HazelcastInstance) = hazelcastInstance.cluster.localMember.uuid