blob: 18746d3abf7e4f39169ed5ae4952c463f3be3ea7 [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 Casconecb4327a2018-09-11 15:17:23 -070026import org.onosproject.net.pi.runtime.PiActionProfileGroup;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090027import org.onosproject.net.pi.runtime.PiMeterCellConfig;
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -070028import org.onosproject.net.pi.runtime.PiPreEntry;
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 Cascone9db4d5c2019-04-16 17:36:33 -070036import org.onosproject.net.pi.service.PiReplicationGroupTranslationStore;
37import org.onosproject.net.pi.service.PiReplicationGroupTranslator;
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 Casconea7e60c62019-03-21 17:58:12 -070048import static com.google.common.base.Preconditions.checkNotNull;
49
Carmelo Cascone00a59962017-06-16 17:51:49 +090050/**
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080051 * Implementation of the PI translation service.
Carmelo Cascone00a59962017-06-16 17:51:49 +090052 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070053@Component(immediate = true, service = PiTranslationService.class)
Carmelo Cascone87b9b392017-10-02 18:33:20 +020054public class PiTranslationServiceImpl implements PiTranslationService {
Carmelo Cascone00a59962017-06-16 17:51:49 +090055
56 private final Logger log = LoggerFactory.getLogger(this.getClass());
57
Carmelo Cascone87b9b392017-10-02 18:33:20 +020058 // TODO: implement cache to speed up translation.
Carmelo Cascone00a59962017-06-16 17:51:49 +090059
Ray Milkeyd84f89b2018-08-17 14:54:17 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone00a59962017-06-16 17:51:49 +090061 protected DeviceService deviceService;
62
Ray Milkeyd84f89b2018-08-17 14:54:17 -070063 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080064 private PiFlowRuleTranslationStore flowRuleTranslationStore;
65
Ray Milkeyd84f89b2018-08-17 14:54:17 -070066 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080067 private PiGroupTranslationStore groupTranslationStore;
68
Ray Milkeyd84f89b2018-08-17 14:54:17 -070069 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -070070 private PiReplicationGroupTranslationStore repGroupTranslationStore;
Carmelo Cascone58136812018-07-19 03:40:16 +020071
Ray Milkeyd84f89b2018-08-17 14:54:17 -070072 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Frank Wangd7e3b4b2017-09-24 13:37:54 +090073 private PiMeterTranslationStore meterTranslationStore;
74
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080075 private PiFlowRuleTranslator flowRuleTranslator;
76 private PiGroupTranslator groupTranslator;
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -070077 private PiReplicationGroupTranslator repGroupTranslator;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090078 private PiMeterTranslator meterTranslator;
Carmelo Cascone1a7e4f92017-11-20 23:04:02 -080079
Carmelo Cascone00a59962017-06-16 17:51:49 +090080 @Activate
81 public void activate() {
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080082 flowRuleTranslator = new InternalFlowRuleTranslator(flowRuleTranslationStore);
83 groupTranslator = new InternalGroupTranslator(groupTranslationStore);
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -070084 repGroupTranslator = new InternalReplicationGroupTranslator(repGroupTranslationStore);
Frank Wangd7e3b4b2017-09-24 13:37:54 +090085 meterTranslator = new InternalMeterTranslator(meterTranslationStore);
Carmelo Cascone00a59962017-06-16 17:51:49 +090086 log.info("Started");
87 }
88
89 @Deactivate
90 public void deactivate() {
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080091 flowRuleTranslator = null;
92 groupTranslator = null;
Frank Wangd7e3b4b2017-09-24 13:37:54 +090093 meterTranslator = null;
Carmelo Cascone00a59962017-06-16 17:51:49 +090094 log.info("Stopped");
95 }
96
97 @Override
Carmelo Cascone326ad2d2017-11-28 18:09:13 -080098 public PiFlowRuleTranslator flowRuleTranslator() {
99 return flowRuleTranslator;
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200100 }
Carmelo Cascone00a59962017-06-16 17:51:49 +0900101
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200102 @Override
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800103 public PiGroupTranslator groupTranslator() {
104 return groupTranslator;
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200105 }
106
Frank Wangd7e3b4b2017-09-24 13:37:54 +0900107 @Override
108 public PiMeterTranslator meterTranslator() {
109 return meterTranslator;
110 }
111
Carmelo Cascone58136812018-07-19 03:40:16 +0200112 @Override
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -0700113 public PiReplicationGroupTranslator replicationGroupTranslator() {
114 return repGroupTranslator;
Carmelo Cascone58136812018-07-19 03:40:16 +0200115 }
116
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200117 private Device getDevice(DeviceId deviceId) throws PiTranslationException {
118 final Device device = deviceService.getDevice(deviceId);
Carmelo Cascone00a59962017-06-16 17:51:49 +0900119 if (device == null) {
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800120 throw new PiTranslationException("Unable to get device " + deviceId);
Carmelo Cascone00a59962017-06-16 17:51:49 +0900121 }
Carmelo Cascone87b9b392017-10-02 18:33:20 +0200122 return device;
Carmelo Cascone00a59962017-06-16 17:51:49 +0900123 }
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800124
125 private final class InternalFlowRuleTranslator
126 extends AbstractPiTranslatorImpl<FlowRule, PiTableEntry>
127 implements PiFlowRuleTranslator {
128
129 private InternalFlowRuleTranslator(PiFlowRuleTranslationStore store) {
130 super(store);
131 }
132
133 @Override
134 public PiTableEntry translate(FlowRule original, PiPipeconf pipeconf)
135 throws PiTranslationException {
Carmelo Casconea7e60c62019-03-21 17:58:12 -0700136 checkNotNull(original);
137 checkNotNull(pipeconf);
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800138 return PiFlowRuleTranslatorImpl
139 .translate(original, pipeconf, getDevice(original.deviceId()));
140 }
141 }
142
143 private final class InternalGroupTranslator
Carmelo Casconecb4327a2018-09-11 15:17:23 -0700144 extends AbstractPiTranslatorImpl<Group, PiActionProfileGroup>
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800145 implements PiGroupTranslator {
146
147 private InternalGroupTranslator(PiGroupTranslationStore store) {
148 super(store);
149 }
150
151 @Override
Carmelo Casconecb4327a2018-09-11 15:17:23 -0700152 public PiActionProfileGroup translate(Group original, PiPipeconf pipeconf)
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800153 throws PiTranslationException {
Carmelo Casconea7e60c62019-03-21 17:58:12 -0700154 checkNotNull(original);
155 checkNotNull(pipeconf);
Carmelo Cascone326ad2d2017-11-28 18:09:13 -0800156 return PiGroupTranslatorImpl
157 .translate(original, pipeconf, getDevice(original.deviceId()));
158 }
159 }
Frank Wangd7e3b4b2017-09-24 13:37:54 +0900160
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -0700161 private final class InternalReplicationGroupTranslator
162 extends AbstractPiTranslatorImpl<Group, PiPreEntry>
163 implements PiReplicationGroupTranslator {
Carmelo Cascone58136812018-07-19 03:40:16 +0200164
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -0700165 private InternalReplicationGroupTranslator(PiReplicationGroupTranslationStore store) {
Carmelo Cascone58136812018-07-19 03:40:16 +0200166 super(store);
167 }
168
169 @Override
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -0700170 public PiPreEntry translate(Group original, PiPipeconf pipeconf)
Carmelo Cascone58136812018-07-19 03:40:16 +0200171 throws PiTranslationException {
Carmelo Casconea7e60c62019-03-21 17:58:12 -0700172 checkNotNull(original);
173 checkNotNull(pipeconf);
Carmelo Cascone9db4d5c2019-04-16 17:36:33 -0700174 return PiReplicationGroupTranslatorImpl.translate(
Carmelo Cascone1e8843f2018-07-19 19:01:12 +0200175 original, pipeconf, getDevice(original.deviceId()));
Carmelo Cascone58136812018-07-19 03:40:16 +0200176 }
177 }
178
Frank Wangd7e3b4b2017-09-24 13:37:54 +0900179 private final class InternalMeterTranslator
180 extends AbstractPiTranslatorImpl<Meter, PiMeterCellConfig>
181 implements PiMeterTranslator {
182
183 private InternalMeterTranslator(PiMeterTranslationStore store) {
184 super(store);
185 }
186
187 @Override
188 public PiMeterCellConfig translate(Meter original, PiPipeconf pipeconf)
189 throws PiTranslationException {
Carmelo Casconea7e60c62019-03-21 17:58:12 -0700190 checkNotNull(original);
191 checkNotNull(pipeconf);
Frank Wangd7e3b4b2017-09-24 13:37:54 +0900192 return PiMeterTranslatorImpl
193 .translate(original, pipeconf, getDevice(original.deviceId()));
194 }
195 }
Carmelo Cascone00a59962017-06-16 17:51:49 +0900196}
197