Sean Condon | 0e89bda | 2017-03-21 14:23:19 +0000 | [diff] [blame] | 1 | /* |
| 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 | package org.onosproject.cfm.cli; |
| 17 | |
| 18 | import org.apache.karaf.shell.commands.Argument; |
| 19 | import org.apache.karaf.shell.commands.Command; |
| 20 | import org.onosproject.cli.AbstractShellCommand; |
| 21 | import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation; |
| 22 | import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain; |
Sean Condon | 96b896d | 2017-12-11 12:44:29 -0800 | [diff] [blame] | 23 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaId2Octet; |
| 24 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr; |
| 25 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731; |
| 26 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid; |
| 27 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId; |
| 28 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort; |
Sean Condon | 0e89bda | 2017-03-21 14:23:19 +0000 | [diff] [blame] | 29 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId; |
| 30 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr; |
| 31 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName; |
| 32 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint; |
| 33 | import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone; |
| 34 | import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService; |
| 35 | |
| 36 | import 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.") |
| 43 | public 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 Condon | 96b896d | 2017-12-11 12:44:29 -0800 | [diff] [blame] | 54 | MdId mdId = parseMdName(name); |
Sean Condon | 0e89bda | 2017-03-21 14:23:19 +0000 | [diff] [blame] | 55 | 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 Condon | 96b896d | 2017-12-11 12:44:29 -0800 | [diff] [blame] | 118 | |
| 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 Milkey | d6a67c3 | 2018-02-02 10:30:35 -0800 | [diff] [blame] | 166 | break; |
Sean Condon | 96b896d | 2017-12-11 12:44:29 -0800 | [diff] [blame] | 167 | case CHARACTERSTRING: |
| 168 | default: |
| 169 | maId = MaIdCharStr.asMaId(nameParts[0]); |
| 170 | } |
| 171 | return maId; |
| 172 | } |
| 173 | |
Sean Condon | 0e89bda | 2017-03-21 14:23:19 +0000 | [diff] [blame] | 174 | } |