diff --git a/src/easymapping/__init__.py b/src/easymapping/__init__.py index e2d6eeb..6ad8af7 100644 --- a/src/easymapping/__init__.py +++ b/src/easymapping/__init__.py @@ -90,7 +90,7 @@ class HaproxyConfigGenerator: self.label.set_data(d) # Parse each definition found. - for definition in definitions.keys(): + for definition in sorted(definitions.keys()): mode = self.label.get( self.label.create([definition, "mode"]), "http" @@ -134,7 +134,7 @@ class HaproxyConfigGenerator: "" ) - for hostname in d[host_label].split(","): + for hostname in sorted(d[host_label].split(",")): hostname = hostname.strip() self.serving_hosts.append("%s:%s" % (hostname, port)) easymapping[port]["hosts"].setdefault(hostname, {}) diff --git a/src/processor/__init__.py b/src/processor/__init__.py index 0aee377..eacebbd 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -101,10 +101,21 @@ class ProcessorInterface: class Static(ProcessorInterface): def inspect_network(self): self.parsed_object = {} - + self.static_content = None + + def get_parsed_object(self): + return self.static_content["easymapping"] if "easymapping" in self.static_content else [] + + def get_hosts(self): + hosts = [] + for object in self.get_parsed_object(): + for host in object["hosts"].keys(): + hosts.append("%s:%s" % (host, object["port"])) + return hosts + def parse(self): - static_content = yaml.load(Functions.load(self.filename), Loader=yaml.FullLoader) - self.cfg = HaproxyConfigGenerator(static_content) + self.static_content = yaml.load(Functions.load(self.filename), Loader=yaml.FullLoader) + self.cfg = HaproxyConfigGenerator(self.static_content) class Docker(ProcessorInterface): diff --git a/src/tests/expected/services-multiple-hosts.txt b/src/tests/expected/services-multiple-hosts.txt index 8c356cd..954dde1 100644 --- a/src/tests/expected/services-multiple-hosts.txt +++ b/src/tests/expected/services-multiple-hosts.txt @@ -48,15 +48,15 @@ frontend http_in_19901 mode http redirect prefix www.google.com code 301 if { hdr(host) -i google.helloworld.com } - acl is_rule_hello_com_19901_1 hdr(host) -i hello.com - acl is_rule_hello_com_19901_2 hdr(host) -i hello.com:19901 - use_backend srv_hello_com_19901 if is_rule_hello_com_19901_1 OR is_rule_hello_com_19901_2 - acl is_rule_www_helloworld_com_19901_1 hdr(host) -i www.helloworld.com acl is_rule_www_helloworld_com_19901_2 hdr(host) -i www.helloworld.com:19901 use_backend srv_www_helloworld_com_19901 if is_rule_www_helloworld_com_19901_1 OR is_rule_www_helloworld_com_19901_2 -backend srv_hello_com_19901 + acl is_rule_hello_com_19901_1 hdr(host) -i hello.com + acl is_rule_hello_com_19901_2 hdr(host) -i hello.com:19901 + use_backend srv_hello_com_19901 if is_rule_hello_com_19901_1 OR is_rule_hello_com_19901_2 + +backend srv_www_helloworld_com_19901 balance roundrobin mode http option forwardfor @@ -64,7 +64,7 @@ backend srv_hello_com_19901 http-request add-header X-Forwarded-Proto https if { ssl_fc } server srv-0 3e63154954b0:80 check weight 1 server srv-1 eb294c110eb1:80 check weight 1 -backend srv_www_helloworld_com_19901 +backend srv_hello_com_19901 balance roundrobin mode http option forwardfor diff --git a/src/tests/test_static.py b/src/tests/test_static.py index a68c2e4..c21593c 100644 --- a/src/tests/test_static.py +++ b/src/tests/test_static.py @@ -8,9 +8,58 @@ def test_processor_static(): ProcessorInterface.static_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "./fixtures/static.yml") static = ProcessorInterface.factory("static") + parsed_object = [ + { + "hosts":{ + "host1.com.br":{ + "containers":[ + "container:5000" + ], + "letsencrypt": True + }, + "host2.com.br":{ + "containers":[ + "other:3000" + ] + } + }, + "port":80, + "redirect":{ + "www.host1.com.br":"http://host1.com.br" + } + }, + { + "hosts":{ + "host1.com.br":{ + "containers":[ + "container:80" + ] + } + }, + "port":443, + "ssl": True + }, + { + "hosts":{ + "host3.com.br":{ + "containers":[ + "domain:8181" + ] + } + }, + "port":8080 + } + ] + hosts = [ + 'host1.com.br:80', + 'host2.com.br:80', + 'host1.com.br:443', + 'host3.com.br:8080' + ] + assert static.get_letsencrypt_hosts() is None - assert static.get_parsed_object() == {} - assert static.get_hosts() is None + assert static.get_parsed_object() == parsed_object + assert static.get_hosts() == hosts haproxy_cfg = static.get_haproxy_conf() @@ -18,7 +67,7 @@ def test_processor_static(): # @todo: Static doesnt populate this fields assert static.get_letsencrypt_hosts() == [] - assert static.get_parsed_object() == {} - assert static.get_hosts() == [] + assert static.get_parsed_object() == parsed_object + assert static.get_hosts() == hosts # test_processor_static() \ No newline at end of file