diff --git a/systemvm/patches/debian/config/opt/cloud/bin/cs_forwardingrules.py b/systemvm/patches/debian/config/opt/cloud/bin/cs_forwardingrules.py index d2bba819e0a..0a4eef671e4 100644 --- a/systemvm/patches/debian/config/opt/cloud/bin/cs_forwardingrules.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs_forwardingrules.py @@ -5,29 +5,56 @@ def merge(dbag, rules): source_ip = rule["source_ip_address"] destination_ip = rule["destination_ip_address"] revoke = rule["revoke"] + + newrule = dict() + newrule["public_ip"] = source_ip + newrule["internal_ip"] = destination_ip + + if rules["type"] == "staticnatrules": + newrule["type"] = "staticnat" + elif rules["type"] == "forwardrules": + newrule["type"] = "forward" + newrule["public_ports"] = rule["source_port_range"] + newrule["internal_ports"] = rule["destination_port_range"] + newrule["protocol"] = rule["protocol"] + if not revoke: if rules["type"] == "staticnatrules": - snatrule = dict() - snatrule["type"] = "staticnat" - snatrule["public_ip"] = source_ip - snatrule["internal_ip"] = destination_ip - dbag[source_ip] = ( snatrule ) + dbag[source_ip] = [ newrule ] elif rules["type"] == "forwardrules": - pfrule = dict() - pfrule["type"] = "forward" - pfrule["public_ip"] = source_ip - pfrule["public_ports"] = rule["source_port_range"] - pfrule["internal_ip"] = destination_ip - pfrule["interal_ports"] = rule["destination_port_range"] - pfrule["prootocol"] = rule["protocol"] + index = -1 if source_ip in dbag.keys(): for forward in dbag[source_ip]: - print "find duplicate here" + if ruleCompare(forward, newrule): + index = dbag[source_ip].index(forward) + if not index == -1: + dbag[source_ip][index] = newrule + else: + dbag[source_ip].append(newrule) else: - dbag[source_ip] = ( pfrule ) - elif revoke: + dbag[source_ip] = [ newrule ] + else: if rules["type"] == "staticnatrules": if source_ip in dbag.keys(): del dbag[source_ip] - + elif rules["type"] == "forwardrules": + if source_ip in dbag.keys(): + index = -1 + for forward in dbag[source_ip]: + if ruleCompare(forward, newrule): + index = dbag[source_ip].index(forward) + print "removing index %s" % str(index) + if not index == -1: + del dbag[source_ip][index] + + return dbag + +# Compare function checks only the public side, those must be equal the internal details could change +def ruleCompare(ruleA, ruleB): + if not ruleA["type"] == ruleB["type"]: + return False + if ruleA["type"] == "staticnat": + return ruleA["public_ip"] == ruleB["public_ip"] + elif ruleA["type"] == "forward": + return ruleA["public_ip"] == ruleB["public_ip"] and ruleA["public_ports"] == ruleB["public_ports"] and ruleA["protocol"] == ruleB["protocol"] \ No newline at end of file diff --git a/systemvm/patches/debian/config/opt/cloud/bin/merge.py b/systemvm/patches/debian/config/opt/cloud/bin/merge.py index 69cf75d5ef0..00b3ee6ba8e 100755 --- a/systemvm/patches/debian/config/opt/cloud/bin/merge.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/merge.py @@ -65,7 +65,10 @@ class updateDataBag: def process(self): self.db = dataBag() - self.db.setKey( self.qFile.type ) + if ( self.qFile.type == "staticnatrules" or self.qFile.type == "forwardrules"): + self.db.setKey("forwardingrules") + else: + self.db.setKey( self.qFile.type ) dbag = self.db.load( ) logging.info("Command of type %s received", self.qFile.type)