diff --git a/lib/puppet/provider/proxy_mysql_server/proxysql.rb b/lib/puppet/provider/proxy_mysql_server/proxysql.rb index 7e022e1a..66c5e5eb 100644 --- a/lib/puppet/provider/proxy_mysql_server/proxysql.rb +++ b/lib/puppet/provider/proxy_mysql_server/proxysql.rb @@ -14,12 +14,18 @@ def self.instances # one big swoop. servers.each do |line| hostname, port, hostgroup_id = line.split(%r{\t}) - query = 'SELECT `hostname`, `port`, `hostgroup_id`, `status`, `weight`, `compression`, ' - query << ' `max_connections`, `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment` ' + query = 'SELECT `hostname`, `port`, `hostgroup_id`, ' + if has_gtid_tracking? + query << ' `gtid_port`, ' + else + query << " NULL AS 'gtid_port', " + end + query << ' `status`, `weight`, `compression`, `max_connections`, ' + query << ' `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment` ' query << ' FROM `mysql_servers`' query << " WHERE `hostname` = '#{hostname}' AND `port` = #{port} AND `hostgroup_id` = '#{hostgroup_id}'" - @hostname, @port, @hostgroup_id, @status, @weight, @compression, + @hostname, @port, @hostgroup_id, @gtid_port, @status, @weight, @compression, @max_connections, @max_replication_lag, @use_ssl, @max_latency_ms, @comment = mysql([defaults_file, '-NBe', query].compact).chomp.split(%r{\t}) name = "#{hostname}:#{port}-#{hostgroup_id}" @@ -29,6 +35,7 @@ def self.instances ensure: :present, hostname: @hostname, port: @port, + gtid_port: @gtid_port, hostgroup_id: @hostgroup_id, status: @status, weight: @weight, @@ -57,6 +64,7 @@ def create _name = @resource[:name] hostname = @resource.value(:hostname) port = @resource.value(:port) || 3306 + gtid_port = @resource.value(:gtid_port) hostgroup_id = @resource.value(:hostgroup_id) || 0 status = @resource.value(:status) || 'ONLINE' weight = @resource.value(:weight) || 1 @@ -67,10 +75,14 @@ def create max_latency_ms = @resource.value(:max_latency_ms) || 0 comment = @resource.value(:comment) || '' - query = 'INSERT INTO mysql_servers (`hostname`, `port`, `hostgroup_id`, `status`, `weight`, `compression`, ' - query << ' `max_connections`, `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment`)' - query << " VALUES ('#{hostname}', #{port}, #{hostgroup_id}, '#{status}', #{weight}, #{compression}, " - query << " #{max_connections}, #{max_replication_lag}, #{use_ssl}, #{max_latency_ms}, '#{comment}')" + query = 'INSERT INTO mysql_servers (`hostname`, `port`, `hostgroup_id`, ' + query << ' `gtid_port`, ' if has_gtid_tracking? + query << ' `status`, `weight`, `compression`, `max_connections`, ' + query << ' `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment`)' + query << " VALUES ('#{hostname}', #{port}, #{hostgroup_id}, " + query << " #{gtid_port}, " if has_gtid_tracking? + query << " '#{status}', #{weight}, #{compression}, #{max_connections}, " + query << " #{max_replication_lag}, #{use_ssl}, #{max_latency_ms}, '#{comment}')" mysql([defaults_file, '-e', query].compact) @property_hash[:ensure] = :present @@ -164,4 +176,8 @@ def max_latency_ms=(value) def comment=(value) @property_flush[:comment] = value end + + def gtid_port=(value) + @property_flush[:gtid_port] = value + end end diff --git a/lib/puppet/provider/proxy_mysql_server_no_hostgroup/proxysql.rb b/lib/puppet/provider/proxy_mysql_server_no_hostgroup/proxysql.rb index feb336e0..037dc5c7 100644 --- a/lib/puppet/provider/proxy_mysql_server_no_hostgroup/proxysql.rb +++ b/lib/puppet/provider/proxy_mysql_server_no_hostgroup/proxysql.rb @@ -14,12 +14,18 @@ def self.instances # one big swoop. servers.each do |line| hostname, port = line.split(%r{\t}) - query = 'SELECT `hostname`, `port`, `hostgroup_id`, `status`, `weight`, `compression`, ' - query << ' `max_connections`, `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment` ' + query = 'SELECT `hostname`, `port`, `hostgroup_id`, ' + if has_gtid_tracking? + query << ' `gtid_port`, ' + else + query << " NULL AS 'gtid_port', " + end + query << ' `status`, `weight`, `compression`, `max_connections`, ' + query << ' `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment` ' query << ' FROM `mysql_servers`' query << " WHERE `hostname` = '#{hostname}' AND `port` = #{port}" - @hostname, @port, @hostgroup_id, @status, @weight, @compression, + @hostname, @port, @hostgroup_id, @gtid_port, @status, @weight, @compression, @max_connections, @max_replication_lag, @use_ssl, @max_latency_ms, @comment = mysql([defaults_file, '-NBe', query].compact).chomp.split(%r{\t}) name = "#{hostname}:#{port}" @@ -29,6 +35,7 @@ def self.instances ensure: :present, hostname: @hostname, port: @port, + gtid_port: @gtid_port, hostgroup_id: @hostgroup_id, status: @status, weight: @weight, @@ -57,6 +64,7 @@ def create _name = @resource[:name] hostname = @resource.value(:hostname) port = @resource.value(:port) || 3306 + gtid_port = @resource.value(:gtid_port) hostgroup_id = @resource.value(:hostgroup_id) || 0 status = @resource.value(:status) || 'ONLINE' weight = @resource.value(:weight) || 1 @@ -67,10 +75,14 @@ def create max_latency_ms = @resource.value(:max_latency_ms) || 0 comment = @resource.value(:comment) || '' - query = 'INSERT INTO mysql_servers (`hostname`, `port`, `hostgroup_id`, `status`, `weight`, `compression`, ' - query << ' `max_connections`, `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment`)' - query << " VALUES ('#{hostname}', #{port}, #{hostgroup_id}, '#{status}', #{weight}, #{compression}, " - query << " #{max_connections}, #{max_replication_lag}, #{use_ssl}, #{max_latency_ms}, '#{comment}')" + query = 'INSERT INTO mysql_servers (`hostname`, `port`, `hostgroup_id`, ' + query << ' `gtid_port`, ' if has_gtid_tracking? + query << ' `status`, `weight`, `compression`, `max_connections`, ' + query << ' `max_replication_lag`, `use_ssl`, `max_latency_ms`, `comment`)' + query << " VALUES ('#{hostname}', #{port}, #{hostgroup_id}, " + query << " #{gtid_port}, " if has_gtid_tracking? + query << " '#{status}', #{weight}, #{compression}, #{max_connections}, " + query << " #{max_replication_lag}, #{use_ssl}, #{max_latency_ms}, '#{comment}')" mysql([defaults_file, '-e', query].compact) @property_hash[:ensure] = :present @@ -163,4 +175,8 @@ def max_latency_ms=(value) def comment=(value) @property_flush[:comment] = value end + + def gtid_port=(value) + @property_flush[:gtid_port] = value + end end diff --git a/lib/puppet/provider/proxysql.rb b/lib/puppet/provider/proxysql.rb index aba113e3..e8a23089 100644 --- a/lib/puppet/provider/proxysql.rb +++ b/lib/puppet/provider/proxysql.rb @@ -16,6 +16,15 @@ def defaults_file self.class.defaults_file end + # Check if we're running a version of ProxySQL that supports GTID tracking + def self.has_gtid_tracking? + Facter.value(:proxysql_version) && Puppet::Util::Package.versioncmp(Facter.value(:proxysql_version), '2.0.1') >= 0 + end + + def has_gtid_tracking? + self.class.has_gtid_tracking? + end + def make_sql_value(value) if value.nil? 'NULL' diff --git a/lib/puppet/type/proxy_mysql_server.rb b/lib/puppet/type/proxy_mysql_server.rb index 70886b71..b25308f1 100644 --- a/lib/puppet/type/proxy_mysql_server.rb +++ b/lib/puppet/type/proxy_mysql_server.rb @@ -49,6 +49,11 @@ newvalue(%r{\d+}) end + newproperty(:gtid_port) do + desc 'the backend server port where ProxySQL Binlog Reader listens on for GTID tracking. ProxySQL 2.0+ only.' + newvalue(%r{\d+}) + end + newproperty(:status) do desc 'Server status.' newvalues(:ONLINE, :SHUNNED, :OFFLINE_SOFT, :OFFLINE_HARD) diff --git a/lib/puppet/type/proxy_mysql_server_no_hostgroup.rb b/lib/puppet/type/proxy_mysql_server_no_hostgroup.rb index c082d2f7..b6924c52 100644 --- a/lib/puppet/type/proxy_mysql_server_no_hostgroup.rb +++ b/lib/puppet/type/proxy_mysql_server_no_hostgroup.rb @@ -49,6 +49,11 @@ newvalue(%r{\d+}) end + newproperty(:gtid_port) do + desc 'the backend server port where ProxySQL Binlog Reader listens on for GTID tracking. ProxySQL 2.0+ only.' + newvalue(%r{\d+}) + end + newproperty(:status) do desc 'Server status.' newvalues(:ONLINE, :SHUNNED, :OFFLINE_SOFT, :OFFLINE_HARD) diff --git a/types/server.pp b/types/server.pp index cb486ebf..c6dabcb9 100644 --- a/types/server.pp +++ b/types/server.pp @@ -1,6 +1,7 @@ # lint:ignore:2sp_soft_tabs type Proxysql::Server = Array[Hash[String, Struct[{ Optional[port] => Integer, hostgroup_id => Integer, + Optional[gtid_port] => Integer, Optional[status] => String[1], Optional[weight] => Integer, Optional[compression] => Integer, @@ -9,4 +10,4 @@ Optional[use_ssl] => Integer[0,1], Optional[max_latency_ms] => Integer, Optional[comment] => String[1], }],1,1]] -# lint:endignore +# lint:endignore