From 1e36316301ad804ed8a9a695029ef905fb0f19b0 Mon Sep 17 00:00:00 2001 From: Ax-For <1823366314@qq.com> Date: Tue, 26 Jul 2022 16:11:21 +0800 Subject: [PATCH] update NacosClusterControllerV2 --- ...ler.java => NacosClusterControllerV2.java} | 94 +++++------- .../service/NacosClusterOperationService.java | 107 +++++++++++++ .../v2/NacosClusterControllerV2Test.java | 138 +++++++++++++++++ .../v2/NacosClusterV2ControllerTest.java | 116 --------------- .../NacosClusterOperationServiceTest.java | 140 ++++++++++++++++++ 5 files changed, 421 insertions(+), 174 deletions(-) rename core/src/main/java/com/alibaba/nacos/core/controller/v2/{NacosClusterV2Controller.java => NacosClusterControllerV2.java} (56%) create mode 100644 core/src/main/java/com/alibaba/nacos/core/service/NacosClusterOperationService.java create mode 100644 core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterControllerV2Test.java delete mode 100644 core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterV2ControllerTest.java create mode 100644 core/src/test/java/com/alibaba/nacos/core/service/NacosClusterOperationServiceTest.java diff --git a/core/src/main/java/com/alibaba/nacos/core/controller/v2/NacosClusterV2Controller.java b/core/src/main/java/com/alibaba/nacos/core/controller/v2/NacosClusterControllerV2.java similarity index 56% rename from core/src/main/java/com/alibaba/nacos/core/controller/v2/NacosClusterV2Controller.java rename to core/src/main/java/com/alibaba/nacos/core/controller/v2/NacosClusterControllerV2.java index 4d1d46995ae..58e53158623 100644 --- a/core/src/main/java/com/alibaba/nacos/core/controller/v2/NacosClusterV2Controller.java +++ b/core/src/main/java/com/alibaba/nacos/core/controller/v2/NacosClusterControllerV2.java @@ -16,17 +16,20 @@ package com.alibaba.nacos.core.controller.v2; -import com.alibaba.nacos.common.Beta; +import com.alibaba.nacos.api.annotation.NacosApi; +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.exception.api.NacosApiException; +import com.alibaba.nacos.api.model.v2.ErrorCode; +import com.alibaba.nacos.api.model.v2.Result; import com.alibaba.nacos.common.model.RestResult; import com.alibaba.nacos.common.model.RestResultUtils; -import com.alibaba.nacos.common.utils.LoggerUtils; import com.alibaba.nacos.common.utils.StringUtils; import com.alibaba.nacos.core.cluster.Member; import com.alibaba.nacos.core.cluster.NodeState; -import com.alibaba.nacos.core.cluster.ServerMemberManager; import com.alibaba.nacos.core.model.request.LookupUpdateRequest; +import com.alibaba.nacos.core.service.NacosClusterOperationService; import com.alibaba.nacos.core.utils.Commons; -import com.alibaba.nacos.core.utils.Loggers; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -35,7 +38,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Locale; @@ -45,20 +47,20 @@ * * @author wuzhiguo */ -@Beta +@NacosApi @RestController @RequestMapping(Commons.NACOS_CORE_CONTEXT_V2 + "/cluster") -public class NacosClusterV2Controller { +public class NacosClusterControllerV2 { - private final ServerMemberManager memberManager; + private final NacosClusterOperationService nacosClusterOperationService; - public NacosClusterV2Controller(ServerMemberManager memberManager) { - this.memberManager = memberManager; + public NacosClusterControllerV2(NacosClusterOperationService nacosClusterOperationService) { + this.nacosClusterOperationService = nacosClusterOperationService; } - @GetMapping(value = "/nodes/self") - public RestResult self() { - return RestResultUtils.success(memberManager.getSelf()); + @GetMapping(value = "/node/self") + public Result self() { + return Result.success(nacosClusterOperationService.self()); } /** @@ -68,35 +70,24 @@ public RestResult self() { * @param state match state * @return members that matches condition */ - @GetMapping(value = "/nodes") - public RestResult> listNodes(@RequestParam(value = "address", required = false) String address, - @RequestParam(value = "state", required = false) String state) { + @GetMapping(value = "/node/list") + public Result> listNodes(@RequestParam(value = "address", required = false) String address, + @RequestParam(value = "state", required = false) String state) throws NacosException { NodeState nodeState = null; if (StringUtils.isNoneBlank(state)) { try { nodeState = NodeState.valueOf(state.toUpperCase(Locale.ROOT)); } catch (IllegalArgumentException e) { - return RestResultUtils.failedWithMsg(400, "Illegal state: " + state); + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_STATE, "Illegal state: " + state); } } - - Collection members = memberManager.allMembers(); - Collection result = new ArrayList<>(); - - for (Member member : members) { - if (StringUtils.isNoneBlank(address) && !StringUtils.startsWith(member.getAddress(), address)) { - continue; - } - - if (nodeState != null && member.getState() != nodeState) { - continue; - } - - result.add(member); - } - - return RestResultUtils.success(result); + return Result.success(nacosClusterOperationService.listNodes(address, nodeState)); + } + + @GetMapping(value = "/node/self/health") + public Result selfHealth() { + return Result.success(nacosClusterOperationService.selfHealth()); } // The client can get all the nacos node information in the current @@ -108,25 +99,13 @@ public RestResult> listNodes(@RequestParam(value = "address", * @param nodes List of {@link Member} * @return {@link RestResult} */ - @PutMapping(value = "/nodes") - public RestResult updateNodes(@RequestBody List nodes) { - for (Member node : nodes) { - if (!node.check()) { - LoggerUtils.printIfWarnEnabled(Loggers.CLUSTER, "node information is illegal, ignore node: {}", node); - continue; - } - - LoggerUtils.printIfDebugEnabled(Loggers.CLUSTER, "node state updating, node: {}", node); - node.setState(NodeState.UP); - node.setFailAccessCnt(0); - - boolean update = memberManager.update(node); - if (!update) { - LoggerUtils.printIfErrorEnabled(Loggers.CLUSTER, "node state update failed, node: {}", node); - } + @PutMapping(value = "/node/list") + public Result updateNodes(@RequestBody List nodes) throws NacosApiException { + if (nodes == null || nodes.size() == 0) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, + "required parameter 'nodes' is missing"); } - - return RestResultUtils.success(); + return Result.success(nacosClusterOperationService.updateNodes(nodes)); } /** @@ -136,13 +115,12 @@ public RestResult updateNodes(@RequestBody List nodes) { * @return {@link RestResult} */ @PutMapping(value = "/lookup") - public RestResult updateLookup(@RequestBody LookupUpdateRequest request) { - try { - memberManager.switchLookup(request.getType()); - return RestResultUtils.success(); - } catch (Throwable ex) { - return RestResultUtils.failed(ex.getMessage()); + public Result updateLookup(LookupUpdateRequest request) throws NacosException { + if (request == null || request.getType() == null) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, + "required parameter 'type' is missing"); } + return Result.success(nacosClusterOperationService.updateLookup(request)); } /** diff --git a/core/src/main/java/com/alibaba/nacos/core/service/NacosClusterOperationService.java b/core/src/main/java/com/alibaba/nacos/core/service/NacosClusterOperationService.java new file mode 100644 index 00000000000..5e99ce54a57 --- /dev/null +++ b/core/src/main/java/com/alibaba/nacos/core/service/NacosClusterOperationService.java @@ -0,0 +1,107 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.core.service; + +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.common.utils.LoggerUtils; +import com.alibaba.nacos.common.utils.StringUtils; +import com.alibaba.nacos.core.cluster.Member; +import com.alibaba.nacos.core.cluster.NodeState; +import com.alibaba.nacos.core.cluster.ServerMemberManager; +import com.alibaba.nacos.core.model.request.LookupUpdateRequest; +import com.alibaba.nacos.core.utils.Loggers; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * NacosClusterOperationService. + * @author dongyafei + * @date 2022/8/15 + */ +@Service +public class NacosClusterOperationService { + + private final ServerMemberManager memberManager; + + public NacosClusterOperationService(ServerMemberManager memberManager) { + this.memberManager = memberManager; + } + + public Member self() { + return memberManager.getSelf(); + } + + /** + * The console displays the list of cluster members. + */ + public Collection listNodes(String address, NodeState nodeState) throws NacosException { + + Collection members = memberManager.allMembers(); + Collection result = new ArrayList<>(); + + for (Member member : members) { + if (StringUtils.isNoneBlank(address) && !StringUtils.startsWith(member.getAddress(), address)) { + continue; + } + if (nodeState != null && member.getState() != nodeState) { + continue; + } + result.add(member); + } + return result; + } + + /** + * cluster members information update. + */ + public Boolean updateNodes(List nodes) { + for (Member node : nodes) { + if (!node.check()) { + LoggerUtils.printIfWarnEnabled(Loggers.CLUSTER, "node information is illegal, ignore node: {}", node); + continue; + } + + LoggerUtils.printIfDebugEnabled(Loggers.CLUSTER, "node state updating, node: {}", node); + node.setState(NodeState.UP); + node.setFailAccessCnt(0); + + boolean update = memberManager.update(node); + if (!update) { + LoggerUtils.printIfErrorEnabled(Loggers.CLUSTER, "node state update failed, node: {}", node); + } + } + return true; + } + + /** + * Addressing mode switch. + */ + public Boolean updateLookup(LookupUpdateRequest request) throws NacosException { + memberManager.switchLookup(request.getType()); + return true; + } + + /** + * query health of current node. + */ + public String selfHealth() { + return memberManager.getSelf().getState().name(); + } +} diff --git a/core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterControllerV2Test.java b/core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterControllerV2Test.java new file mode 100644 index 00000000000..5936c4211ab --- /dev/null +++ b/core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterControllerV2Test.java @@ -0,0 +1,138 @@ +/* + * Copyright 1999-2021 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.alibaba.nacos.core.controller.v2; + +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.exception.api.NacosApiException; +import com.alibaba.nacos.api.model.v2.ErrorCode; +import com.alibaba.nacos.api.model.v2.Result; +import com.alibaba.nacos.common.model.RestResult; +import com.alibaba.nacos.core.cluster.Member; +import com.alibaba.nacos.core.cluster.NodeState; +import com.alibaba.nacos.core.model.request.LookupUpdateRequest; +import com.alibaba.nacos.core.service.NacosClusterOperationService; +import com.alibaba.nacos.sys.env.EnvUtil; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.mock.env.MockEnvironment; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class NacosClusterControllerV2Test { + + @InjectMocks + private NacosClusterControllerV2 nacosClusterControllerV2; + + @Mock + private NacosClusterOperationService nacosClusterOperationService; + + private final MockEnvironment environment = new MockEnvironment(); + + @Before + public void setUp() { + nacosClusterControllerV2 = new NacosClusterControllerV2(nacosClusterOperationService); + EnvUtil.setEnvironment(environment); + } + + @Test + public void testSelf() { + Member self = new Member(); + when(nacosClusterOperationService.self()).thenReturn(self); + + Result result = nacosClusterControllerV2.self(); + assertEquals(ErrorCode.SUCCESS.getCode(), result.getCode()); + assertEquals(self, result.getData()); + } + + @Test + public void testListNodes() throws NacosException { + Member member1 = new Member(); + member1.setIp("1.1.1.1"); + member1.setPort(8848); + member1.setState(NodeState.DOWN); + Member member2 = new Member(); + member2.setIp("2.2.2.2"); + member2.setPort(8848); + + List members = Arrays.asList(member1, member2); + Mockito.when(nacosClusterOperationService.listNodes(any(), any())).thenReturn(members); + + Result> result = nacosClusterControllerV2.listNodes("1.1.1.1", null); + assertEquals(ErrorCode.SUCCESS.getCode(), result.getCode()); + assertTrue(result.getData().stream().findFirst().isPresent()); + assertEquals("1.1.1.1:8848", result.getData().stream().findFirst().get().getAddress()); + } + + @Test + public void testSelfHealth() { + String selfHealth = "UP"; + when(nacosClusterOperationService.selfHealth()).thenReturn(selfHealth); + + Result result = nacosClusterControllerV2.selfHealth(); + assertEquals(ErrorCode.SUCCESS.getCode(), result.getCode()); + assertEquals(selfHealth, result.getData()); + } + + @Test + public void testUpdate() throws NacosApiException { + Member member = new Member(); + member.setIp("1.1.1.1"); + member.setPort(8848); + member.setAddress("test"); + when(nacosClusterOperationService.updateNodes(any())).thenReturn(true); + Result result = nacosClusterControllerV2.updateNodes(Collections.singletonList(member)); + verify(nacosClusterOperationService).updateNodes(any()); + assertEquals(ErrorCode.SUCCESS.getCode(), result.getCode()); + assertEquals(true, result.getData()); + } + + @Test + public void testSwitchLookup() throws NacosException { + LookupUpdateRequest request = new LookupUpdateRequest(); + request.setType("test"); + + when(nacosClusterOperationService.updateLookup(any())).thenReturn(true); + Result result = nacosClusterControllerV2.updateLookup(request); + verify(nacosClusterOperationService).updateLookup(any()); + assertEquals(ErrorCode.SUCCESS.getCode(), result.getCode()); + assertEquals(true, result.getData()); + } + + @Test + public void testLeave() throws Exception { + RestResult result = nacosClusterControllerV2.deleteNodes(Collections.singletonList("1.1.1.1")); + Assert.assertFalse(result.ok()); + Assert.assertEquals(405, result.getCode()); + } +} diff --git a/core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterV2ControllerTest.java b/core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterV2ControllerTest.java deleted file mode 100644 index d6af466e2d3..00000000000 --- a/core/src/test/java/com/alibaba/nacos/core/controller/v2/NacosClusterV2ControllerTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 1999-2021 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.alibaba.nacos.core.controller.v2; - -import com.alibaba.nacos.common.model.RestResult; -import com.alibaba.nacos.core.cluster.Member; -import com.alibaba.nacos.core.cluster.NodeState; -import com.alibaba.nacos.core.cluster.ServerMemberManager; -import com.alibaba.nacos.core.model.request.LookupUpdateRequest; -import com.alibaba.nacos.sys.env.EnvUtil; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.mock.env.MockEnvironment; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -@RunWith(MockitoJUnitRunner.class) -public class NacosClusterV2ControllerTest { - - @InjectMocks - private NacosClusterV2Controller nacosClusterV2Controller; - - @Mock - private ServerMemberManager serverMemberManager; - - private final MockEnvironment environment = new MockEnvironment(); - - @Before - public void setUp() { - EnvUtil.setEnvironment(environment); - } - - @Test - public void testSelf() { - Member self = new Member(); - Mockito.when(serverMemberManager.getSelf()).thenReturn(self); - - RestResult result = nacosClusterV2Controller.self(); - Assert.assertTrue(result.ok()); - Assert.assertEquals(self, result.getData()); - } - - @Test - public void testListNodes() { - Member member1 = new Member(); - member1.setIp("1.1.1.1"); - member1.setPort(8848); - member1.setState(NodeState.DOWN); - Member member2 = new Member(); - member2.setIp("2.2.2.2"); - member2.setPort(8848); - - List members = Arrays.asList(member1, member2); - Mockito.when(serverMemberManager.allMembers()).thenReturn(members); - - RestResult> result1 = nacosClusterV2Controller.listNodes("1.1.1.1", null); - Assert.assertTrue(result1.getData().stream().findFirst().isPresent()); - Assert.assertEquals("1.1.1.1:8848", result1.getData().stream().findFirst().get().getAddress()); - - RestResult> result2 = nacosClusterV2Controller.listNodes(null, "up"); - Assert.assertTrue(result2.getData().stream().findFirst().isPresent()); - Assert.assertEquals("2.2.2.2:8848", result2.getData().stream().findFirst().get().getAddress()); - } - - @Test - public void testUpdate() { - Mockito.when(serverMemberManager.update(Mockito.any())).thenReturn(true); - - Member member = new Member(); - member.setIp("1.1.1.1"); - member.setPort(8848); - member.setAddress("test"); - RestResult result = nacosClusterV2Controller.updateNodes(Collections.singletonList(member)); - Assert.assertTrue(result.ok()); - } - - @Test - public void testSwitchLookup() { - LookupUpdateRequest request = new LookupUpdateRequest(); - request.setType("test"); - - RestResult result = nacosClusterV2Controller.updateLookup(request); - Assert.assertTrue(result.ok()); - } - - @Test - public void testLeave() throws Exception { - RestResult result = nacosClusterV2Controller.deleteNodes(Collections.singletonList("1.1.1.1")); - Assert.assertFalse(result.ok()); - Assert.assertEquals(405, result.getCode()); - } -} diff --git a/core/src/test/java/com/alibaba/nacos/core/service/NacosClusterOperationServiceTest.java b/core/src/test/java/com/alibaba/nacos/core/service/NacosClusterOperationServiceTest.java new file mode 100644 index 00000000000..5e46a42f745 --- /dev/null +++ b/core/src/test/java/com/alibaba/nacos/core/service/NacosClusterOperationServiceTest.java @@ -0,0 +1,140 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.core.service; + +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.core.cluster.Member; +import com.alibaba.nacos.core.cluster.NodeState; +import com.alibaba.nacos.core.cluster.ServerMemberManager; +import com.alibaba.nacos.core.model.request.LookupUpdateRequest; +import com.alibaba.nacos.sys.env.EnvUtil; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.mock.env.MockEnvironment; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * NacosClusterOperationTest. + * @author dongyafei + * @date 2022/8/15 + */ + +@RunWith(MockitoJUnitRunner.class) +public class NacosClusterOperationServiceTest { + + private NacosClusterOperationService nacosClusterOperationService; + + @Mock + private ServerMemberManager serverMemberManager; + + @Mock + private final MockEnvironment environment = new MockEnvironment(); + + @Before + public void setUp() throws Exception { + this.nacosClusterOperationService = new NacosClusterOperationService(serverMemberManager); + EnvUtil.setEnvironment(environment); + } + + @Test + public void testSelf() { + Member member = new Member(); + member.setIp("1.1.1.1"); + member.setPort(8848); + member.setState(NodeState.UP); + + when(serverMemberManager.getSelf()).thenReturn(member); + + Member result = nacosClusterOperationService.self(); + assertEquals("1.1.1.1:8848", result.getAddress()); + } + + @Test + public void testListNodes() throws NacosException { + Member member1 = new Member(); + member1.setIp("1.1.1.1"); + member1.setPort(8848); + member1.setState(NodeState.DOWN); + Member member2 = new Member(); + member2.setIp("2.2.2.2"); + member2.setPort(8848); + List members = Arrays.asList(member1, member2); + + when(serverMemberManager.allMembers()).thenReturn(members); + + Collection result1 = nacosClusterOperationService.listNodes("1.1.1.1", null); + assertTrue(result1.stream().findFirst().isPresent()); + assertEquals("1.1.1.1:8848", result1.stream().findFirst().get().getAddress()); + + Collection result2 = nacosClusterOperationService.listNodes(null, NodeState.UP); + assertTrue(result2.stream().findFirst().isPresent()); + assertEquals("2.2.2.2:8848", result2.stream().findFirst().get().getAddress()); + } + + @Test + public void testSelfHealth() { + Member member = new Member(); + member.setIp("1.1.1.1"); + member.setPort(8848); + member.setState(NodeState.UP); + + when(serverMemberManager.getSelf()).thenReturn(member); + + String health = nacosClusterOperationService.selfHealth(); + assertEquals(NodeState.UP.name(), health); + } + + @Test + public void testUpdateNodes() { + Member member1 = new Member(); + member1.setIp("1.1.1.1"); + member1.setAddress("test"); + member1.setPort(8848); + member1.setState(NodeState.DOWN); + Member member2 = new Member(); + member2.setIp("2.2.2.2"); + member2.setPort(8848); + List members = Arrays.asList(member1, member2); + + when(serverMemberManager.update(any())).thenReturn(true); + Boolean result = nacosClusterOperationService.updateNodes(members); + verify(serverMemberManager, times(1)).update(any()); + assertEquals(true, result); + } + + @Test + public void testUpdateLookup() throws NacosException { + LookupUpdateRequest lookupUpdateRequest = new LookupUpdateRequest(); + lookupUpdateRequest.setType("test"); + Boolean result = nacosClusterOperationService.updateLookup(lookupUpdateRequest); + verify(serverMemberManager).switchLookup("test"); + assertEquals(true, result); + } +}