blob: 6f410054945e06a7c029a73375aad21047915bb3 [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
18import org.apache.karaf.shell.commands.Argument;
19import org.apache.karaf.shell.commands.Command;
20import org.onosproject.cli.AbstractShellCommand;
21import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
22import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
Sean Condon96b896d2017-12-11 12:44:29 -080023import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaId2Octet;
24import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
25import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731;
26import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid;
27import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId;
28import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
Sean Condon0e89bda2017-03-21 14:23:19 +000029import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
30import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
31import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
32import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
33import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
34import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
35
36import java.util.Optional;
37
38/**
39 * Lists a particular Maintenance Domain.
40 */
41@Command(scope = "onos", name = "cfm-md-list",
42 description = "Lists a single CFM Maintenance Domain or all if none specified.")
43public class CfmMdListMdCommand extends AbstractShellCommand {
44 @Argument(index = 0, name = "name",
45 description = "Maintenance Domain name and type (in brackets)",
46 required = false, multiValued = false)
47 String name = null;
48
49 @Override
50 protected void execute() {
51 CfmMdService service = get(CfmMdService.class);
52
53 if (name != null) {
Sean Condon96b896d2017-12-11 12:44:29 -080054 MdId mdId = parseMdName(name);
Sean Condon0e89bda2017-03-21 14:23:19 +000055 print("Maintenance Domain:");
56 Optional<MaintenanceDomain> md = service.getMaintenanceDomain(mdId);
57 print(printMd(md));
58 md.get().maintenanceAssociationList().forEach(ma -> printMa(Optional.of(ma)));
59 } else {
60 service.getAllMaintenanceDomain().forEach(md -> {
61 print(printMd(Optional.of(md)));
62 });
63 }
64 }
65
66 public static String printMd(Optional<MaintenanceDomain> md) {
67 if (!md.isPresent()) {
68 return new String("MD not found");
69 } else {
70 StringBuffer sb = new StringBuffer("\tMD: ");
71 sb.append(md.get().mdId().mdName());
72 sb.append("(" + md.get().mdId().nameType());
73 sb.append(") Lvl:" + md.get().mdLevel().ordinal());
74 sb.append(", Num: " + md.get().mdNumericId());
75
76 md.get().maintenanceAssociationList().
77 forEach(ma -> sb.append(printMa(Optional.of(ma))));
78 return sb.toString();
79 }
80 }
81
82 public static String printMa(Optional<MaintenanceAssociation> ma) {
83 if (!ma.isPresent()) {
84 return "\n\tNo MA found";
85 }
86
87 StringBuilder sb = new StringBuilder("\n\t\tMA: ");
88 sb.append(ma.get().maId().maName());
89 sb.append("(");
90 sb.append(ma.get().maId().nameType());
91 sb.append(") CCM: ");
92 sb.append(ma.get().ccmInterval());
93 sb.append(" Num: ");
94 sb.append(ma.get().maNumericId());
95
96 ma.get().remoteMepIdList().forEach(rmep -> {
97 sb.append("\n\t\t\tRmep: ");
98 sb.append(rmep);
99 });
100 ma.get().componentList().forEach(comp -> {
101 sb.append("\n\t\t\tComponent: ");
102 sb.append(comp.componentId());
103 sb.append(" Perm: ");
104 sb.append(comp.idPermission());
105 sb.append(" MHF: ");
106 sb.append(comp.mhfCreationType());
107 sb.append(" Tag: ");
108 sb.append(comp.tagType());
109
110 comp.vidList().forEach(vid -> {
111 sb.append("\n\t\t\t\tVID: ");
112 sb.append(vid);
113 });
114 });
115
116 return sb.toString();
117 }
Sean Condon96b896d2017-12-11 12:44:29 -0800118
119 public static MdId parseMdName(String mdStr) {
120 String[] nameParts = mdStr.split("[()]");
121 if (nameParts.length != 2) {
122 throw new IllegalArgumentException("Invalid name format. " +
123 "Must be in the format of <identifier(name-type)>");
124 }
125
126 MdId mdId = null;
127 MdId.MdNameType nameTypeEnum = MdId.MdNameType.valueOf(nameParts[1]);
128 switch (nameTypeEnum) {
129 case DOMAINNAME:
130 mdId = MdIdDomainName.asMdId(nameParts[0]);
131 break;
132 case MACANDUINT:
133 mdId = MdIdMacUint.asMdId(nameParts[0]);
134 break;
135 case NONE:
136 mdId = MdIdNone.asMdId();
137 break;
138 case CHARACTERSTRING:
139 default:
140 mdId = MdIdCharStr.asMdId(nameParts[0]);
141 }
142 return mdId;
143 }
144
145 public static MaIdShort parseMaName(String maStr) {
146 String[] nameParts = maStr.split("[()]");
147 if (nameParts.length != 2) {
148 throw new IllegalArgumentException("Invalid name format. " +
149 "Must be in the format of <identifier(name-type)>");
150 }
151
152 MaIdShort maId = null;
153 MaIdShort.MaIdType nameTypeEnum = MaIdShort.MaIdType.valueOf(nameParts[1]);
154 switch (nameTypeEnum) {
155 case ICCY1731:
156 maId = MaIdIccY1731.asMaId(nameParts[0]);
157 break;
158 case PRIMARYVID:
159 maId = MaIdPrimaryVid.asMaId(nameParts[0]);
160 break;
161 case RFC2685VPNID:
162 maId = MaIdRfc2685VpnId.asMaIdHex(nameParts[0]);
163 break;
164 case TWOOCTET:
165 maId = MaId2Octet.asMaId(nameParts[0]);
Ray Milkeyd6a67c32018-02-02 10:30:35 -0800166 break;
Sean Condon96b896d2017-12-11 12:44:29 -0800167 case CHARACTERSTRING:
168 default:
169 maId = MaIdCharStr.asMaId(nameParts[0]);
170 }
171 return maId;
172 }
173
Sean Condon0e89bda2017-03-21 14:23:19 +0000174}