blob: f1a5c427fcee644d9d16129c4730ba72959d6900 [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;
23import org.apache.karaf.shell.commands.Command;
24import org.onosproject.cluster.ClusterAdminService;
25import org.onosproject.cluster.ControllerNode;
26import org.onosproject.cluster.Member;
27import org.onosproject.cluster.MembershipService;
28
29import java.util.List;
30import java.util.Optional;
31
32import static com.google.common.collect.Lists.newArrayList;
33import static org.onosproject.utils.Comparators.MEMBERSHIP_COMPARATOR;
34
35/**
36 * Command to list the memberships in the system.
37 */
38@Command(scope = "onos", name = "memberships",
39 description = "Lists information about memberships in the system")
40public class MembershipsListCommand extends AbstractShellCommand {
41
42 @Override
43 protected void execute() {
44 MembershipService service = get(MembershipService.class);
45 ClusterAdminService clusterService = get(ClusterAdminService.class);
46
47 if (outputJson()) {
48 print("%s", json(service));
49 } else {
50 service.getGroups().forEach(group -> {
51 List<Member> members = newArrayList(group.members());
52 print("-------------------------------------------------------------------");
53 print("Version: %s, Members: %d", group.version(), members.size());
54 members.sort(MEMBERSHIP_COMPARATOR);
55 members.forEach(
56 member -> {
57 Optional<ControllerNode> controllerNode =
58 Optional.ofNullable(clusterService.getNode(member.nodeId()));
59
60 if (!controllerNode.isPresent()) {
61 print(" id=%s, version=%s, self=%s",
62 member.nodeId(),
63 member.version(),
64 member.equals(service.getLocalMember()) ? "*" : "");
65 } else {
66 ControllerNode node = controllerNode.get();
67 print(" id=%s, ip=%s, tcpPort=%s, state=%s, self=%s",
68 member.nodeId(),
69 node.ip(),
70 node.tcpPort(),
71 clusterService.getState(node.id()),
72 member.equals(service.getLocalMember()) ? "*" : "");
73 }
74 }
75 );
76 print("-------------------------------------------------------------------");
77 });
78 }
79 }
80
81 /**
82 * Produces JSON structure.
83 *
84 * @param service membership service
85 * @return json structure
86 */
87 private JsonNode json(MembershipService service) {
88 ObjectMapper mapper = new ObjectMapper();
89 ArrayNode result = mapper.createArrayNode();
90
91 service.getGroups().forEach(group -> {
92 ObjectNode groupNode = mapper.createObjectNode();
93
94 ArrayNode membersNode = mapper.createArrayNode();
95 groupNode.put("version", group.version().toString());
96 groupNode.put("members", membersNode);
97
98 group.members().forEach(member -> membersNode.add(member.nodeId().toString()));
99
100 result.add(groupNode);
101 });
102
103 return result;
104 }
105}