blob: c3cf1b6fec68f849146bef2fe99336cbce4be113 [file] [log] [blame]
sangho5afd02a2015-02-03 20:07:35 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
sangho5afd02a2015-02-03 20:07:35 -08003 *
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.provider.of.group.impl;
17
18import com.google.common.collect.Lists;
sangho5afd02a2015-02-03 20:07:35 -080019import org.onosproject.core.GroupId;
Hyunsun Moona834c182015-12-16 03:01:56 -080020import org.onosproject.net.DeviceId;
sangho5afd02a2015-02-03 20:07:35 -080021import org.onosproject.net.PortNumber;
Hyunsun Moona834c182015-12-16 03:01:56 -080022import org.onosproject.net.driver.DefaultDriverData;
23import org.onosproject.net.driver.DefaultDriverHandler;
24import org.onosproject.net.driver.Driver;
25import org.onosproject.net.driver.DriverHandler;
26import org.onosproject.net.driver.DriverService;
sangho5afd02a2015-02-03 20:07:35 -080027import org.onosproject.net.flow.DefaultTrafficTreatment;
28import org.onosproject.net.flow.TrafficTreatment;
29import org.onosproject.net.group.DefaultGroupBucket;
30import org.onosproject.net.group.GroupBucket;
31import org.onosproject.net.group.GroupBuckets;
Hyunsun Moona834c182015-12-16 03:01:56 -080032import org.onosproject.openflow.controller.Dpid;
Thomas Vachuska95caba32016-04-04 10:42:05 -070033import org.onosproject.provider.of.flow.util.FlowEntryBuilder;
sangho5afd02a2015-02-03 20:07:35 -080034import org.projectfloodlight.openflow.protocol.OFBucket;
35import org.projectfloodlight.openflow.protocol.OFGroupType;
36import org.projectfloodlight.openflow.protocol.action.OFAction;
sangho5afd02a2015-02-03 20:07:35 -080037import org.slf4j.Logger;
38
39import java.util.List;
40
41import static org.slf4j.LoggerFactory.getLogger;
42
Thomas Vachuska95caba32016-04-04 10:42:05 -070043/**
sangho5afd02a2015-02-03 20:07:35 -080044 * Builder for GroupBucketEntry.
45 */
46public class GroupBucketEntryBuilder {
47
Hyunsun Moona834c182015-12-16 03:01:56 -080048 private Dpid dpid;
sangho5afd02a2015-02-03 20:07:35 -080049 private List<OFBucket> ofBuckets;
50 private OFGroupType type;
Hyunsun Moona834c182015-12-16 03:01:56 -080051 private DriverService driverService;
sangho5afd02a2015-02-03 20:07:35 -080052
53 private final Logger log = getLogger(getClass());
54
Hyunsun Moona834c182015-12-16 03:01:56 -080055
sangho5afd02a2015-02-03 20:07:35 -080056 /**
57 * Creates a builder.
58 *
Hyunsun Moona834c182015-12-16 03:01:56 -080059 * @param dpid dpid
sangho5afd02a2015-02-03 20:07:35 -080060 * @param ofBuckets list of OFBucket
61 * @param type Group type
Hyunsun Moona834c182015-12-16 03:01:56 -080062 * @param driverService driver service
sangho5afd02a2015-02-03 20:07:35 -080063 */
Hyunsun Moona834c182015-12-16 03:01:56 -080064 public GroupBucketEntryBuilder(Dpid dpid, List<OFBucket> ofBuckets, OFGroupType type,
65 DriverService driverService) {
66 this.dpid = dpid;
sangho5afd02a2015-02-03 20:07:35 -080067 this.ofBuckets = ofBuckets;
68 this.type = type;
Hyunsun Moona834c182015-12-16 03:01:56 -080069 this.driverService = driverService;
sangho5afd02a2015-02-03 20:07:35 -080070 }
71
72 /**
73 * Builds a GroupBuckets.
74 *
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070075 * @return GroupBuckets object, a list of GroupBuckets
sangho5afd02a2015-02-03 20:07:35 -080076 */
77 public GroupBuckets build() {
78 List<GroupBucket> bucketList = Lists.newArrayList();
79
80 for (OFBucket bucket: ofBuckets) {
81 TrafficTreatment treatment = buildTreatment(bucket.getActions());
82 // TODO: Use GroupBucketEntry
83 GroupBucket groupBucket = null;
84 switch (type) {
85 case INDIRECT:
86 groupBucket =
87 DefaultGroupBucket.createIndirectGroupBucket(treatment);
88 break;
89 case SELECT:
90 groupBucket =
Thiago Santos15c70a12017-01-18 21:39:44 -030091 DefaultGroupBucket.createSelectGroupBucket(treatment, (short) bucket.getWeight());
sangho5afd02a2015-02-03 20:07:35 -080092 break;
93 case FF:
94 PortNumber port =
95 PortNumber.portNumber(bucket.getWatchPort().getPortNumber());
96 GroupId groupId =
Yi Tsengfa394de2017-02-01 11:26:40 -080097 new GroupId(bucket.getWatchGroup().getGroupNumber());
sangho5afd02a2015-02-03 20:07:35 -080098 groupBucket =
99 DefaultGroupBucket.createFailoverGroupBucket(treatment,
100 port, groupId);
101 break;
Charles Chanc42e84e2015-10-20 16:24:19 -0700102 case ALL:
103 groupBucket =
104 DefaultGroupBucket.createAllGroupBucket(treatment);
105 break;
sangho5afd02a2015-02-03 20:07:35 -0800106 default:
107 log.error("Unsupported Group type : {}", type);
108 }
109 if (groupBucket != null) {
110 bucketList.add(groupBucket);
111 }
112 }
113 return new GroupBuckets(bucketList);
114 }
115
sangho5afd02a2015-02-03 20:07:35 -0800116 private TrafficTreatment buildTreatment(List<OFAction> actions) {
Jian Lia0d9a172016-04-01 16:58:06 -0700117 DriverHandler driverHandler = getDriver(dpid);
sangho5afd02a2015-02-03 20:07:35 -0800118 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
Jian Lia0d9a172016-04-01 16:58:06 -0700119
sangho5afd02a2015-02-03 20:07:35 -0800120 // If this is a drop rule
Jon Hallcbd1b392017-01-18 20:15:44 -0800121 if (actions.isEmpty()) {
sangho5afd02a2015-02-03 20:07:35 -0800122 builder.drop();
123 return builder.build();
124 }
sangho5afd02a2015-02-03 20:07:35 -0800125
Jian Lia0d9a172016-04-01 16:58:06 -0700126 return FlowEntryBuilder.configureTreatmentBuilder(actions, builder,
127 driverHandler, DeviceId.deviceId(Dpid.uri(dpid))).build();
sangho5afd02a2015-02-03 20:07:35 -0800128 }
Hyunsun Moona834c182015-12-16 03:01:56 -0800129
130 private DriverHandler getDriver(Dpid dpid) {
131 DeviceId deviceId = DeviceId.deviceId(Dpid.uri(dpid));
132 Driver driver = driverService.getDriver(deviceId);
133 DriverHandler handler = new DefaultDriverHandler(new DefaultDriverData(driver, deviceId));
134 return handler;
135 }
sangho5afd02a2015-02-03 20:07:35 -0800136}