blob: 09bd80705fa7d9dab3f1c2cb7c2197695fa3be38 [file] [log] [blame]
Sean Condon0e89bda2017-03-21 14:23:19 +00001/*
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 */
16package org.onosproject.cfm.cli;
17
Ray Milkey86ad7bb2018-09-27 12:32:28 -070018import org.apache.karaf.shell.api.action.Argument;
19import org.apache.karaf.shell.api.action.Command;
Ray Milkey7a2dee52018-09-28 10:58:28 -070020import org.apache.karaf.shell.api.action.lifecycle.Service;
Sean Condon0e89bda2017-03-21 14:23:19 +000021import org.onosproject.cli.AbstractShellCommand;
22import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
23import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
Sean Condon96b896d2017-12-11 12:44:29 -080024import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
Sean Condon0e89bda2017-03-21 14:23:19 +000025import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
Sean Condon3a1efef2018-02-24 13:16:03 +000026import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdMaNameUtil;
Sean Condon0e89bda2017-03-21 14:23:19 +000027import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
28
Sean Condon0e89bda2017-03-21 14:23:19 +000029/**
30 * Lists a particular Maintenance Domain.
31 */
Ray Milkey7a2dee52018-09-28 10:58:28 -070032@Service
Sean Condon0e89bda2017-03-21 14:23:19 +000033@Command(scope = "onos", name = "cfm-md-list",
34 description = "Lists a single CFM Maintenance Domain or all if none specified.")
35public class CfmMdListMdCommand extends AbstractShellCommand {
Sean Condon3a1efef2018-02-24 13:16:03 +000036 @Argument(name = "name",
37 description = "Maintenance Domain name and type (in brackets)")
38 private String name = null;
Sean Condon0e89bda2017-03-21 14:23:19 +000039
40 @Override
Ray Milkey86ad7bb2018-09-27 12:32:28 -070041 protected void doExecute() {
Sean Condon3a1efef2018-02-24 13:16:03 +000042 CfmMdService service;
43 service = get(CfmMdService.class);
Sean Condon0e89bda2017-03-21 14:23:19 +000044
45 if (name != null) {
Sean Condon96b896d2017-12-11 12:44:29 -080046 MdId mdId = parseMdName(name);
Sean Condon0e89bda2017-03-21 14:23:19 +000047 print("Maintenance Domain:");
Sean Condon3a1efef2018-02-24 13:16:03 +000048 service.getMaintenanceDomain(mdId).ifPresent(md -> {
49 print(printMd(md));
50 md.maintenanceAssociationList().forEach(CfmMdListMdCommand::printMa);
Sean Condon0e89bda2017-03-21 14:23:19 +000051 });
Sean Condon3a1efef2018-02-24 13:16:03 +000052 } else {
53 service.getAllMaintenanceDomain().forEach(md -> print(printMd(md)));
Sean Condon0e89bda2017-03-21 14:23:19 +000054 }
55 }
56
Sean Condon3a1efef2018-02-24 13:16:03 +000057 private static String printMd(MaintenanceDomain md) {
58 if (md == null) {
59 return "MD not found";
Sean Condon0e89bda2017-03-21 14:23:19 +000060 } else {
Sean Condon3a1efef2018-02-24 13:16:03 +000061 StringBuilder sb = new StringBuilder("\tMD: ");
62 sb.append(md.mdId().mdName());
63 sb.append("(");
64 sb.append(md.mdId().nameType());
65 sb.append(") Lvl:");
66 sb.append(md.mdLevel().ordinal());
67 sb.append(", Num: ");
68 sb.append(md.mdNumericId());
Sean Condon0e89bda2017-03-21 14:23:19 +000069
Sean Condon3a1efef2018-02-24 13:16:03 +000070 md.maintenanceAssociationList().
71 forEach(ma -> sb.append(printMa(ma)));
Sean Condon0e89bda2017-03-21 14:23:19 +000072 return sb.toString();
73 }
74 }
75
Sean Condon3a1efef2018-02-24 13:16:03 +000076 private static String printMa(MaintenanceAssociation ma) {
77 if (ma == null) {
Sean Condon0e89bda2017-03-21 14:23:19 +000078 return "\n\tNo MA found";
79 }
80
81 StringBuilder sb = new StringBuilder("\n\t\tMA: ");
Sean Condon3a1efef2018-02-24 13:16:03 +000082 sb.append(ma.maId().maName());
Sean Condon0e89bda2017-03-21 14:23:19 +000083 sb.append("(");
Sean Condon3a1efef2018-02-24 13:16:03 +000084 sb.append(ma.maId().nameType());
Sean Condon0e89bda2017-03-21 14:23:19 +000085 sb.append(") CCM: ");
Sean Condon3a1efef2018-02-24 13:16:03 +000086 sb.append(ma.ccmInterval());
Sean Condon0e89bda2017-03-21 14:23:19 +000087 sb.append(" Num: ");
Sean Condon3a1efef2018-02-24 13:16:03 +000088 sb.append(ma.maNumericId());
Sean Condon0e89bda2017-03-21 14:23:19 +000089
Sean Condon3a1efef2018-02-24 13:16:03 +000090 ma.remoteMepIdList().forEach(rmep -> {
Sean Condon0e89bda2017-03-21 14:23:19 +000091 sb.append("\n\t\t\tRmep: ");
92 sb.append(rmep);
93 });
Sean Condon3a1efef2018-02-24 13:16:03 +000094 ma.componentList().forEach(comp -> {
Sean Condon0e89bda2017-03-21 14:23:19 +000095 sb.append("\n\t\t\tComponent: ");
96 sb.append(comp.componentId());
97 sb.append(" Perm: ");
98 sb.append(comp.idPermission());
99 sb.append(" MHF: ");
100 sb.append(comp.mhfCreationType());
101 sb.append(" Tag: ");
102 sb.append(comp.tagType());
103
104 comp.vidList().forEach(vid -> {
105 sb.append("\n\t\t\t\tVID: ");
106 sb.append(vid);
107 });
108 });
109
110 return sb.toString();
111 }
Sean Condon96b896d2017-12-11 12:44:29 -0800112
Sean Condon3a1efef2018-02-24 13:16:03 +0000113 static MdId parseMdName(String mdStr) {
Sean Condon96b896d2017-12-11 12:44:29 -0800114 String[] nameParts = mdStr.split("[()]");
115 if (nameParts.length != 2) {
116 throw new IllegalArgumentException("Invalid name format. " +
117 "Must be in the format of <identifier(name-type)>");
118 }
119
Sean Condon3a1efef2018-02-24 13:16:03 +0000120 return MdMaNameUtil.parseMdName(nameParts[1], nameParts[0]);
Sean Condon96b896d2017-12-11 12:44:29 -0800121 }
122
Sean Condon3a1efef2018-02-24 13:16:03 +0000123 static MaIdShort parseMaName(String maStr) {
Sean Condon96b896d2017-12-11 12:44:29 -0800124 String[] nameParts = maStr.split("[()]");
125 if (nameParts.length != 2) {
126 throw new IllegalArgumentException("Invalid name format. " +
127 "Must be in the format of <identifier(name-type)>");
128 }
129
Sean Condon3a1efef2018-02-24 13:16:03 +0000130 return MdMaNameUtil.parseMaName(nameParts[1], nameParts[0]);
Sean Condon96b896d2017-12-11 12:44:29 -0800131 }
132
Sean Condon0e89bda2017-03-21 14:23:19 +0000133}