70970f6dab229914125469489c3e211f658f37da
[ccsdk/cds.git] / ms / blueprintsprocessor / modules / commons / processor-core / src / main / kotlin / org / onap / ccsdk / cds / blueprintsprocessor / core / cluster / HazlecastClusterUtils.kt
1 /*
2  * Copyright © 2018-2019 AT&T Intellectual Property.
3  *
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.onap.ccsdk.cds.blueprintsprocessor.core.cluster
18
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
25 import java.util.UUID
26 import java.util.concurrent.TimeUnit
27
28 object HazlecastClusterUtils {
29
30     private val log = logger(HazlecastClusterUtils::class)
31
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")
44             }
45             else -> log.debug("Client instance not eligible for CP Member promotion")
46         }
47     }
48
49     /** Terminate [hazelcastInstance] member */
50     fun terminate(hazelcastInstance: HazelcastInstance) {
51         log.info("Terminating Member : ${hazelcastInstance.cluster.localMember}")
52         hazelcastInstance.lifecycleService.terminate()
53     }
54
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)
61         }
62     }
63
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)")
70     }
71
72     /** Get [hazelcastInstance] CP Group members*/
73     fun cpGroupMembers(hazelcastInstance: HazelcastInstance): List<CPMember> {
74         return cpGroup(hazelcastInstance).members().toList()
75     }
76
77     /** Get [hazelcastInstance] CP Group[groupName] members*/
78     fun cpGroup(
79         hazelcastInstance: HazelcastInstance,
80         groupName: String? = CPGroup.METADATA_CP_GROUP_NAME
81     ): CPGroup {
82         return cpSubsystemManagementService(hazelcastInstance).getCPGroup(groupName)
83             .toCompletableFuture().get()
84     }
85
86     /** Get [hazelcastInstance] CP member UUIDs*/
87     fun clusterCPMemberUUIDs(hazelcastInstance: HazelcastInstance): List<UUID> {
88         return clusterCPMembers(hazelcastInstance).map { it.uuid }
89     }
90
91     /** Get [hazelcastInstance] CP members*/
92     fun clusterCPMembers(hazelcastInstance: HazelcastInstance): List<CPMember> {
93         return cpSubsystemManagementService(hazelcastInstance).cpMembers.toCompletableFuture().get().toList()
94     }
95
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
101     }
102
103     /** Get local CPMemberUUID for [hazelcastInstance] */
104     fun localCPMemberUUID(hazelcastInstance: HazelcastInstance) = localCPMember(hazelcastInstance)?.uuid
105
106     /** Check local member is CP member for [hazelcastInstance] */
107     fun checkLocalMemberIsCPMember(hazelcastInstance: HazelcastInstance): Boolean {
108         return localCPMember(hazelcastInstance) != null
109     }
110
111     /** Get local CP member for [hazelcastInstance] */
112     fun localCPMember(hazelcastInstance: HazelcastInstance) =
113         cpSubsystemManagementService(hazelcastInstance).localCPMember
114
115     /** Get local CP member UUID for [hazelcastInstance] */
116     fun localMemberUUID(hazelcastInstance: HazelcastInstance) = hazelcastInstance.cluster.localMember.uuid
117 }