Fix: do not install unnecessary rules for stateful SNAT case
Change-Id: I4493db87193982e5d02f77711bca96ba4f7daa69
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
index febcb7a..115f66c 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
@@ -29,6 +29,7 @@
import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
import org.onosproject.openstacknetworking.api.OpenstackSecurityGroupAdminService;
import org.onosproject.openstacknetworking.impl.OpenstackRoutingArpHandler;
+import org.onosproject.openstacknetworking.impl.OpenstackRoutingSnatHandler;
import org.onosproject.openstacknetworking.impl.OpenstackSecurityGroupHandler;
import org.onosproject.openstacknetworking.impl.OpenstackSwitchingArpHandler;
import org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil;
@@ -61,6 +62,7 @@
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkActivationFlag;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkArpMode;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValueAsBoolean;
import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
@@ -76,6 +78,7 @@
private static final String FLOATINGIPS = "floatingips";
private static final String ARP_MODE_NAME = "arpMode";
private static final String USE_SECURITY_GROUP_NAME = "useSecurityGroup";
+ private static final String USE_STATEFUL_SNAT_NAME = "useStatefulSnat";
private static final long SLEEP_MS = 3000; // we wait 3s for init each node
private static final long TIMEOUT_MS = 10000; // we wait 10s
@@ -83,6 +86,7 @@
private static final String DEVICE_OWNER_IFACE = "network:router_interface";
private static final String ARP_MODE_REQUIRED = "ARP mode is not specified";
+ private static final String STATEFUL_SNAT_REQUIRED = "Stateful SNAT flag nis not specified";
private static final String SECURITY_GROUP_FLAG_REQUIRED = "Security Group flag is not specified";
@@ -273,6 +277,39 @@
}
/**
+ * Configures the stateful SNAT flag (enable | disable).
+ *
+ * @param statefulSnat stateful SNAT flag
+ * @return 200 OK with config result, 404 not found
+ */
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("config/statefulSnat/{statefulSnat}")
+ public Response configStatefulSnat(@PathParam("statefulSnat") String statefulSnat) {
+ String statefulSnatStr = nullIsIllegal(statefulSnat, STATEFUL_SNAT_REQUIRED);
+ boolean flag = checkActivationFlag(statefulSnatStr);
+ configStatefulSnatBase(flag);
+
+ ComponentConfigService service = get(ComponentConfigService.class);
+ String snatComponent = OpenstackRoutingSnatHandler.class.getName();
+
+ while (true) {
+ boolean snatValue =
+ getPropertyValueAsBoolean(
+ service.getProperties(snatComponent), USE_STATEFUL_SNAT_NAME);
+
+ if (flag == snatValue) {
+ break;
+ }
+ }
+
+ purgeRulesBase();
+ syncRulesBase();
+
+ return ok(mapper().createObjectNode()).build();
+ }
+
+ /**
* Configures the security group (enable | disable).
*
* @param securityGroup security group activation flag
@@ -433,4 +470,11 @@
service.setProperty(switchingComponent, ARP_MODE_NAME, arpMode);
service.setProperty(routingComponent, ARP_MODE_NAME, arpMode);
}
+
+ private void configStatefulSnatBase(boolean snatFlag) {
+ ComponentConfigService service = get(ComponentConfigService.class);
+ String snatComponent = OpenstackRoutingSnatHandler.class.getName();
+
+ service.setProperty(snatComponent, USE_STATEFUL_SNAT_NAME, String.valueOf(snatFlag));
+ }
}