sanghoshin

SONA: OpenstackSwitching - remove flows

 - Remove the corresponding flows when VMs are removed.
 - Remove the IP mapping of the VM removed from the DHCP service (even when doNotPushFlows is true)
 - Updated the network config json file to reflect the change of cordvtn
Change-Id: I4c359d456422ece37b93e6366f2fd4daaf081a37
...@@ -35,13 +35,14 @@ public interface OpenstackSwitchingService { ...@@ -35,13 +35,14 @@ public interface OpenstackSwitchingService {
35 * Removes flow rules corresponding to the port removed by Openstack. 35 * Removes flow rules corresponding to the port removed by Openstack.
36 * 36 *
37 */ 37 */
38 - void deletePorts(); 38 + void deletePort(String uuid);
39 39
40 /** 40 /**
41 * Updates flow rules corresponding to the port information updated by Openstack. 41 * Updates flow rules corresponding to the port information updated by Openstack.
42 * 42 *
43 + * @param openstackPort
43 */ 44 */
44 - void updatePorts(); 45 + void updatePort(OpenstackPort openstackPort);
45 46
46 /** 47 /**
47 * Stores the network information created by openstack. 48 * Stores the network information created by openstack.
......
...@@ -40,6 +40,9 @@ ...@@ -40,6 +40,9 @@
40 </api.description> 40 </api.description>
41 <api.package>org.onosproject.openstackswitching.web</api.package> 41 <api.package>org.onosproject.openstackswitching.web</api.package>
42 <onos.app.origin>SKT, Inc.</onos.app.origin> 42 <onos.app.origin>SKT, Inc.</onos.app.origin>
43 + <onos.app.requires>
44 + org.onosproject.dhcp
45 + </onos.app.requires>
43 </properties> 46 </properties>
44 47
45 48
......
...@@ -131,6 +131,21 @@ public class OpenstackSwitchingRulePopulator { ...@@ -131,6 +131,21 @@ public class OpenstackSwitchingRulePopulator {
131 } 131 }
132 132
133 /** 133 /**
134 + * Remove flows rules for the VM removed.
135 + *
136 + * @param deviceId device to remove rules
137 + * @param vmIp IP address of the VM removed
138 + */
139 + public void removeSwitchingRules(DeviceId deviceId, Ip4Address vmIp) {
140 + removeFlowRuleForVMsInSameCnode(deviceId, vmIp);
141 + deviceService.getAvailableDevices().forEach(device -> {
142 + if (!device.id().equals(deviceId)) {
143 + removeVxLanFlowRule(device.id(), vmIp);
144 + }
145 + });
146 + }
147 +
148 + /**
134 * Populates the flow rules for traffic to VMs in the same Cnode as the sender. 149 * Populates the flow rules for traffic to VMs in the same Cnode as the sender.
135 * 150 *
136 * @param device device to put the rules 151 * @param device device to put the rules
...@@ -170,9 +185,10 @@ public class OpenstackSwitchingRulePopulator { ...@@ -170,9 +185,10 @@ public class OpenstackSwitchingRulePopulator {
170 Ip4Address hostIpx = Ip4Address.valueOf(cidx.split(":")[0]); 185 Ip4Address hostIpx = Ip4Address.valueOf(cidx.split(":")[0]);
171 MacAddress vmMacx = getVmMacAddressForPort(pName); 186 MacAddress vmMacx = getVmMacAddressForPort(pName);
172 Ip4Address fixedIpx = getFixedIpAddressForPort(pName); 187 Ip4Address fixedIpx = getFixedIpAddressForPort(pName);
173 - 188 + if (port.isEnabled()) {
174 - setVxLanFlowRule(vni, device.id(), hostIpx, fixedIpx, vmMacx); 189 + setVxLanFlowRule(vni, device.id(), hostIpx, fixedIpx, vmMacx);
175 - setVxLanFlowRule(vni, d.id(), hostIpAddress, fixedIp, vmMac); 190 + setVxLanFlowRule(vni, d.id(), hostIpAddress, fixedIp, vmMac);
191 + }
176 } 192 }
177 }); 193 });
178 } 194 }
...@@ -246,7 +262,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -246,7 +262,7 @@ public class OpenstackSwitchingRulePopulator {
246 .findFirst().orElse(null); 262 .findFirst().orElse(null);
247 263
248 if (port == null) { 264 if (port == null) {
249 - log.error("There is port information for port name {}", portName); 265 + log.error("There is no port information for port name {}", portName);
250 return null; 266 return null;
251 } 267 }
252 268
...@@ -341,6 +357,40 @@ public class OpenstackSwitchingRulePopulator { ...@@ -341,6 +357,40 @@ public class OpenstackSwitchingRulePopulator {
341 flowObjectiveService.forward(id, fo); 357 flowObjectiveService.forward(id, fo);
342 } 358 }
343 359
360 + private void removeFlowRuleForVMsInSameCnode(DeviceId id, Ip4Address vmIp) {
361 + TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
362 +
363 + sBuilder.matchEthType(Ethernet.TYPE_IPV4)
364 + .matchIPDst(vmIp.toIpPrefix());
365 +
366 + ForwardingObjective fo = DefaultForwardingObjective.builder()
367 + .withSelector(sBuilder.build())
368 + .withTreatment(DefaultTrafficTreatment.builder().build())
369 + .withFlag(ForwardingObjective.Flag.VERSATILE)
370 + .withPriority(SWITCHING_RULE_PRIORITY)
371 + .fromApp(appId)
372 + .remove();
373 +
374 + flowObjectiveService.forward(id, fo);
375 + }
376 +
377 + private void removeVxLanFlowRule(DeviceId id, Ip4Address vmIp) {
378 + TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
379 + // XXX: Later, more matches will be added when multiple table is implemented.
380 + sBuilder.matchEthType(Ethernet.TYPE_IPV4)
381 + .matchIPDst(vmIp.toIpPrefix());
382 +
383 + ForwardingObjective fo = DefaultForwardingObjective.builder()
384 + .withSelector(sBuilder.build())
385 + .withTreatment(DefaultTrafficTreatment.builder().build())
386 + .withFlag(ForwardingObjective.Flag.VERSATILE)
387 + .withPriority(SWITCHING_RULE_PRIORITY)
388 + .fromApp(appId)
389 + .remove();
390 +
391 + flowObjectiveService.forward(id, fo);
392 + }
393 +
344 private ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) { 394 private ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) {
345 Driver driver = driverService.getDriver(id); 395 Driver driver = driverService.getDriver(id);
346 DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id)); 396 DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id));
......
...@@ -28,6 +28,7 @@ import javax.ws.rs.DELETE; ...@@ -28,6 +28,7 @@ import javax.ws.rs.DELETE;
28 import javax.ws.rs.POST; 28 import javax.ws.rs.POST;
29 import javax.ws.rs.PUT; 29 import javax.ws.rs.PUT;
30 import javax.ws.rs.Path; 30 import javax.ws.rs.Path;
31 +import javax.ws.rs.PathParam;
31 import javax.ws.rs.Produces; 32 import javax.ws.rs.Produces;
32 import javax.ws.rs.core.MediaType; 33 import javax.ws.rs.core.MediaType;
33 import javax.ws.rs.core.Response; 34 import javax.ws.rs.core.Response;
...@@ -68,12 +69,9 @@ public class OpenstackPortWebResource extends AbstractWebResource { ...@@ -68,12 +69,9 @@ public class OpenstackPortWebResource extends AbstractWebResource {
68 } 69 }
69 } 70 }
70 71
72 + @Path("{portUUID}")
71 @DELETE 73 @DELETE
72 - @Path("{id}") 74 + public Response deletePorts(@PathParam("portUUID") String id) {
73 - @Consumes(MediaType.APPLICATION_JSON)
74 - @Produces(MediaType.APPLICATION_JSON)
75 - public Response deletesPorts(InputStream input) {
76 - log.debug("REST API ports is called with {}", input.toString());
77 return Response.status(Response.Status.OK).build(); 75 return Response.status(Response.Status.OK).build();
78 } 76 }
79 77
...@@ -82,7 +80,6 @@ public class OpenstackPortWebResource extends AbstractWebResource { ...@@ -82,7 +80,6 @@ public class OpenstackPortWebResource extends AbstractWebResource {
82 @Consumes(MediaType.APPLICATION_JSON) 80 @Consumes(MediaType.APPLICATION_JSON)
83 @Produces(MediaType.APPLICATION_JSON) 81 @Produces(MediaType.APPLICATION_JSON)
84 public Response updatePorts(InputStream input) { 82 public Response updatePorts(InputStream input) {
85 - log.info("REST API ports is called with {}", input.toString());
86 return Response.status(Response.Status.OK).build(); 83 return Response.status(Response.Status.OK).build();
87 } 84 }
88 } 85 }
......
...@@ -32,19 +32,31 @@ ...@@ -32,19 +32,31 @@
32 "nodes" : [ 32 "nodes" : [
33 { 33 {
34 "hostname" : "compute-01", 34 "hostname" : "compute-01",
35 +<<<<<<< HEAD
35 "ovsdbIp" : "10.40.101.208", 36 "ovsdbIp" : "10.40.101.208",
37 +=======
38 + "ovsdbIp" : "127.0.0.1",
39 +>>>>>>> 6a78e2e... SONA: OpenstackSwitching - remove flows
36 "ovsdbPort" : "6640", 40 "ovsdbPort" : "6640",
37 "bridgeId" : "of:0000000000000001" 41 "bridgeId" : "of:0000000000000001"
38 }, 42 },
39 { 43 {
40 "hostname" : "compute-02", 44 "hostname" : "compute-02",
45 +<<<<<<< HEAD
41 "ovsdbIp" : "10.40.101.227", 46 "ovsdbIp" : "10.40.101.227",
47 +=======
48 + "ovsdbIp" : "127.0.0.1",
49 +>>>>>>> 6a78e2e... SONA: OpenstackSwitching - remove flows
42 "ovsdbPort" : "6640", 50 "ovsdbPort" : "6640",
43 "bridgeId" : "of:0000000000000002" 51 "bridgeId" : "of:0000000000000002"
44 }, 52 },
45 { 53 {
46 "hostname" : "network", 54 "hostname" : "network",
55 +<<<<<<< HEAD
47 "ovsdbIp" : "10.40.101.209", 56 "ovsdbIp" : "10.40.101.209",
57 +=======
58 + "ovsdbIp" : "127.0.0.1",
59 +>>>>>>> 6a78e2e... SONA: OpenstackSwitching - remove flows
48 "ovsdbPort" : "6640", 60 "ovsdbPort" : "6640",
49 "bridgeId" : "of:0000000000000003" 61 "bridgeId" : "of:0000000000000003"
50 } 62 }
......