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
 

Reply via email to