Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 1 | /* |
Brian O'Connor | a09fe5b | 2017-08-03 21:12:30 -0700 | [diff] [blame] | 2 | * Copyright 2015-present Open Networking Foundation |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 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 | */ |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 16 | package org.onosproject.codec.impl; |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 17 | |
Jian Li | 7231515 | 2015-12-10 17:20:43 -0800 | [diff] [blame] | 18 | import com.codahale.metrics.Metric; |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 19 | import com.google.common.collect.ImmutableSet; |
DScano | 55a0103 | 2020-04-09 20:01:50 +0200 | [diff] [blame] | 20 | import org.onosproject.net.intf.Interface; |
Ray Milkey | d84f89b | 2018-08-17 14:54:17 -0700 | [diff] [blame] | 21 | import org.osgi.service.component.annotations.Activate; |
| 22 | import org.osgi.service.component.annotations.Component; |
| 23 | import org.osgi.service.component.annotations.Deactivate; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 24 | import org.onlab.packet.Ethernet; |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 25 | import org.onosproject.cluster.ControllerNode; |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 26 | import org.onosproject.cluster.RoleInfo; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 27 | import org.onosproject.codec.CodecService; |
| 28 | import org.onosproject.codec.JsonCodec; |
Thomas Vachuska | 02aeb03 | 2015-01-06 22:36:30 -0800 | [diff] [blame] | 29 | import org.onosproject.core.Application; |
Jian Li | e1c1c8d | 2016-05-09 16:24:40 -0700 | [diff] [blame] | 30 | import org.onosproject.core.ApplicationId; |
Thomas Vachuska | 52f2cd1 | 2018-11-08 21:20:04 -0800 | [diff] [blame] | 31 | import org.onosproject.net.TenantId; |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 32 | import org.onosproject.mastership.MastershipTerm; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 33 | import org.onosproject.net.Annotations; |
| 34 | import org.onosproject.net.ConnectPoint; |
| 35 | import org.onosproject.net.Device; |
Jonathan Hart | 8338b8d | 2017-08-15 15:46:14 -0700 | [diff] [blame] | 36 | import org.onosproject.net.DisjointPath; |
| 37 | import org.onosproject.net.FilteredConnectPoint; |
Ray Milkey | 1f95bd3 | 2014-12-10 11:11:00 -0800 | [diff] [blame] | 38 | import org.onosproject.net.Host; |
| 39 | import org.onosproject.net.HostLocation; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 40 | import org.onosproject.net.Link; |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 41 | import org.onosproject.net.MastershipRole; |
Ray Milkey | 19ffea3 | 2015-01-28 10:03:06 -0800 | [diff] [blame] | 42 | import org.onosproject.net.Path; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 43 | import org.onosproject.net.Port; |
Yuta HIGUCHI | a255bb4 | 2016-11-03 16:04:08 -0700 | [diff] [blame] | 44 | import org.onosproject.net.behaviour.protection.TransportEndpointDescription; |
Jian Li | ecb3c0f | 2015-12-15 10:07:49 -0800 | [diff] [blame] | 45 | import org.onosproject.net.device.PortStatistics; |
Ray Milkey | 39616f3 | 2015-05-14 15:43:00 -0700 | [diff] [blame] | 46 | import org.onosproject.net.driver.Driver; |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 47 | import org.onosproject.net.flow.FlowEntry; |
Ray Milkey | d43fe45 | 2015-05-29 09:35:12 -0700 | [diff] [blame] | 48 | import org.onosproject.net.flow.FlowRule; |
Srikanth Vavilapalli | 95810f5 | 2015-09-14 15:49:56 -0700 | [diff] [blame] | 49 | import org.onosproject.net.flow.TableStatisticsEntry; |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 50 | import org.onosproject.net.flow.TrafficSelector; |
| 51 | import org.onosproject.net.flow.TrafficTreatment; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 52 | import org.onosproject.net.flow.criteria.Criterion; |
| 53 | import org.onosproject.net.flow.instructions.Instruction; |
Jian Li | 8bcef8b | 2016-01-06 11:35:53 -0800 | [diff] [blame] | 54 | import org.onosproject.net.flowobjective.FilteringObjective; |
| 55 | import org.onosproject.net.flowobjective.ForwardingObjective; |
| 56 | import org.onosproject.net.flowobjective.NextObjective; |
Ray Milkey | 39616f3 | 2015-05-14 15:43:00 -0700 | [diff] [blame] | 57 | import org.onosproject.net.group.Group; |
| 58 | import org.onosproject.net.group.GroupBucket; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 59 | import org.onosproject.net.intent.ConnectivityIntent; |
Ray Milkey | b9a8a18 | 2015-01-20 14:15:35 -0800 | [diff] [blame] | 60 | import org.onosproject.net.intent.Constraint; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 61 | import org.onosproject.net.intent.HostToHostIntent; |
Ray Milkey | 2b21714 | 2014-12-15 09:24:24 -0800 | [diff] [blame] | 62 | import org.onosproject.net.intent.Intent; |
Carmelo Cascone | 87892e2 | 2017-11-13 16:01:29 -0800 | [diff] [blame] | 63 | import org.onosproject.net.intent.MultiPointToSinglePointIntent; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 64 | import org.onosproject.net.intent.PointToPointIntent; |
Chiara Contoli | a8f69ff | 2016-07-28 01:06:07 +0900 | [diff] [blame] | 65 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; |
dvaddire | 95c84ed | 2017-06-14 15:42:24 +0530 | [diff] [blame] | 66 | import org.onosproject.net.intent.util.IntentMiniSummary; |
Brian Stanke | b9170d9 | 2016-02-19 14:18:42 -0500 | [diff] [blame] | 67 | import org.onosproject.net.key.DeviceKey; |
Jonathan Hart | 07eb041 | 2016-02-08 16:42:29 -0800 | [diff] [blame] | 68 | import org.onosproject.net.mcast.McastRoute; |
Jian Li | 5c41123 | 2015-12-16 15:29:16 -0800 | [diff] [blame] | 69 | import org.onosproject.net.meter.Band; |
| 70 | import org.onosproject.net.meter.Meter; |
Jian Li | 9567896 | 2016-01-26 17:17:52 -0800 | [diff] [blame] | 71 | import org.onosproject.net.meter.MeterRequest; |
Claudine Chiu | 1f036b8 | 2017-03-09 16:45:56 -0500 | [diff] [blame] | 72 | import org.onosproject.net.packet.PacketRequest; |
Yi Tseng | a87b40c | 2017-09-10 00:59:03 -0700 | [diff] [blame] | 73 | import org.onosproject.net.pi.model.PiActionModel; |
| 74 | import org.onosproject.net.pi.model.PiActionParamModel; |
Carmelo Cascone | 87892e2 | 2017-11-13 16:01:29 -0800 | [diff] [blame] | 75 | import org.onosproject.net.pi.model.PiMatchFieldModel; |
Yi Tseng | a87b40c | 2017-09-10 00:59:03 -0700 | [diff] [blame] | 76 | import org.onosproject.net.pi.model.PiPipeconf; |
| 77 | import org.onosproject.net.pi.model.PiPipelineModel; |
Yi Tseng | a87b40c | 2017-09-10 00:59:03 -0700 | [diff] [blame] | 78 | import org.onosproject.net.pi.model.PiTableModel; |
Jian Li | b68b9a8 | 2016-02-23 10:25:54 +0900 | [diff] [blame] | 79 | import org.onosproject.net.region.Region; |
Ray Milkey | b9af946 | 2015-07-17 11:12:09 -0700 | [diff] [blame] | 80 | import org.onosproject.net.statistic.Load; |
Ray Milkey | 82e5031 | 2015-01-22 17:01:42 -0800 | [diff] [blame] | 81 | import org.onosproject.net.topology.Topology; |
| 82 | import org.onosproject.net.topology.TopologyCluster; |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 83 | import org.slf4j.Logger; |
| 84 | import org.slf4j.LoggerFactory; |
| 85 | |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 86 | import java.util.Map; |
| 87 | import java.util.Set; |
| 88 | import java.util.concurrent.ConcurrentHashMap; |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 89 | |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 90 | import static org.onosproject.security.AppGuard.checkPermission; |
Jonathan Hart | 8338b8d | 2017-08-15 15:46:14 -0700 | [diff] [blame] | 91 | import static org.onosproject.security.AppPermission.Type.CODEC_READ; |
| 92 | import static org.onosproject.security.AppPermission.Type.CODEC_WRITE; |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 93 | |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 94 | /** |
| 95 | * Implementation of the JSON codec brokering service. |
| 96 | */ |
Ray Milkey | d84f89b | 2018-08-17 14:54:17 -0700 | [diff] [blame] | 97 | @Component(immediate = true, service = CodecService.class) |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 98 | public class CodecManager implements CodecService { |
| 99 | |
| 100 | private static Logger log = LoggerFactory.getLogger(CodecManager.class); |
| 101 | |
| 102 | private final Map<Class<?>, JsonCodec> codecs = new ConcurrentHashMap<>(); |
| 103 | |
| 104 | @Activate |
| 105 | public void activate() { |
| 106 | codecs.clear(); |
Thomas Vachuska | 02aeb03 | 2015-01-06 22:36:30 -0800 | [diff] [blame] | 107 | registerCodec(Application.class, new ApplicationCodec()); |
Jian Li | e1c1c8d | 2016-05-09 16:24:40 -0700 | [diff] [blame] | 108 | registerCodec(ApplicationId.class, new ApplicationIdCodec()); |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 109 | registerCodec(ControllerNode.class, new ControllerNodeCodec()); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 110 | registerCodec(Annotations.class, new AnnotationsCodec()); |
| 111 | registerCodec(Device.class, new DeviceCodec()); |
| 112 | registerCodec(Port.class, new PortCodec()); |
| 113 | registerCodec(ConnectPoint.class, new ConnectPointCodec()); |
| 114 | registerCodec(Link.class, new LinkCodec()); |
Ray Milkey | 1f95bd3 | 2014-12-10 11:11:00 -0800 | [diff] [blame] | 115 | registerCodec(Host.class, new HostCodec()); |
| 116 | registerCodec(HostLocation.class, new HostLocationCodec()); |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 117 | registerCodec(HostToHostIntent.class, new HostToHostIntentCodec()); |
dvaddire | 95c84ed | 2017-06-14 15:42:24 +0530 | [diff] [blame] | 118 | registerCodec(IntentMiniSummary.class, new IntentMiniSummaryCodec()); |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 119 | registerCodec(PointToPointIntent.class, new PointToPointIntentCodec()); |
Chiara Contoli | a8f69ff | 2016-07-28 01:06:07 +0900 | [diff] [blame] | 120 | registerCodec(SinglePointToMultiPointIntent.class, new SinglePointToMultiPointIntentCodec()); |
nassima toumi | 9576131 | 2017-05-23 14:00:33 +0300 | [diff] [blame] | 121 | registerCodec(MultiPointToSinglePointIntent.class, new MultiPointToSinglePointIntentCodec()); |
Ray Milkey | 2b21714 | 2014-12-15 09:24:24 -0800 | [diff] [blame] | 122 | registerCodec(Intent.class, new IntentCodec()); |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 123 | registerCodec(ConnectivityIntent.class, new ConnectivityIntentCodec()); |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 124 | registerCodec(FlowEntry.class, new FlowEntryCodec()); |
Ray Milkey | d43fe45 | 2015-05-29 09:35:12 -0700 | [diff] [blame] | 125 | registerCodec(FlowRule.class, new FlowRuleCodec()); |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 126 | registerCodec(TrafficTreatment.class, new TrafficTreatmentCodec()); |
| 127 | registerCodec(TrafficSelector.class, new TrafficSelectorCodec()); |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 128 | registerCodec(Instruction.class, new InstructionCodec()); |
| 129 | registerCodec(Criterion.class, new CriterionCodec()); |
| 130 | registerCodec(Ethernet.class, new EthernetCodec()); |
Ray Milkey | b9a8a18 | 2015-01-20 14:15:35 -0800 | [diff] [blame] | 131 | registerCodec(Constraint.class, new ConstraintCodec()); |
Ray Milkey | 82e5031 | 2015-01-22 17:01:42 -0800 | [diff] [blame] | 132 | registerCodec(Topology.class, new TopologyCodec()); |
| 133 | registerCodec(TopologyCluster.class, new TopologyClusterCodec()); |
Ray Milkey | 19ffea3 | 2015-01-28 10:03:06 -0800 | [diff] [blame] | 134 | registerCodec(Path.class, new PathCodec()); |
Jayasree Ghosh | d3ff540 | 2016-08-17 18:41:19 +0530 | [diff] [blame] | 135 | registerCodec(DisjointPath.class, new DisjointPathCodec()); |
Ray Milkey | 39616f3 | 2015-05-14 15:43:00 -0700 | [diff] [blame] | 136 | registerCodec(Group.class, new GroupCodec()); |
| 137 | registerCodec(Driver.class, new DriverCodec()); |
| 138 | registerCodec(GroupBucket.class, new GroupBucketCodec()); |
Ray Milkey | b9af946 | 2015-07-17 11:12:09 -0700 | [diff] [blame] | 139 | registerCodec(Load.class, new LoadCodec()); |
Jian Li | 9567896 | 2016-01-26 17:17:52 -0800 | [diff] [blame] | 140 | registerCodec(MeterRequest.class, new MeterRequestCodec()); |
Jian Li | 5c41123 | 2015-12-16 15:29:16 -0800 | [diff] [blame] | 141 | registerCodec(Meter.class, new MeterCodec()); |
| 142 | registerCodec(Band.class, new MeterBandCodec()); |
Srikanth Vavilapalli | 95810f5 | 2015-09-14 15:49:56 -0700 | [diff] [blame] | 143 | registerCodec(TableStatisticsEntry.class, new TableStatisticsEntryCodec()); |
Srikanth Vavilapalli | d120f5c | 2015-11-24 14:15:01 -0800 | [diff] [blame] | 144 | registerCodec(PortStatistics.class, new PortStatisticsCodec()); |
Jian Li | 7231515 | 2015-12-10 17:20:43 -0800 | [diff] [blame] | 145 | registerCodec(Metric.class, new MetricCodec()); |
Jian Li | 8bcef8b | 2016-01-06 11:35:53 -0800 | [diff] [blame] | 146 | registerCodec(FilteringObjective.class, new FilteringObjectiveCodec()); |
| 147 | registerCodec(ForwardingObjective.class, new ForwardingObjectiveCodec()); |
| 148 | registerCodec(NextObjective.class, new NextObjectiveCodec()); |
Jonathan Hart | 07eb041 | 2016-02-08 16:42:29 -0800 | [diff] [blame] | 149 | registerCodec(McastRoute.class, new McastRouteCodec()); |
Brian Stanke | b9170d9 | 2016-02-19 14:18:42 -0500 | [diff] [blame] | 150 | registerCodec(DeviceKey.class, new DeviceKeyCodec()); |
Jian Li | b68b9a8 | 2016-02-23 10:25:54 +0900 | [diff] [blame] | 151 | registerCodec(Region.class, new RegionCodec()); |
Claudine Chiu | fb8b816 | 2016-04-01 23:50:51 +0000 | [diff] [blame] | 152 | registerCodec(TenantId.class, new TenantIdCodec()); |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 153 | registerCodec(MastershipTerm.class, new MastershipTermCodec()); |
| 154 | registerCodec(MastershipRole.class, new MastershipRoleCodec()); |
| 155 | registerCodec(RoleInfo.class, new RoleInfoCodec()); |
Yuta HIGUCHI | 776f074 | 2016-11-03 15:51:14 -0700 | [diff] [blame] | 156 | registerCodec(FilteredConnectPoint.class, new FilteredConnectPointCodec()); |
Yuta HIGUCHI | a255bb4 | 2016-11-03 16:04:08 -0700 | [diff] [blame] | 157 | registerCodec(TransportEndpointDescription.class, new TransportEndpointDescriptionCodec()); |
Claudine Chiu | 1f036b8 | 2017-03-09 16:45:56 -0500 | [diff] [blame] | 158 | registerCodec(PacketRequest.class, new PacketRequestCodec()); |
Yi Tseng | a87b40c | 2017-09-10 00:59:03 -0700 | [diff] [blame] | 159 | registerCodec(PiActionModel.class, new PiActionModelCodec()); |
Yi Tseng | a87b40c | 2017-09-10 00:59:03 -0700 | [diff] [blame] | 160 | registerCodec(PiPipelineModel.class, new PiPipelineModelCodec()); |
| 161 | registerCodec(PiPipeconf.class, new PiPipeconfCodec()); |
| 162 | registerCodec(PiTableModel.class, new PiTableModelCodec()); |
Carmelo Cascone | 87892e2 | 2017-11-13 16:01:29 -0800 | [diff] [blame] | 163 | registerCodec(PiMatchFieldModel.class, new PiMatchFieldModelCodec()); |
Yi Tseng | a87b40c | 2017-09-10 00:59:03 -0700 | [diff] [blame] | 164 | registerCodec(PiActionParamModel.class, new PiActionParamModelCodec()); |
DScano | 55a0103 | 2020-04-09 20:01:50 +0200 | [diff] [blame] | 165 | registerCodec(Interface.class, new InterfaceCodec()); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 166 | log.info("Started"); |
| 167 | } |
| 168 | |
| 169 | @Deactivate |
Ray Milkey | 1f95bd3 | 2014-12-10 11:11:00 -0800 | [diff] [blame] | 170 | public void deactivate() { |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 171 | codecs.clear(); |
| 172 | log.info("Stopped"); |
| 173 | } |
| 174 | |
| 175 | @Override |
| 176 | public Set<Class<?>> getCodecs() { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 177 | checkPermission(CODEC_READ); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 178 | return ImmutableSet.copyOf(codecs.keySet()); |
| 179 | } |
| 180 | |
| 181 | @Override |
| 182 | @SuppressWarnings("unchecked") |
| 183 | public <T> JsonCodec<T> getCodec(Class<T> entityClass) { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 184 | checkPermission(CODEC_READ); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 185 | return codecs.get(entityClass); |
| 186 | } |
| 187 | |
| 188 | @Override |
| 189 | public <T> void registerCodec(Class<T> entityClass, JsonCodec<T> codec) { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 190 | checkPermission(CODEC_WRITE); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 191 | codecs.putIfAbsent(entityClass, codec); |
| 192 | } |
| 193 | |
| 194 | @Override |
| 195 | public void unregisterCodec(Class<?> entityClass) { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 196 | checkPermission(CODEC_WRITE); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 197 | codecs.remove(entityClass); |
| 198 | } |
| 199 | |
| 200 | } |