blob: ffb9aca22d051e24b76da9ac6034f1a77e46391a [file] [log] [blame]
slowr370d9082017-10-20 16:44:54 -07001/*
2 * Copyright 2017-present Open Networking Foundation
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
17package org.onosproject.cli;
18
19import com.fasterxml.jackson.databind.JsonNode;
20import com.fasterxml.jackson.databind.ObjectMapper;
21import com.fasterxml.jackson.databind.node.ArrayNode;
22import com.fasterxml.jackson.databind.node.ObjectNode;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070023import org.apache.karaf.shell.api.action.Command;
24import org.apache.karaf.shell.api.action.lifecycle.Service;
slowr370d9082017-10-20 16:44:54 -070025import org.onosproject.cluster.ClusterAdminService;
26import org.onosproject.cluster.ControllerNode;
27import org.onosproject.cluster.Member;
28import org.onosproject.cluster.MembershipService;
29
30import java.util.List;
31import java.util.Optional;
32
33import static com.google.common.collect.Lists.newArrayList;
34import static org.onosproject.utils.Comparators.MEMBERSHIP_COMPARATOR;
35
36/**
37 * Command to list the memberships in the system.
38 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070039@Service
slowr370d9082017-10-20 16:44:54 -070040@Command(scope = "onos", name = "memberships",
41 description = "Lists information about memberships in the system")
42public class MembershipsListCommand extends AbstractShellCommand {
43
44 @Override
Ray Milkeyd84f89b2018-08-17 14:54:17 -070045 protected void doExecute() {
slowr370d9082017-10-20 16:44:54 -070046 MembershipService service = get(MembershipService.class);
47 ClusterAdminService clusterService = get(ClusterAdminService.class);
48
49 if (outputJson()) {
50 print("%s", json(service));
51 } else {
52 service.getGroups().forEach(group -> {
53 List<Member> members = newArrayList(group.members());
54 print("-------------------------------------------------------------------");
55 print("Version: %s, Members: %d", group.version(), members.size());
56 members.sort(MEMBERSHIP_COMPARATOR);
57 members.forEach(
58 member -> {
59 Optional<ControllerNode> controllerNode =
60 Optional.ofNullable(clusterService.getNode(member.nodeId()));
61
62 if (!controllerNode.isPresent()) {
63 print(" id=%s, version=%s, self=%s",
64 member.nodeId(),
65 member.version(),
66 member.equals(service.getLocalMember()) ? "*" : "");
67 } else {
68 ControllerNode node = controllerNode.get();
69 print(" id=%s, ip=%s, tcpPort=%s, state=%s, self=%s",
70 member.nodeId(),
71 node.ip(),
72 node.tcpPort(),
73 clusterService.getState(node.id()),
74 member.equals(service.getLocalMember()) ? "*" : "");
75 }
76 }
77 );
78 print("-------------------------------------------------------------------");
79 });
80 }
81 }
82
83 /**
84 * Produces JSON structure.
85 *
86 * @param service membership service
87 * @return json structure
88 */
89 private JsonNode json(MembershipService service) {
90 ObjectMapper mapper = new ObjectMapper();
91 ArrayNode result = mapper.createArrayNode();
92
93 service.getGroups().forEach(group -> {
94 ObjectNode groupNode = mapper.createObjectNode();
95
96 ArrayNode membersNode = mapper.createArrayNode();
97 groupNode.put("version", group.version().toString());
98 groupNode.put("members", membersNode);
99
100 group.members().forEach(member -> membersNode.add(member.nodeId().toString()));
101
102 result.add(groupNode);
103 });
104
105 return result;
106 }
107}