blob: f024f6c2e614fd36f653f9a90a1b816fbdcff7c3 [file] [log] [blame]
Carmelo Cascone00a59962017-06-16 17:51:49 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Carmelo Cascone00a59962017-06-16 17:51:49 +09003 *
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
17package org.onosproject.net.pi.impl;
18
Carmelo Cascone00a59962017-06-16 17:51:49 +090019import org.onosproject.net.Device;
Carmelo Cascone87b9b392017-10-02 18:33:20 +020020import org.onosproject.net.DeviceId;
Carmelo Cascone00a59962017-06-16 17:51:49 +090021import org.onosproject.net.device.DeviceService;
22import org.onosproject.net.flow.FlowRule;
Carmelo Cascone87b9b392017-10-02 18:33:20 +020023import org.onosproject.net.group.Group;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090024import org.onosproject.net.meter.Meter;
Carmelo Cascone00a59962017-06-16 17:51:49 +090025import org.onosproject.net.pi.model.PiPipeconf;
Carmelo Cascone87b9b392017-10-02 18:33:20 +020026import org.onosproject.net.pi.runtime.PiActionGroup;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090027import org.onosproject.net.pi.runtime.PiMeterCellConfig;
Carmelo Cascone58136812018-07-19 03:40:16 +020028import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
Carmelo Cascone00a59962017-06-16 17:51:49 +090029import org.onosproject.net.pi.runtime.PiTableEntry;
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080030import org.onosproject.net.pi.service.PiFlowRuleTranslationStore;
31import org.onosproject.net.pi.service.PiFlowRuleTranslator;
32import org.onosproject.net.pi.service.PiGroupTranslationStore;
33import org.onosproject.net.pi.service.PiGroupTranslator;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090034import org.onosproject.net.pi.service.PiMeterTranslationStore;
35import org.onosproject.net.pi.service.PiMeterTranslator;
Carmelo Cascone58136812018-07-19 03:40:16 +020036import org.onosproject.net.pi.service.PiMulticastGroupTranslationStore;
37import org.onosproject.net.pi.service.PiMulticastGroupTranslator;
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080038import org.onosproject.net.pi.service.PiTranslationException;
Carmelo Cascone39c28ca2017-11-15 13:03:57 -080039import org.onosproject.net.pi.service.PiTranslationService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070040import org.osgi.service.component.annotations.Activate;
41import org.osgi.service.component.annotations.Component;
42import org.osgi.service.component.annotations.Deactivate;
43import org.osgi.service.component.annotations.Reference;
44import org.osgi.service.component.annotations.ReferenceCardinality;
Carmelo Cascone00a59962017-06-16 17:51:49 +090045import org.slf4j.Logger;
46import org.slf4j.LoggerFactory;
47
Carmelo Cascone00a59962017-06-16 17:51:49 +090048/**
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080049 * Implementation of the PI translation service.
Carmelo Cascone00a59962017-06-16 17:51:49 +090050 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070051@Component(immediate = true, service = PiTranslationService.class)
Carmelo Cascone87b9b392017-10-02 18:33:20 +020052public class PiTranslationServiceImpl implements PiTranslationService {
Carmelo Cascone00a59962017-06-16 17:51:49 +090053
54 private final Logger log = LoggerFactory.getLogger(this.getClass());
55
Carmelo Cascone87b9b392017-10-02 18:33:20 +020056 // TODO: implement cache to speed up translation.
Carmelo Cascone00a59962017-06-16 17:51:49 +090057
Ray Milkeyd84f89b2018-08-17 14:54:17 -070058 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone00a59962017-06-16 17:51:49 +090059 protected DeviceService deviceService;
60
Ray Milkeyd84f89b2018-08-17 14:54:17 -070061 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080062 private PiFlowRuleTranslationStore flowRuleTranslationStore;
63
Ray Milkeyd84f89b2018-08-17 14:54:17 -070064 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080065 private PiGroupTranslationStore groupTranslationStore;
66
Ray Milkeyd84f89b2018-08-17 14:54:17 -070067 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone58136812018-07-19 03:40:16 +020068 private PiMulticastGroupTranslationStore mcGroupTranslationStore;
69
Ray Milkeyd84f89b2018-08-17 14:54:17 -070070 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Frank Wangd7e3b4b2017-09-24 13:37:54 +090071 private PiMeterTranslationStore meterTranslationStore;
72
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080073 private PiFlowRuleTranslator flowRuleTranslator;
74 private PiGroupTranslator groupTranslator;
Carmelo Cascone58136812018-07-19 03:40:16 +020075 private PiMulticastGroupTranslator mcGroupTranslator;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090076 private PiMeterTranslator meterTranslator;
Carmelo Cascone1a7e4f92017-11-20 23:04:02 -080077
Carmelo Cascone00a59962017-06-16 17:51:49 +090078 @Activate
79 public void activate() {
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080080 flowRuleTranslator = new InternalFlowRuleTranslator(flowRuleTranslationStore);
81 groupTranslator = new InternalGroupTranslator(groupTranslationStore);
Carmelo Cascone58136812018-07-19 03:40:16 +020082 mcGroupTranslator = new InternalMulticastGroupTranslator(mcGroupTranslationStore);
Frank Wangd7e3b4b2017-09-24 13:37:54 +090083 meterTranslator = new InternalMeterTranslator(meterTranslationStore);
Carmelo Cascone00a59962017-06-16 17:51:49 +090084 log.info("Started");
85 }
86
87 @Deactivate
88 public void deactivate() {
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080089 flowRuleTranslator = null;
90 groupTranslator = null;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090091 meterTranslator = null;
Carmelo Cascone00a59962017-06-16 17:51:49 +090092 log.info("Stopped");
93 }
94
95 @Override
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080096 public PiFlowRuleTranslator flowRuleTranslator() {
97 return flowRuleTranslator;
Carmelo Cascone87b9b392017-10-02 18:33:20 +020098 }
Carmelo Cascone00a59962017-06-16 17:51:49 +090099
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200100 @Override
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800101 public PiGroupTranslator groupTranslator() {
102 return groupTranslator;
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200103 }
104
Frank Wangd7e3b4b2017-09-24 13:37:54 +0900105 @Override
106 public PiMeterTranslator meterTranslator() {
107 return meterTranslator;
108 }
109
Carmelo Cascone58136812018-07-19 03:40:16 +0200110 @Override
111 public PiMulticastGroupTranslator multicastGroupTranslator() {
112 return mcGroupTranslator;
113 }
114
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200115 private Device getDevice(DeviceId deviceId) throws PiTranslationException {
116 final Device device = deviceService.getDevice(deviceId);
Carmelo Cascone00a59962017-06-16 17:51:49 +0900117 if (device == null) {
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800118 throw new PiTranslationException("Unable to get device " + deviceId);
Carmelo Cascone00a59962017-06-16 17:51:49 +0900119 }
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200120 return device;
Carmelo Cascone00a59962017-06-16 17:51:49 +0900121 }
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800122
123 private final class InternalFlowRuleTranslator
124 extends AbstractPiTranslatorImpl<FlowRule, PiTableEntry>
125 implements PiFlowRuleTranslator {
126
127 private InternalFlowRuleTranslator(PiFlowRuleTranslationStore store) {
128 super(store);
129 }
130
131 @Override
132 public PiTableEntry translate(FlowRule original, PiPipeconf pipeconf)
133 throws PiTranslationException {
134 return PiFlowRuleTranslatorImpl
135 .translate(original, pipeconf, getDevice(original.deviceId()));
136 }
137 }
138
139 private final class InternalGroupTranslator
140 extends AbstractPiTranslatorImpl<Group, PiActionGroup>
141 implements PiGroupTranslator {
142
143 private InternalGroupTranslator(PiGroupTranslationStore store) {
144 super(store);
145 }
146
147 @Override
148 public PiActionGroup translate(Group original, PiPipeconf pipeconf)
149 throws PiTranslationException {
150 return PiGroupTranslatorImpl
151 .translate(original, pipeconf, getDevice(original.deviceId()));
152 }
153 }
Frank Wangd7e3b4b2017-09-24 13:37:54 +0900154
Carmelo Cascone58136812018-07-19 03:40:16 +0200155 private final class InternalMulticastGroupTranslator
156 extends AbstractPiTranslatorImpl<Group, PiMulticastGroupEntry>
157 implements PiMulticastGroupTranslator {
158
159 private InternalMulticastGroupTranslator(PiMulticastGroupTranslationStore store) {
160 super(store);
161 }
162
163 @Override
164 public PiMulticastGroupEntry translate(Group original, PiPipeconf pipeconf)
165 throws PiTranslationException {
Carmelo Cascone1e8843f2018-07-19 19:01:12 +0200166 return PiMulticastGroupTranslatorImpl.translate(
167 original, pipeconf, getDevice(original.deviceId()));
Carmelo Cascone58136812018-07-19 03:40:16 +0200168 }
169 }
170
Frank Wangd7e3b4b2017-09-24 13:37:54 +0900171 private final class InternalMeterTranslator
172 extends AbstractPiTranslatorImpl<Meter, PiMeterCellConfig>
173 implements PiMeterTranslator {
174
175 private InternalMeterTranslator(PiMeterTranslationStore store) {
176 super(store);
177 }
178
179 @Override
180 public PiMeterCellConfig translate(Meter original, PiPipeconf pipeconf)
181 throws PiTranslationException {
182 return PiMeterTranslatorImpl
183 .translate(original, pipeconf, getDevice(original.deviceId()));
184 }
185 }
Carmelo Cascone00a59962017-06-16 17:51:49 +0900186}
187