15
15
# limitations under the License.
16
16
#
17
17
18
+ require_relative './redis_uri'
19
+ require_relative '../../package/libraries/helpers/new_redis_helper'
20
+
18
21
module GitlabWorkhorse
19
22
class << self
20
23
def parse_variables
@@ -30,13 +33,123 @@ def parse_variables
30
33
network = user_network || default_network
31
34
32
35
Gitlab [ 'gitlab_workhorse' ] [ 'listen_addr' ] ||= File . join ( sockets_dir , 'socket' ) if network == "unix"
36
+
37
+ parse_redis_settings
33
38
end
34
39
35
40
def parse_secrets
36
41
# gitlab-workhorse expects exactly 32 bytes, encoded with base64
37
42
Gitlab [ 'gitlab_workhorse' ] [ 'secret_token' ] ||= SecureRandom . base64 ( 32 )
38
43
end
39
44
45
+ def parse_redis_settings
46
+ gitlab_workhorse_redis_configured = Gitlab [ 'gitlab_workhorse' ] . key? ( 'redis_socket' ) ||
47
+ Gitlab [ 'gitlab_workhorse' ] . key? ( 'redis_host' )
48
+
49
+ rails_workhorse_redis_configured =
50
+ Gitlab [ 'gitlab_rails' ] [ 'redis_workhorse_instance' ] ||
51
+ ( Gitlab [ 'gitlab_rails' ] [ 'redis_workhorse_sentinels' ] &&
52
+ !Gitlab [ 'gitlab_rails' ] [ 'redis_workhorse_sentinels' ] . empty? )
53
+
54
+ if gitlab_workhorse_redis_configured
55
+ # Parse settings from `redis['master_*']` first.
56
+ parse_redis_master_settings
57
+ # If gitlab_workhorse settings are specified, populate
58
+ # gitlab_rails['redis_workhorse_*'] settings from it.
59
+ update_separate_redis_instance_settings
60
+ elsif rails_workhorse_redis_configured
61
+ # If user has specified a separate Redis host for Workhorse via
62
+ # `gitlab_rails['redis_workhorse_*']` settings, copy them to
63
+ # `gitlab_workhorse['redis_*']`.
64
+ parse_separate_redis_instance_settings
65
+ parse_redis_master_settings
66
+ else
67
+ # If user hasn't specified any separate Redis settings for Workhorse,
68
+ # copy the global settings from GitLab Rails
69
+ parse_global_rails_redis_settings
70
+ parse_redis_master_settings
71
+ end
72
+ end
73
+
74
+ # rubocop:disable Metrics/CyclomaticComplexity
75
+ # rubocop:disable Metrics/AbcSize
76
+ # rubocop:disable Metrics/PerceivedComplexity
77
+ def update_separate_redis_instance_settings
78
+ if Gitlab [ 'gitlab_workhorse' ] [ 'redis_host' ]
79
+ uri_from_workhorse = NewRedisHelper . build_redis_url (
80
+ ssl : Gitlab [ 'gitlab_workhorse' ] [ 'redis_ssl' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_workhorse' ] [ 'redis_ssl' ] ,
81
+ host : Gitlab [ 'gitlab_workhorse' ] [ 'redis_host' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_workhorse' ] [ 'redis_host' ] ,
82
+ port : Gitlab [ 'gitlab_workhorse' ] [ 'redis_port' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_workhorse' ] [ 'redis_port' ] ,
83
+ password : Gitlab [ 'gitlab_workhorse' ] [ 'redis_password' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_workhorse' ] [ 'redis_password' ] ,
84
+ path : Gitlab [ 'gitlab_workhorse' ] [ 'redis_database' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_workhorse' ] [ 'redis_database' ]
85
+ ) . to_s
86
+
87
+ uri_from_rails = NewRedisHelper . build_redis_url (
88
+ ssl : Gitlab [ 'gitlab_rails' ] [ 'redis_ssl' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_rails' ] [ 'redis_ssl' ] ,
89
+ host : Gitlab [ 'gitlab_rails' ] [ 'redis_host' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_rails' ] [ 'redis_host' ] ,
90
+ port : Gitlab [ 'gitlab_rails' ] [ 'redis_port' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_rails' ] [ 'redis_port' ] ,
91
+ password : Gitlab [ 'gitlab_rails' ] [ 'redis_password' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_rails' ] [ 'redis_password' ] ,
92
+ path : Gitlab [ 'gitlab_rails' ] [ 'redis_database' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_rails' ] [ 'redis_database' ]
93
+ ) . to_s
94
+ Gitlab [ 'gitlab_rails' ] [ 'redis_workhorse_instance' ] = uri_from_workhorse if uri_from_workhorse != uri_from_rails
95
+
96
+ else
97
+ workhorse_redis_socket = Gitlab [ 'gitlab_workhorse' ] [ 'redis_socket' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_workhorse' ] [ 'redis_socket' ]
98
+ rails_redis_socket = Gitlab [ 'gitlab_rails' ] [ 'redis_socket' ] || Gitlab [ 'node' ] [ 'gitlab' ] [ 'gitlab_rails' ] [ 'redis_socket' ]
99
+ Gitlab [ 'gitlab_rails' ] [ 'redis_workhorse_instance' ] = "unix://#{ workhorse_redis_socket } " if workhorse_redis_socket != rails_redis_socket
100
+ end
101
+
102
+ %w[ username password cluster_nodes sentinels sentinel_master sentinels_password ] . each do |setting |
103
+ Gitlab [ 'gitlab_rails' ] [ "redis_workhorse_#{ setting } " ] ||= Gitlab [ 'gitlab_workhorse' ] [ "redis_#{ setting } " ]
104
+ end
105
+ end
106
+ # rubocop:enable Metrics/CyclomaticComplexity
107
+ # rubocop:enable Metrics/AbcSize
108
+ # rubocop:enable Metrics/PerceivedComplexity
109
+
110
+ def parse_global_rails_redis_settings
111
+ %w[ ssl host socket port password database sentinels sentinels_password ] . each do |setting |
112
+ Gitlab [ 'gitlab_workhorse' ] [ "redis_#{ setting } " ] ||= Gitlab [ 'gitlab_rails' ] [ "redis_#{ setting } " ]
113
+ end
114
+ end
115
+
116
+ def parse_separate_redis_instance_settings
117
+ # If an individual Redis instance is specified for Workhorse, figure out
118
+ # host, port, password, etc. from it
119
+ if Gitlab [ 'gitlab_rails' ] [ 'redis_workhorse_instance' ]
120
+ uri = URI ( Gitlab [ 'gitlab_rails' ] [ 'redis_workhorse_instance' ] )
121
+
122
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_ssl' ] = uri . scheme == 'rediss' unless Gitlab [ 'gitlab_workhorse' ] . key? ( 'redis_ssl' )
123
+ if uri . scheme == 'unix'
124
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_socket' ] = uri . path
125
+ else
126
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_host' ] ||= if uri . path . start_with? ( '/' )
127
+ uri . host
128
+ else
129
+ uri . path
130
+ end
131
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_port' ] ||= uri . port
132
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_password' ] ||= uri . password
133
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_database' ] ||= uri . path . delete_prefix ( '/' ) if uri . path . start_with? ( '/' )
134
+ end
135
+ end
136
+
137
+ %w[ username password cluster_nodes sentinels sentinel_master sentinels_password ] . each do |setting |
138
+ Gitlab [ 'gitlab_workhorse' ] [ "redis_#{ setting } " ] ||= Gitlab [ 'gitlab_rails' ] [ "redis_workhorse_#{ setting } " ]
139
+ end
140
+ end
141
+
142
+ def parse_redis_master_settings
143
+ # TODO: When GitLab rails gets it's own set if `redis_sentinel_master_*`
144
+ # settings, update the following to use them instead of
145
+ # `Gitlab['redis'][*]` settings. It can be then merged with
146
+ # `parse_rails_redis_settings` method
147
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_sentinel_master' ] ||= Gitlab [ 'redis' ] [ 'master_name' ] || Gitlab [ :node ] [ 'redis' ] [ 'master_name' ]
148
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_sentinel_master_ip' ] ||= Gitlab [ 'redis' ] [ 'master_ip' ] || Gitlab [ :node ] [ 'redis' ] [ 'master_ip' ]
149
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_sentinel_master_port' ] ||= Gitlab [ 'redis' ] [ 'master_port' ] || Gitlab [ :node ] [ 'redis' ] [ 'master_port' ]
150
+ Gitlab [ 'gitlab_workhorse' ] [ 'redis_password' ] ||= Gitlab [ 'redis' ] [ 'master_password' ] || Gitlab [ :node ] [ 'redis' ] [ 'master_password' ]
151
+ end
152
+
40
153
private
41
154
42
155
def auth_socket_specified?
0 commit comments