From b7ac434d41b0db29f5453f2d113f4668380272f9 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 7 Jun 2016 19:35:07 -0700 Subject: [PATCH] GUACAMOLE-53: Add session affinity attribute for connection groups. --- .../connectiongroup/ConnectionGroupModel.java | 30 +++++++++++++++++ .../ModeledConnectionGroup.java | 23 +++++++++++-- .../src/main/resources/translations/en.json | 1 + .../schema/001-create-schema.sql | 2 ++ .../schema/upgrade/upgrade-pre-0.9.10.sql | 7 ++++ .../connectiongroup/ConnectionGroupMapper.xml | 33 +++++++++++-------- .../schema/001-create-schema.sql | 1 + .../schema/upgrade/upgrade-pre-0.9.10.sql | 7 ++++ .../connectiongroup/ConnectionGroupMapper.xml | 33 +++++++++++-------- 9 files changed, 108 insertions(+), 29 deletions(-) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupModel.java index 1aedfe07a..6805ef2a5 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupModel.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupModel.java @@ -54,6 +54,12 @@ public class ConnectionGroupModel extends GroupedObjectModel { */ private Integer maxConnectionsPerUser; + /** + * Whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + */ + private boolean sessionAffinityEnabled; + /** * Creates a new, empty connection group. */ @@ -156,6 +162,30 @@ public class ConnectionGroupModel extends GroupedObjectModel { this.maxConnectionsPerUser = maxConnectionsPerUser; } + /** + * Returns whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + * + * @return + * Whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + */ + public boolean isSessionAffinityEnabled() { + return sessionAffinityEnabled; + } + + /** + * Sets whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + * + * @param sessionAffinityEnabled + * Whether individual users should be consistently assigned the same + * connection within a balancing group until they log out. + */ + public void setSessionAffinityEnabled(boolean sessionAffinityEnabled) { + this.sessionAffinityEnabled = sessionAffinityEnabled; + } + @Override public String getIdentifier() { diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ModeledConnectionGroup.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ModeledConnectionGroup.java index 5ee058007..85f6cec6d 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ModeledConnectionGroup.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ModeledConnectionGroup.java @@ -26,11 +26,12 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; -import org.apache.guacamole.auth.jdbc.connection.ConnectionService; -import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.jdbc.JDBCEnvironment; import org.apache.guacamole.auth.jdbc.base.ModeledGroupedDirectoryObject; +import org.apache.guacamole.auth.jdbc.connection.ConnectionService; +import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService; +import org.apache.guacamole.form.BooleanField; import org.apache.guacamole.form.Field; import org.apache.guacamole.form.Form; import org.apache.guacamole.form.NumericField; @@ -67,13 +68,21 @@ public class ModeledConnectionGroup extends ModeledGroupedDirectoryObjectasList( new NumericField(MAX_CONNECTIONS_NAME), - new NumericField(MAX_CONNECTIONS_PER_USER_NAME) + new NumericField(MAX_CONNECTIONS_PER_USER_NAME), + new BooleanField(ENABLE_SESSION_AFFINITY, "true") )); /** @@ -168,6 +177,10 @@ public class ModeledConnectionGroup extends ModeledGroupedDirectoryObject - - - - + + + - - + + + @@ -79,7 +80,8 @@ parent_id, type, max_connections, - max_connections_per_user + max_connections_per_user, + enable_session_affinity FROM guacamole_connection_group WHERE connection_group_id IN parent_id = #{parentIdentifier,jdbcType=VARCHAR} @@ -144,14 +148,16 @@ parent_id, type, max_connections, - max_connections_per_user + max_connections_per_user, + enable_session_affinity ) VALUES ( #{object.name,jdbcType=VARCHAR}, #{object.parentIdentifier,jdbcType=VARCHAR}, #{object.type,jdbcType=VARCHAR}, #{object.maxConnections,jdbcType=INTEGER}, - #{object.maxConnectionsPerUser,jdbcType=INTEGER} + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} ) @@ -163,8 +169,9 @@ parent_id = #{object.parentIdentifier,jdbcType=VARCHAR}, type = #{object.type,jdbcType=VARCHAR}, max_connections = #{object.maxConnections,jdbcType=INTEGER}, - max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER} + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + enable_session_affinity = #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER} - \ No newline at end of file + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/001-create-schema.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/001-create-schema.sql index a5543b25e..3a84ba54f 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/001-create-schema.sql +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/001-create-schema.sql @@ -63,6 +63,7 @@ CREATE TABLE guacamole_connection_group ( -- Concurrency limits max_connections integer, max_connections_per_user integer, + enable_session_affinity boolean NOT NULL DEFAULT FALSE, PRIMARY KEY (connection_group_id), diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.10.sql b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.10.sql index c1f0e8bc3..baaa4ff93 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.10.sql +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/schema/upgrade/upgrade-pre-0.9.10.sql @@ -88,3 +88,10 @@ ALTER TABLE guacamole_connection_history FOREIGN KEY (connection_id) REFERENCES guacamole_connection (connection_id) ON DELETE SET NULL; +-- +-- Add session affinity column +-- + +ALTER TABLE guacamole_connection_group + ADD COLUMN enable_session_affinity boolean NOT NULL DEFAULT FALSE; + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml index 24c8a841d..b55c01592 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml @@ -25,13 +25,14 @@ - - - - + + + - - + + + @@ -79,7 +80,8 @@ parent_id, type, max_connections, - max_connections_per_user + max_connections_per_user, + enable_session_affinity FROM guacamole_connection_group WHERE connection_group_id IN parent_id = #{parentIdentifier,jdbcType=INTEGER}::integer @@ -144,14 +148,16 @@ parent_id, type, max_connections, - max_connections_per_user + max_connections_per_user, + enable_session_affinity ) VALUES ( #{object.name,jdbcType=VARCHAR}, #{object.parentIdentifier,jdbcType=INTEGER}::integer, #{object.type,jdbcType=VARCHAR}::guacamole_connection_group_type, #{object.maxConnections,jdbcType=INTEGER}, - #{object.maxConnectionsPerUser,jdbcType=INTEGER} + #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} ) @@ -163,8 +169,9 @@ parent_id = #{object.parentIdentifier,jdbcType=INTEGER}::integer, type = #{object.type,jdbcType=VARCHAR}::guacamole_connection_group_type, max_connections = #{object.maxConnections,jdbcType=INTEGER}, - max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER} + max_connections_per_user = #{object.maxConnectionsPerUser,jdbcType=INTEGER}, + enable_session_affinity = #{object.sessionAffinityEnabled,jdbcType=BOOLEAN} WHERE connection_group_id = #{object.objectID,jdbcType=INTEGER}::integer - \ No newline at end of file +