Repository: stratos Updated Branches: refs/heads/stratos-4.1.x 3dc77999b -> 45ce6596c
adding complete template support for nginf.cfg Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/9051bdd4 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/9051bdd4 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/9051bdd4 Branch: refs/heads/stratos-4.1.x Commit: 9051bdd408584923aad9c042801f6c66263a3d39 Parents: bf5b715 Author: reka <[email protected]> Authored: Wed Sep 30 10:17:19 2015 +0530 Committer: reka <[email protected]> Committed: Wed Sep 30 10:18:20 2015 +0530 ---------------------------------------------------------------------- .../nginx/extension/NginxConfigWriter.java | 93 ++++++++++++++++---- .../src/main/templates/nginx.cfg.template | 46 +++++++++- 2 files changed, 119 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/9051bdd4/extensions/load-balancer/modules/nginx-extension/src/main/java/org/apache/stratos/nginx/extension/NginxConfigWriter.java ---------------------------------------------------------------------- diff --git a/extensions/load-balancer/modules/nginx-extension/src/main/java/org/apache/stratos/nginx/extension/NginxConfigWriter.java b/extensions/load-balancer/modules/nginx-extension/src/main/java/org/apache/stratos/nginx/extension/NginxConfigWriter.java index 11521bd..8617d13 100644 --- a/extensions/load-balancer/modules/nginx-extension/src/main/java/org/apache/stratos/nginx/extension/NginxConfigWriter.java +++ b/extensions/load-balancer/modules/nginx-extension/src/main/java/org/apache/stratos/nginx/extension/NginxConfigWriter.java @@ -31,9 +31,8 @@ import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.lang.reflect.Array; +import java.util.*; /** * Nginx load balancer configuration writer. @@ -59,11 +58,7 @@ public class NginxConfigWriter { } public boolean write(Topology topology) { - - StringBuilder configurationBuilder = new StringBuilder(); - List<Port> availablePorts = new ArrayList<Port>(); - for (Service service : topology.getServices()) { for (Cluster cluster : service.getClusters()) { if ((service.getPorts() == null) || (service.getPorts().size() == 0)) { @@ -109,27 +104,36 @@ public class NginxConfigWriter { } } + //Constructing the port list + List<Map<String, String>> portList = new ArrayList<Map<String, String>>(); + Map<String, String> portMap; + + Map<String, Map<String, List>> hostnameToPortMap = new HashMap<String, Map<String, List>>(); + for (Port availPort : availablePorts) { - // Start transport block - configurationBuilder.append("http").append(" {").append(NEW_LINE); - configurationBuilder.append(TAB).append("server_names_hash_bucket_size "). - append(System.getProperty("nginx.server.names.hash.bucket.size")). - append(";").append(NEW_LINE); + portMap = new HashMap<String, String>(); + portMap.put("proxy", String.valueOf(availPort.getProxy())); + portMap.put("protocol", availPort.getProtocol()); + portMap.put("value", String.valueOf(availPort.getValue())); + portList.add(portMap); + + for (Service service : topology.getServices()) { for (Cluster cluster : service.getClusters()) { + Map<String, List> existingHostNameToServerMap = hostnameToPortMap. + get(String.valueOf(availPort.getProxy())); + if(existingHostNameToServerMap == null) { + existingHostNameToServerMap = new HashMap<String, List>(); + } if ((service.getPorts() == null) || (service.getPorts().size() == 0)) { throw new RuntimeException(String.format("No ports found in service: %s", service.getServiceName())); } - generateConfigurationForCluster(cluster, availPort, configurationBuilder); + generateConfigurationForCluster(cluster, availPort, existingHostNameToServerMap); + hostnameToPortMap.put(String.valueOf(availPort.getProxy()), existingHostNameToServerMap); } } - configurationBuilder.append("}").append(NEW_LINE); - if (log.isDebugEnabled()) { - log.debug("The generated niginx.conf is: \n" + configurationBuilder.toString()); - } - // End transport block } @@ -143,7 +147,8 @@ public class NginxConfigWriter { // Insert strings into the template VelocityContext context = new VelocityContext(); - context.put("configuration", configurationBuilder.toString()); + context.put("portlist", portList); + context.put("servermap", hostnameToPortMap); // Create a new string from the template StringWriter stringWriter = new StringWriter(); @@ -168,6 +173,56 @@ public class NginxConfigWriter { } } + private void generateConfigurationForCluster(Cluster cluster, Port availPort, Map<String, List> existingHostNameToServerMap) { + for (String hostname : cluster.getHostNames()) { + boolean memberFound = false; + //Checking whether at-least one member is available to create + // the upstream and server blocks + for (Member member : cluster.getMembers()) { + Collection<Port> ports = member.getPorts(); + for (Port port : ports) { + if ((port.getProtocol().equals(availPort.getProtocol())) && + (port.getProxy() == availPort.getProxy())) { + memberFound = true; + break; + } + } + if(memberFound) { + break; + } + } + if(memberFound) { + for (Member member : cluster.getMembers()) { + Port selectedPort = null; + Collection<Port> ports = member.getPorts(); + for (Port port : ports) { + if ((port.getProtocol().equals(availPort.getProtocol())) && + (port.getProxy() == availPort.getProxy())) { + selectedPort = port; + break; + } + } + + if (selectedPort != null) { + if (log.isDebugEnabled()) { + log.debug("The selected Port for cluster: " + cluster.getClusterId() + + " is " + selectedPort.getValue() + " " + + selectedPort.getProtocol() + " " + selectedPort.getProxy()); + } + if(existingHostNameToServerMap.get(hostname) == null) { + List<String> serverList = new ArrayList<String>(); + existingHostNameToServerMap.put(hostname, serverList); + } + // Start upstream server block + existingHostNameToServerMap.get(hostname).add(member.getHostName() + ":" + + selectedPort.getValue()); + + } + } + } + } + } + /** * Generate configuration for a cluster with the following format: * <p/> http://git-wip-us.apache.org/repos/asf/stratos/blob/9051bdd4/extensions/load-balancer/modules/nginx-extension/src/main/templates/nginx.cfg.template ---------------------------------------------------------------------- diff --git a/extensions/load-balancer/modules/nginx-extension/src/main/templates/nginx.cfg.template b/extensions/load-balancer/modules/nginx-extension/src/main/templates/nginx.cfg.template index 54f9648..3d4bbd7 100644 --- a/extensions/load-balancer/modules/nginx-extension/src/main/templates/nginx.cfg.template +++ b/extensions/load-balancer/modules/nginx-extension/src/main/templates/nginx.cfg.template @@ -2,7 +2,51 @@ events { worker_connections 1024; } -$configuration +#foreach( $port in $portlist ) +http { + server_names_hash_bucket_size 128; +#set( $hostnameServerMap = $servermap.get($port.proxy) ) +#foreach( $hostname in $hostnameServerMap.keySet() ) + upstream $hostname { + ## Uncomment below when sticky secession is needed by particular server + ##if( $$hostname == "group-scaling.my-c3-group2.stratos.apache.org" ) + ## sticky; + ###end + #set ($servers = $hostnameServerMap.get($hostname) ) + #foreach ( $server in $servers) + server $server; + #end + } + server { + #if ($port.protocol == "https") + listen $port.proxy ssl; + #else + listen $port.proxy; + #end + server_name $hostname; + location / { + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Server $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_read_timeout 5m; + proxy_send_timeout 5m; + proxy_pass http://$hostname; + } + location /nginx_status { + stub_status on; + access_log off; + allow 127.0.0.1; + deny all; + } + #if ($port.protocol == "https") + ssl on; + ssl_certificate /etc/nginx/ssl/server.cert; + ssl_certificate_key /etc/nginx/ssl/server.key; + #end +#end +} +#end
