blob: be97f280c846cb59ed5e1ae0285d0c9b3f8c24d6 [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 Milkeyc2b7b962018-10-02 15:00:02 -070020import org.apache.karaf.shell.api.action.Completion;
Ray Milkey7a2dee52018-09-28 10:58:28 -070021import org.apache.karaf.shell.api.action.lifecycle.Service;
Ray Milkeyc2b7b962018-10-02 15:00:02 -070022import org.onosproject.cfm.cli.completer.CfmMdNameCompleter;
Sean Condon0e89bda2017-03-21 14:23:19 +000023import org.onosproject.cli.AbstractShellCommand;
24import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
25import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
Sean Condon96b896d2017-12-11 12:44:29 -080026import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
Sean Condon0e89bda2017-03-21 14:23:19 +000027import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
Sean Condon3a1efef2018-02-24 13:16:03 +000028import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdMaNameUtil;
Sean Condon0e89bda2017-03-21 14:23:19 +000029import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
30
Sean Condon0e89bda2017-03-21 14:23:19 +000031/**
32 * Lists a particular Maintenance Domain.
33 */
Ray Milkey7a2dee52018-09-28 10:58:28 -070034@Service
Sean Condon0e89bda2017-03-21 14:23:19 +000035@Command(scope = "onos", name = "cfm-md-list",
36 description = "Lists a single CFM Maintenance Domain or all if none specified.")
37public class CfmMdListMdCommand extends AbstractShellCommand {
Sean Condon3a1efef2018-02-24 13:16:03 +000038 @Argument(name = "name",
39 description = "Maintenance Domain name and type (in brackets)")
Ray Milkeyc2b7b962018-10-02 15:00:02 -070040 @Completion(CfmMdNameCompleter.class)
Sean Condon3a1efef2018-02-24 13:16:03 +000041 private String name = null;
Sean Condon0e89bda2017-03-21 14:23:19 +000042
43 @Override
Ray Milkey86ad7bb2018-09-27 12:32:28 -070044 protected void doExecute() {
Sean Condon3a1efef2018-02-24 13:16:03 +000045 CfmMdService service;
46 service = get(CfmMdService.class);
Sean Condon0e89bda2017-03-21 14:23:19 +000047
48 if (name != null) {
Sean Condon96b896d2017-12-11 12:44:29 -080049 MdId mdId = parseMdName(name);
Sean Condon0e89bda2017-03-21 14:23:19 +000050 print("Maintenance Domain:");
Sean Condon3a1efef2018-02-24 13:16:03 +000051 service.getMaintenanceDomain(mdId).ifPresent(md -> {
52 print(printMd(md));
53 md.maintenanceAssociationList().forEach(CfmMdListMdCommand::printMa);
Sean Condon0e89bda2017-03-21 14:23:19 +000054 });
Sean Condon3a1efef2018-02-24 13:16:03 +000055 } else {
56 service.getAllMaintenanceDomain().forEach(md -> print(printMd(md)));
Sean Condon0e89bda2017-03-21 14:23:19 +000057 }
58 }
59
Sean Condon3a1efef2018-02-24 13:16:03 +000060 private static String printMd(MaintenanceDomain md) {
61 if (md == null) {
62 return "MD not found";
Sean Condon0e89bda2017-03-21 14:23:19 +000063 } else {
Sean Condon3a1efef2018-02-24 13:16:03 +000064 StringBuilder sb = new StringBuilder("\tMD: ");
65 sb.append(md.mdId().mdName());
66 sb.append("(");
67 sb.append(md.mdId().nameType());
68 sb.append(") Lvl:");
69 sb.append(md.mdLevel().ordinal());
70 sb.append(", Num: ");
71 sb.append(md.mdNumericId());
Sean Condon0e89bda2017-03-21 14:23:19 +000072
Sean Condon3a1efef2018-02-24 13:16:03 +000073 md.maintenanceAssociationList().
74 forEach(ma -> sb.append(printMa(ma)));
Sean Condon0e89bda2017-03-21 14:23:19 +000075 return sb.toString();
76 }
77 }
78
Sean Condon3a1efef2018-02-24 13:16:03 +000079 private static String printMa(MaintenanceAssociation ma) {
80 if (ma == null) {
Sean Condon0e89bda2017-03-21 14:23:19 +000081 return "\n\tNo MA found";
82 }
83
84 StringBuilder sb = new StringBuilder("\n\t\tMA: ");
Sean Condon3a1efef2018-02-24 13:16:03 +000085 sb.append(ma.maId().maName());
Sean Condon0e89bda2017-03-21 14:23:19 +000086 sb.append("(");
Sean Condon3a1efef2018-02-24 13:16:03 +000087 sb.append(ma.maId().nameType());
Sean Condon0e89bda2017-03-21 14:23:19 +000088 sb.append(") CCM: ");
Sean Condon3a1efef2018-02-24 13:16:03 +000089 sb.append(ma.ccmInterval());
Sean Condon0e89bda2017-03-21 14:23:19 +000090 sb.append(" Num: ");
Sean Condon3a1efef2018-02-24 13:16:03 +000091 sb.append(ma.maNumericId());
Sean Condon0e89bda2017-03-21 14:23:19 +000092
Sean Condon3a1efef2018-02-24 13:16:03 +000093 ma.remoteMepIdList().forEach(rmep -> {
Sean Condon0e89bda2017-03-21 14:23:19 +000094 sb.append("\n\t\t\tRmep: ");
95 sb.append(rmep);
96 });
Sean Condon3a1efef2018-02-24 13:16:03 +000097 ma.componentList().forEach(comp -> {
Sean Condon0e89bda2017-03-21 14:23:19 +000098 sb.append("\n\t\t\tComponent: ");
99 sb.append(comp.componentId());
100 sb.append(" Perm: ");
101 sb.append(comp.idPermission());
102 sb.append(" MHF: ");
103 sb.append(comp.mhfCreationType());
104 sb.append(" Tag: ");
105 sb.append(comp.tagType());
106
107 comp.vidList().forEach(vid -> {
108 sb.append("\n\t\t\t\tVID: ");
109 sb.append(vid);
110 });
111 });
112
113 return sb.toString();
114 }
Sean Condon96b896d2017-12-11 12:44:29 -0800115
Sean Condon3a1efef2018-02-24 13:16:03 +0000116 static MdId parseMdName(String mdStr) {
Sean Condon96b896d2017-12-11 12:44:29 -0800117 String[] nameParts = mdStr.split("[()]");
118 if (nameParts.length != 2) {
119 throw new IllegalArgumentException("Invalid name format. " +
120 "Must be in the format of <identifier(name-type)>");
121 }
122
Sean Condon3a1efef2018-02-24 13:16:03 +0000123 return MdMaNameUtil.parseMdName(nameParts[1], nameParts[0]);
Sean Condon96b896d2017-12-11 12:44:29 -0800124 }
125
Sean Condon3a1efef2018-02-24 13:16:03 +0000126 static MaIdShort parseMaName(String maStr) {
Sean Condon96b896d2017-12-11 12:44:29 -0800127 String[] nameParts = maStr.split("[()]");
128 if (nameParts.length != 2) {
129 throw new IllegalArgumentException("Invalid name format. " +
130 "Must be in the format of <identifier(name-type)>");
131 }
132
Sean Condon3a1efef2018-02-24 13:16:03 +0000133 return MdMaNameUtil.parseMaName(nameParts[1], nameParts[0]);
Sean Condon96b896d2017-12-11 12:44:29 -0800134 }
135
Sean Condon0e89bda2017-03-21 14:23:19 +0000136}