blob: a26e05a3f25f49bdebcd3517d8029b89610b7c03 [file] [log] [blame]
alshabibc7911792015-07-30 17:55:30 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
alshabibc7911792015-07-30 17:55:30 -07003 *
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.meter.impl;
17
alshabib10c810b2015-08-18 16:59:04 -070018import org.onosproject.net.meter.Band;
19import org.onosproject.net.meter.Meter;
20import org.onosproject.net.meter.MeterId;
alshabibc7911792015-07-30 17:55:30 -070021import org.projectfloodlight.openflow.protocol.OFFactory;
22import org.projectfloodlight.openflow.protocol.OFMeterFlags;
23import org.projectfloodlight.openflow.protocol.OFMeterMod;
24import org.projectfloodlight.openflow.protocol.OFMeterModCommand;
25import org.projectfloodlight.openflow.protocol.meterband.OFMeterBand;
26import org.projectfloodlight.openflow.protocol.meterband.OFMeterBandDrop;
27import org.projectfloodlight.openflow.protocol.meterband.OFMeterBandDscpRemark;
28import org.slf4j.Logger;
29
30import java.util.Collection;
Jimmy Jine9b7a022016-08-12 16:56:48 -070031import java.util.EnumSet;
alshabibc7911792015-07-30 17:55:30 -070032import java.util.List;
Sho SHIMIZU45906042016-01-13 23:05:54 -080033import java.util.Objects;
Jimmy Jine9b7a022016-08-12 16:56:48 -070034import java.util.Set;
alshabibc7911792015-07-30 17:55:30 -070035import java.util.stream.Collectors;
36
37import static com.google.common.base.Preconditions.checkArgument;
38import static com.google.common.base.Preconditions.checkNotNull;
39import static org.slf4j.LoggerFactory.getLogger;
40
41/**
42 * Builder for a meter modification.
43 */
44public final class MeterModBuilder {
45
46 private final Logger log = getLogger(getClass());
47
48 private final long xid;
49 private final OFFactory factory;
50 private Meter.Unit unit = Meter.Unit.KB_PER_SEC;
51 private boolean burst = false;
alshabib7bb05012015-08-05 10:15:09 -070052 private Long id;
alshabibc7911792015-07-30 17:55:30 -070053 private Collection<Band> bands;
54
55 public MeterModBuilder(long xid, OFFactory factory) {
56 this.xid = xid;
57 this.factory = factory;
58 }
59
60 public static MeterModBuilder builder(long xid, OFFactory factory) {
61 return new MeterModBuilder(xid, factory);
62 }
63
64 public MeterModBuilder withRateUnit(Meter.Unit unit) {
65 this.unit = unit;
66 return this;
67 }
68
69 public MeterModBuilder burst() {
70 this.burst = true;
71 return this;
72 }
73
74 public MeterModBuilder withId(MeterId meterId) {
75 this.id = meterId.id();
76 return this;
77 }
78
79 public MeterModBuilder withBands(Collection<Band> bands) {
80 this.bands = bands;
81 return this;
82 }
83
84 public OFMeterMod add() {
85 validate();
86 OFMeterMod.Builder builder = builderMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -070087 builder.setCommand(OFMeterModCommand.ADD);
alshabibc7911792015-07-30 17:55:30 -070088 return builder.build();
89 }
90
91 public OFMeterMod remove() {
92 validate();
93 OFMeterMod.Builder builder = builderMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -070094 builder.setCommand(OFMeterModCommand.DELETE);
alshabibc7911792015-07-30 17:55:30 -070095 return builder.build();
96 }
97
98 public OFMeterMod modify() {
99 validate();
100 OFMeterMod.Builder builder = builderMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -0700101 builder.setCommand(OFMeterModCommand.MODIFY);
alshabibc7911792015-07-30 17:55:30 -0700102 return builder.build();
103 }
104
105 private OFMeterMod.Builder builderMeterMod() {
106 OFMeterMod.Builder builder = factory.buildMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -0700107 Set<OFMeterFlags> flags = EnumSet.noneOf(OFMeterFlags.class);
alshabibc7911792015-07-30 17:55:30 -0700108 if (burst) {
Jimmy Jine9b7a022016-08-12 16:56:48 -0700109 flags.add(OFMeterFlags.BURST);
alshabibc7911792015-07-30 17:55:30 -0700110 }
111 switch (unit) {
112 case PKTS_PER_SEC:
Jimmy Jine9b7a022016-08-12 16:56:48 -0700113 flags.add(OFMeterFlags.PKTPS);
alshabibc7911792015-07-30 17:55:30 -0700114 break;
115 case KB_PER_SEC:
Jimmy Jine9b7a022016-08-12 16:56:48 -0700116 flags.add(OFMeterFlags.KBPS);
alshabibc7911792015-07-30 17:55:30 -0700117 break;
118 default:
119 log.warn("Unknown unit type {}", unit);
120 }
alshabib58fe6dc2015-08-19 17:16:13 -0700121 //FIXME: THIS WILL CHANGE IN OF1.4 to setBands.
122 builder.setMeters(buildBands());
alshabibc7911792015-07-30 17:55:30 -0700123 builder.setFlags(flags)
124 .setMeterId(id)
125 .setXid(xid);
126 return builder;
127 }
128
129 private List<OFMeterBand> buildBands() {
130 return bands.stream().map(b -> {
131 switch (b.type()) {
132 case DROP:
133 OFMeterBandDrop.Builder dropBuilder =
134 factory.meterBands().buildDrop();
135 if (burst) {
136 dropBuilder.setBurstSize(b.burst());
137 }
138 dropBuilder.setRate(b.rate());
139 return dropBuilder.build();
140 case REMARK:
141 OFMeterBandDscpRemark.Builder remarkBand =
142 factory.meterBands().buildDscpRemark();
143 if (burst) {
144 remarkBand.setBurstSize(b.burst());
145 }
146 remarkBand.setRate(b.rate());
147 remarkBand.setPrecLevel(b.dropPrecedence());
148 return remarkBand.build();
149 default:
150 log.warn("Unknown band type {}", b.type());
151 return null;
152 }
Sho SHIMIZU45906042016-01-13 23:05:54 -0800153 }).filter(Objects::nonNull).collect(Collectors.toList());
alshabibc7911792015-07-30 17:55:30 -0700154 }
155
156 private void validate() {
157 checkNotNull(id, "id cannot be null");
158 checkNotNull(bands, "Must have bands");
Jon Hallcbd1b392017-01-18 20:15:44 -0800159 checkArgument(!bands.isEmpty(), "Must have at lease one band");
alshabibc7911792015-07-30 17:55:30 -0700160 }
161}