Hyunsun Moon
Committed by Jonathan Hart

Added patch interface add and remove behavior, and implemented OVSDB driver

Change-Id: Ic7632906fcfe50ec224fabdc15cb902a70150fae
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
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 + */
16 +package org.onosproject.net.behaviour;
17 +
18 +import com.google.common.base.MoreObjects;
19 +import com.google.common.base.Strings;
20 +import org.onosproject.net.AbstractDescription;
21 +import org.onosproject.net.SparseAnnotations;
22 +
23 +import java.util.Optional;
24 +
25 +import static com.google.common.base.Preconditions.checkArgument;
26 +
27 +/**
28 + * Default implementation of immutable patch interface description entity.
29 + */
30 +public final class DefaultPatchDescription extends AbstractDescription
31 + implements PatchDescription {
32 +
33 + private final Optional<String> deviceId;
34 + private final String ifaceName;
35 + private final String peerName;
36 +
37 + private DefaultPatchDescription(Optional<String> deviceId,
38 + String ifaceName,
39 + String peerName,
40 + SparseAnnotations... annotations) {
41 + super(annotations);
42 + this.deviceId = deviceId;
43 + this.ifaceName = ifaceName;
44 + this.peerName = peerName;
45 + }
46 +
47 +
48 + @Override
49 + public Optional<String> deviceId() {
50 + return deviceId;
51 + }
52 +
53 + @Override
54 + public String ifaceName() {
55 + return ifaceName;
56 + }
57 +
58 + @Override
59 + public String peer() {
60 + return peerName;
61 + }
62 +
63 + @Override
64 + public String toString() {
65 + return MoreObjects.toStringHelper(this)
66 + .add("deviceId", deviceId)
67 + .add("ifaceName", ifaceName)
68 + .add("peerName", peerName)
69 + .toString();
70 + }
71 +
72 + /**
73 + * Returns new builder instance.
74 + *
75 + * @return default patch description builder
76 + */
77 + public static Builder builder() {
78 + return new Builder();
79 + }
80 +
81 + public static final class Builder implements PatchDescription.Builder {
82 +
83 + private Optional<String> deviceId = Optional.empty();
84 + private String ifaceName;
85 + private String peerName;
86 +
87 + private Builder() {
88 + }
89 +
90 + @Override
91 + public PatchDescription build() {
92 + return new DefaultPatchDescription(deviceId, ifaceName, peerName);
93 + }
94 +
95 + @Override
96 + public PatchDescription.Builder deviceId(String deviceId) {
97 + this.deviceId = Optional.ofNullable(deviceId);
98 + return this;
99 + }
100 +
101 + @Override
102 + public PatchDescription.Builder ifaceName(String ifaceName) {
103 + checkArgument(!Strings.isNullOrEmpty(ifaceName));
104 + this.ifaceName = ifaceName;
105 + return this;
106 + }
107 +
108 + @Override
109 + public PatchDescription.Builder peer(String peerName) {
110 + checkArgument(!Strings.isNullOrEmpty(peerName));
111 + this.peerName = peerName;
112 + return this;
113 + }
114 + }
115 +}
...@@ -142,6 +142,23 @@ public interface InterfaceConfig extends HandlerBehaviour { ...@@ -142,6 +142,23 @@ public interface InterfaceConfig extends HandlerBehaviour {
142 boolean removeTunnelMode(String intf); 142 boolean removeTunnelMode(String intf);
143 143
144 /** 144 /**
145 + * Adds a patch mode to the supplied interface.
146 + *
147 + * @param ifaceName interface name to set patch mode
148 + * @param patchInterface interface description
149 + * @return true if the operation succeeds
150 + */
151 + boolean addPatchMode(String ifaceName, PatchDescription patchInterface);
152 +
153 + /**
154 + * Removes a patch mode from the supplied interface.
155 + *
156 + * @param ifaceName interface name
157 + * @return true if the operation succeeds
158 + */
159 + boolean removePatchMode(String ifaceName);
160 +
161 + /**
145 * Provides the interfaces configured on a device. 162 * Provides the interfaces configured on a device.
146 * 163 *
147 * @param deviceId the device ID 164 * @param deviceId the device ID
......
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
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 + */
16 +package org.onosproject.net.behaviour;
17 +
18 +import org.onosproject.net.Annotated;
19 +import org.onosproject.net.Description;
20 +
21 +import java.util.Optional;
22 +
23 +/**
24 + * Describes a patch interface.
25 + */
26 +public interface PatchDescription extends Description, Annotated {
27 +
28 + /**
29 + * Returns the identifier of the device where this patch interface is.
30 + *
31 + * @return device identifier; empty value if not set
32 + */
33 + Optional<String> deviceId();
34 +
35 + /**
36 + * Return the name of the patch interface.
37 + *
38 + * @return patch interface name
39 + */
40 + String ifaceName();
41 +
42 + /**
43 + * Returns the name of the interface for the other side of the patch.
44 + *
45 + * @return peer patch interface name
46 + */
47 + String peer();
48 +
49 + /**
50 + * Builder of patch interface description entities.
51 + */
52 + interface Builder {
53 +
54 + /**
55 + * Returns new patch interface description.
56 + *
57 + * @return patch interface description
58 + */
59 + PatchDescription build();
60 +
61 + /**
62 + * Returns new patch interface description.
63 + *
64 + * @param deviceId device id
65 + * @return patch interface description builder
66 + */
67 + Builder deviceId(String deviceId);
68 + /**
69 + * Returns patch interface description builder with a given interface name.
70 + *
71 + * @param ifaceName interface name
72 + * @return patch interface description builder
73 + */
74 + Builder ifaceName(String ifaceName);
75 +
76 + /**
77 + * Returns patch interface description builder with a given peer.
78 + *
79 + * @param peerName peer patch interface name
80 + * @return patch interface description builder
81 + */
82 + Builder peer(String peerName);
83 + }
84 +
85 +}
...@@ -22,6 +22,7 @@ import org.onlab.packet.VlanId; ...@@ -22,6 +22,7 @@ import org.onlab.packet.VlanId;
22 import org.onosproject.drivers.utilities.XmlConfigParser; 22 import org.onosproject.drivers.utilities.XmlConfigParser;
23 import org.onosproject.net.DeviceId; 23 import org.onosproject.net.DeviceId;
24 import org.onosproject.net.behaviour.InterfaceConfig; 24 import org.onosproject.net.behaviour.InterfaceConfig;
25 +import org.onosproject.net.behaviour.PatchDescription;
25 import org.onosproject.net.behaviour.TunnelDescription; 26 import org.onosproject.net.behaviour.TunnelDescription;
26 import org.onosproject.net.device.DeviceInterfaceDescription; 27 import org.onosproject.net.device.DeviceInterfaceDescription;
27 import org.onosproject.net.driver.AbstractHandlerBehaviour; 28 import org.onosproject.net.driver.AbstractHandlerBehaviour;
...@@ -490,5 +491,15 @@ public class InterfaceConfigCiscoIosImpl extends AbstractHandlerBehaviour ...@@ -490,5 +491,15 @@ public class InterfaceConfigCiscoIosImpl extends AbstractHandlerBehaviour
490 public boolean removeTunnelMode(String ifaceName) { 491 public boolean removeTunnelMode(String ifaceName) {
491 throw new UnsupportedOperationException("Remove tunnel mode is not supported"); 492 throw new UnsupportedOperationException("Remove tunnel mode is not supported");
492 } 493 }
494 +
495 + @Override
496 + public boolean addPatchMode(String ifaceName, PatchDescription patchDesc) {
497 + throw new UnsupportedOperationException("Add patch interface is not supported");
498 + }
499 +
500 + @Override
501 + public boolean removePatchMode(String ifaceName) {
502 + throw new UnsupportedOperationException("Remove patch interface is not supported");
503 + }
493 } 504 }
494 505
......
...@@ -20,6 +20,7 @@ import org.onlab.packet.IpAddress; ...@@ -20,6 +20,7 @@ import org.onlab.packet.IpAddress;
20 import org.onlab.packet.VlanId; 20 import org.onlab.packet.VlanId;
21 import org.onosproject.net.DeviceId; 21 import org.onosproject.net.DeviceId;
22 import org.onosproject.net.behaviour.InterfaceConfig; 22 import org.onosproject.net.behaviour.InterfaceConfig;
23 +import org.onosproject.net.behaviour.PatchDescription;
23 import org.onosproject.net.behaviour.TunnelDescription; 24 import org.onosproject.net.behaviour.TunnelDescription;
24 import org.onosproject.net.device.DeviceInterfaceDescription; 25 import org.onosproject.net.device.DeviceInterfaceDescription;
25 import org.onosproject.net.driver.AbstractHandlerBehaviour; 26 import org.onosproject.net.driver.AbstractHandlerBehaviour;
...@@ -67,11 +68,28 @@ public class OvsdbInterfaceConfig extends AbstractHandlerBehaviour implements In ...@@ -67,11 +68,28 @@ public class OvsdbInterfaceConfig extends AbstractHandlerBehaviour implements In
67 68
68 @Override 69 @Override
69 public boolean removeAccessMode(String ifaceName) { 70 public boolean removeAccessMode(String ifaceName) {
70 - // TODO implement
71 throw new UnsupportedOperationException("Not implemented yet"); 71 throw new UnsupportedOperationException("Not implemented yet");
72 } 72 }
73 73
74 @Override 74 @Override
75 + public boolean addPatchMode(String ifaceName, PatchDescription patchDesc) {
76 + OvsdbInterface ovsdbIface = OvsdbInterface.builder(patchDesc).build();
77 + OvsdbClientService ovsdbClient = getOvsdbClient(handler());
78 +
79 + if (!patchDesc.deviceId().isPresent()) {
80 + log.warn("Device ID is required {}", patchDesc);
81 + return false;
82 + }
83 + return ovsdbClient.createInterface(patchDesc.deviceId().get(), ovsdbIface);
84 + }
85 +
86 + @Override
87 + public boolean removePatchMode(String ifaceName) {
88 + OvsdbClientService ovsdbClient = getOvsdbClient(handler());
89 + return ovsdbClient.dropInterface(ifaceName);
90 + }
91 +
92 + @Override
75 public boolean addTrunkMode(String ifaceName, List<VlanId> vlanIds) { 93 public boolean addTrunkMode(String ifaceName, List<VlanId> vlanIds) {
76 // TODO implement 94 // TODO implement
77 throw new UnsupportedOperationException("Not implemented yet"); 95 throw new UnsupportedOperationException("Not implemented yet");
......
...@@ -60,6 +60,8 @@ public final class OvsdbConstant { ...@@ -60,6 +60,8 @@ public final class OvsdbConstant {
60 public static final String TUNNEL_LOCAL_IP = "local_ip"; 60 public static final String TUNNEL_LOCAL_IP = "local_ip";
61 public static final String TUNNEL_REMOTE_IP = "remote_ip"; 61 public static final String TUNNEL_REMOTE_IP = "remote_ip";
62 public static final String TUNNEL_KEY = "key"; 62 public static final String TUNNEL_KEY = "key";
63 + // patch interface options
64 + public static final String PATCH_PEER = "peer";
63 65
64 /** Controller table. */ 66 /** Controller table. */
65 public static final String CONTROLLER = "Controller"; 67 public static final String CONTROLLER = "Controller";
......
...@@ -23,6 +23,7 @@ import java.util.Objects; ...@@ -23,6 +23,7 @@ import java.util.Objects;
23 23
24 import com.google.common.collect.Maps; 24 import com.google.common.collect.Maps;
25 import org.onosproject.net.DefaultAnnotations; 25 import org.onosproject.net.DefaultAnnotations;
26 +import org.onosproject.net.behaviour.PatchDescription;
26 import org.onosproject.net.behaviour.TunnelDescription; 27 import org.onosproject.net.behaviour.TunnelDescription;
27 28
28 /** 29 /**
...@@ -154,6 +155,16 @@ public final class OvsdbInterface { ...@@ -154,6 +155,16 @@ public final class OvsdbInterface {
154 } 155 }
155 156
156 /** 157 /**
158 + * Returns new OVSDB interface builder with patch interface description.
159 + *
160 + * @param patchDesc patch interface description
161 + * @return ovsdb interface builder
162 + */
163 + public static OvsdbInterface.Builder builder(PatchDescription patchDesc) {
164 + return new Builder(patchDesc);
165 + }
166 +
167 + /**
157 * Builder of OVSDB interface entities. 168 * Builder of OVSDB interface entities.
158 */ 169 */
159 public static final class Builder { 170 public static final class Builder {
...@@ -173,18 +184,34 @@ public final class OvsdbInterface { ...@@ -173,18 +184,34 @@ public final class OvsdbInterface {
173 this.name = tunnelDesc.ifaceName(); 184 this.name = tunnelDesc.ifaceName();
174 this.type = Type.valueOf(tunnelDesc.type().name()); 185 this.type = Type.valueOf(tunnelDesc.type().name());
175 186
187 + Map<String, String> tunOptions = Maps.newHashMap();
176 if (tunnelDesc.local().isPresent()) { 188 if (tunnelDesc.local().isPresent()) {
177 - options.put(TUNNEL_LOCAL_IP, tunnelDesc.local().get().strValue()); 189 + tunOptions.put(TUNNEL_LOCAL_IP, tunnelDesc.local().get().strValue());
178 } 190 }
179 if (tunnelDesc.remote().isPresent()) { 191 if (tunnelDesc.remote().isPresent()) {
180 - options.put(TUNNEL_REMOTE_IP, tunnelDesc.remote().get().strValue()); 192 + tunOptions.put(TUNNEL_REMOTE_IP, tunnelDesc.remote().get().strValue());
181 } 193 }
182 if (tunnelDesc.key().isPresent()) { 194 if (tunnelDesc.key().isPresent()) {
183 - options.put(TUNNEL_KEY, tunnelDesc.key().get().strValue()); 195 + tunOptions.put(TUNNEL_KEY, tunnelDesc.key().get().strValue());
184 } 196 }
185 197
186 // set other configurations if there are any 198 // set other configurations if there are any
187 - options.putAll(((DefaultAnnotations) tunnelDesc.annotations()).asMap()); 199 + tunOptions.putAll(((DefaultAnnotations) tunnelDesc.annotations()).asMap());
200 + options = tunOptions;
201 + }
202 +
203 + /**
204 + * Constructs a builder with a given patch interface description.
205 + *
206 + * @param patchDesc patch interface description
207 + */
208 + private Builder(PatchDescription patchDesc) {
209 + this.name = patchDesc.ifaceName();
210 + this.type = Type.PATCH;
211 +
212 + Map<String, String> patchOptions = Maps.newHashMap();
213 + patchOptions.put(PATCH_PEER, patchDesc.peer());
214 + options = patchOptions;
188 } 215 }
189 216
190 /** 217 /**
......
...@@ -537,21 +537,21 @@ public class DefaultOvsdbClient implements OvsdbProviderService, OvsdbClientServ ...@@ -537,21 +537,21 @@ public class DefaultOvsdbClient implements OvsdbProviderService, OvsdbClientServ
537 ArrayList<Operation> operations = Lists.newArrayList(); 537 ArrayList<Operation> operations = Lists.newArrayList();
538 DatabaseSchema dbSchema = schema.get(DATABASENAME); 538 DatabaseSchema dbSchema = schema.get(DATABASENAME);
539 539
540 - // insert a new port to the port table 540 + // insert a new port with the interface name
541 Port port = (Port) TableGenerator.createTable(dbSchema, OvsdbTable.PORT); 541 Port port = (Port) TableGenerator.createTable(dbSchema, OvsdbTable.PORT);
542 port.setName(ovsdbIface.name()); 542 port.setName(ovsdbIface.name());
543 Insert portInsert = new Insert(dbSchema.getTableSchema(PORT), PORT, port.getRow()); 543 Insert portInsert = new Insert(dbSchema.getTableSchema(PORT), PORT, port.getRow());
544 portInsert.getRow().put(INTERFACES, Uuid.uuid(INTERFACE)); 544 portInsert.getRow().put(INTERFACES, Uuid.uuid(INTERFACE));
545 operations.add(portInsert); 545 operations.add(portInsert);
546 546
547 - // update the bridge table 547 + // update the bridge table with the new port
548 Condition condition = ConditionUtil.isEqual(UUID, Uuid.uuid(bridgeUuid)); 548 Condition condition = ConditionUtil.isEqual(UUID, Uuid.uuid(bridgeUuid));
549 Mutation mutation = MutationUtil.insert(PORTS, Uuid.uuid(PORT)); 549 Mutation mutation = MutationUtil.insert(PORTS, Uuid.uuid(PORT));
550 List<Condition> conditions = Lists.newArrayList(condition); 550 List<Condition> conditions = Lists.newArrayList(condition);
551 List<Mutation> mutations = Lists.newArrayList(mutation); 551 List<Mutation> mutations = Lists.newArrayList(mutation);
552 operations.add(new Mutate(dbSchema.getTableSchema(BRIDGE), conditions, mutations)); 552 operations.add(new Mutate(dbSchema.getTableSchema(BRIDGE), conditions, mutations));
553 553
554 - // insert a tunnel interface 554 + // insert an interface
555 Interface intf = (Interface) TableGenerator.createTable(dbSchema, OvsdbTable.INTERFACE); 555 Interface intf = (Interface) TableGenerator.createTable(dbSchema, OvsdbTable.INTERFACE);
556 intf.setName(ovsdbIface.name()); 556 intf.setName(ovsdbIface.name());
557 intf.setType(ovsdbIface.typeToString()); 557 intf.setType(ovsdbIface.typeToString());
...@@ -560,7 +560,7 @@ public class DefaultOvsdbClient implements OvsdbProviderService, OvsdbClientServ ...@@ -560,7 +560,7 @@ public class DefaultOvsdbClient implements OvsdbProviderService, OvsdbClientServ
560 operations.add(intfInsert); 560 operations.add(intfInsert);
561 561
562 transactConfig(DATABASENAME, operations); 562 transactConfig(DATABASENAME, operations);
563 - log.info("Created interface {}", ovsdbIface.name()); 563 + log.info("Created interface {}", ovsdbIface);
564 return true; 564 return true;
565 } 565 }
566 566
......