1+ package com.cloudogu.gitops.features
2+
3+ import com.cloudogu.gitops.config.Config
4+ import com.cloudogu.gitops.config.MultiTenantSchema
5+ import com.cloudogu.gitops.features.deployment.HelmStrategy
6+ import com.cloudogu.gitops.features.git.config.ScmCentralSchema
7+ import com.cloudogu.gitops.features.git.config.ScmTenantSchema
8+ import com.cloudogu.gitops.features.git.config.ScmTenantSchema.ScmManagerTenantConfig
9+ import com.cloudogu.gitops.utils.*
10+ import groovy.yaml.YamlSlurper
11+ import org.junit.jupiter.api.Test
12+
13+ import java.nio.file.Path
14+
15+ import static org.assertj.core.api.Assertions.assertThat
16+ import static org.mockito.ArgumentMatchers.anyString
17+ import static org.mockito.Mockito.mock
18+ import static org.mockito.Mockito.when
19+
20+ class ScmManagerSetupTest {
21+
22+ Config config = new Config (
23+ application : new Config.ApplicationSchema (
24+ username : ' abc' ,
25+ password : ' 123' ,
26+ namePrefix : ' foo-' ,
27+ trace : true ,
28+ insecure : false ,
29+ gitName : ' Cloudogu' ,
30+ gitEmail : ' hello@cloudogu.com' ,
31+ runningInsideK8s : true
32+ ),
33+ multiTenant : new MultiTenantSchema (
34+ scmManager : new ScmCentralSchema.ScmManagerCentralConfig (
35+ username : ' scmm-usr'
36+ )
37+ ),
38+ scm : new ScmTenantSchema (
39+ scmManager : new ScmManagerTenantConfig (
40+ url : ' http://scmm' ,
41+ internal : true ,
42+ ingress : ' scmm.localhost' ,
43+ username : ' scmm-usr' ,
44+ password : ' scmm-pw' ,
45+ gitOpsUsername : ' foo-gitops' ,
46+ urlForJenkins : ' http://scmm4jenkins' ,
47+ helm : new Config.HelmConfigWithValues (
48+ chart : ' scm-manager-chart' ,
49+ version : ' 2.47.0' ,
50+ repoURL : ' https://packages.scm-manager.org/repository/helm-v2-releases/' ,
51+ values : [:]
52+ )
53+ )
54+ ),
55+ jenkins : new Config.JenkinsSchema (
56+ internal : true ,
57+ url : ' http://jenkins' ,
58+ urlForScm : ' http://jenkins4scm'
59+ ),
60+ repositories : new Config.RepositoriesSchema (
61+ springBootHelmChart : new Config.RepositorySchemaWithRef (
62+ url : ' springBootHelmChartUrl' ,
63+ ref : ' 1.2.3'
64+ ),
65+ gitopsBuildLib : new Config.RepositorySchema (
66+ url : ' gitopsBuildLibUrl'
67+ ),
68+ cesBuildLib : new Config.RepositorySchema (
69+ url : ' cesBuildLibUrl'
70+ )
71+ )
72+ )
73+
74+ CommandExecutorForTest commandExecutor = new CommandExecutorForTest ()
75+
76+ Path temporaryYamlFile
77+ CommandExecutorForTest helmCommands = new CommandExecutorForTest ()
78+ HelmClient helmClient = new HelmClient (helmCommands)
79+ NetworkingUtils networkingUtils = mock(NetworkingUtils . class)
80+ K8sClient k8sClient = mock(K8sClient )
81+
82+ @Test
83+ void ' Installs SCMM and calls script with proper params' () {
84+ config. multiTenant. scmManager. username = ' scmm-usr'
85+ config. features. ingressNginx. active = true
86+ config. features. argocd. active = true
87+ config. scm. scmManager. skipPlugins = true
88+ config. scm. scmManager. skipRestart = true
89+ createScmManager(). install()
90+
91+ assertThat (parseActualYaml()[' extraEnv' ] as String ). contains(' SCM_WEBAPP_INITIALUSER\n value: "scmm-usr"' )
92+ assertThat (parseActualYaml()[' extraEnv' ] as String ). contains(' SCM_WEBAPP_INITIALPASSWORD\n value: "scmm-pw"' )
93+ assertThat (parseActualYaml()[' service' ]). isEqualTo([type : ' NodePort' ])
94+ assertThat (parseActualYaml()[' ingress' ]). isEqualTo([enabled : true , path : ' /' , hosts : [' scmm.localhost' ]])
95+ assertThat (helmCommands. actualCommands[0 ]. trim()). isEqualTo(
96+ ' helm repo add scm-manager https://packages.scm-manager.org/repository/helm-v2-releases/' )
97+ assertThat (helmCommands. actualCommands[1 ]. trim()). startsWith(
98+ ' helm upgrade -i scmm scm-manager/scm-manager-chart --create-namespace' )
99+ assertThat (helmCommands. actualCommands[1 ]. trim()). contains(' --version 2.47.0' )
100+ assertThat (helmCommands. actualCommands[1 ]. trim()). contains(" --values ${ temporaryYamlFile} " )
101+ assertThat (helmCommands. actualCommands[1 ]. trim()). contains(' --namespace foo-scm-manager' )
102+
103+ def env = getEnvAsMap()
104+ assertThat (commandExecutor. actualCommands[0 ] as String ). isEqualTo(
105+ " ${ System.getProperty('user.dir')} /scripts/scm-manager/init-scmm.sh" as String )
106+
107+ assertThat (env[' GIT_COMMITTER_NAME' ]). isEqualTo(' Cloudogu' )
108+ assertThat (env[' GIT_COMMITTER_EMAIL' ]). isEqualTo(' hello@cloudogu.com' )
109+ assertThat (env[' GIT_AUTHOR_NAME' ]). isEqualTo(' Cloudogu' )
110+ assertThat (env[' GIT_AUTHOR_EMAIL' ]). isEqualTo(' hello@cloudogu.com' )
111+ assertThat (env[' GITOPS_USERNAME' ]). isEqualTo(' foo-gitops' )
112+ assertThat (env[' TRACE' ]). isEqualTo(' true' )
113+ assertThat (env[' SCMM_URL' ]). isEqualTo(' http://scmm.foo-scm-manager.svc.cluster.local:80/scm' )
114+ assertThat (env[' SCMM_USERNAME' ]). isEqualTo(' scmm-usr' )
115+ assertThat (env[' SCMM_PASSWORD' ]). isEqualTo(' scmm-pw' )
116+ assertThat (env[' JENKINS_URL' ]). isEqualTo(' http://jenkins' )
117+ assertThat (env[' JENKINS_URL_FOR_SCMM' ]). isEqualTo(' http://jenkins4scm' )
118+ assertThat (env[' SCMM_URL_FOR_JENKINS' ]). isEqualTo(' http://scmm4jenkins' )
119+ assertThat (env[' REMOTE_CLUSTER' ]). isEqualTo(' false' )
120+ assertThat (env[' INSTALL_ARGOCD' ]). isEqualTo(' true' )
121+ assertThat (env[' SPRING_BOOT_HELM_CHART_COMMIT' ]). isEqualTo(' 1.2.3' )
122+ assertThat (env[' SPRING_BOOT_HELM_CHART_REPO' ]). isEqualTo(' springBootHelmChartUrl' )
123+ assertThat (env[' GITOPS_BUILD_LIB_REPO' ]). isEqualTo(' gitopsBuildLibUrl' )
124+ assertThat (env[' CES_BUILD_LIB_REPO' ]). isEqualTo(' cesBuildLibUrl' )
125+ assertThat (env[' NAME_PREFIX' ]). isEqualTo(' foo-' )
126+ assertThat (env[' INSECURE' ]). isEqualTo(' false' )
127+ assertThat (env[' CONTENT_EXAMPLES' ]). isEqualTo(' false' )
128+ assertThat (env[' SKIP_PLUGINS' ]). isEqualTo(' true' )
129+ assertThat (env[' SKIP_RESTART' ]). isEqualTo(' true' )
130+ }
131+
132+ @Test
133+ void ' Sets service and host only if enabled' () {
134+ config. application. remote = true
135+ config. scm. scmManager. ingress = ' '
136+ createScmManager(). install()
137+
138+ Map actualYaml = parseActualYaml() as Map
139+
140+ assertThat (actualYaml). doesNotContainKey(' service' )
141+ assertThat (actualYaml). doesNotContainKey(' ingress' )
142+ }
143+
144+ @Test
145+ void ' Installs only if internal' () {
146+ config. scm. scmManager. internal = false
147+ createScmManager(). install()
148+
149+ assertThat (temporaryYamlFile). isNull()
150+ }
151+
152+ @Test
153+ void ' initialDelaySeconds is set properly' () {
154+ config. scm. scmManager. helm. values = [
155+ livenessProbe : [
156+ initialDelaySeconds : 140
157+ ]
158+ ]
159+
160+ createScmManager(). install()
161+ assertThat (parseActualYaml()[' livenessProbe' ] as String ). contains(' initialDelaySeconds:140' )
162+ }
163+
164+ @Test
165+ void " URL: Use k8s service name if running as k8s pod" () {
166+ config. scm. scmManager. internal = true
167+ config. application. runningInsideK8s = true
168+
169+ createScmManager(). install()
170+ assertThat (config. scm. scmManager. url). isEqualTo(" http://scmm.foo-scm-manager.svc.cluster.local:80/scm" )
171+ }
172+
173+ @Test
174+ void " URL: Use local ip and nodePort when outside of k8s" () {
175+ config. scm. scmManager. internal = true
176+ config. application. runningInsideK8s = false
177+
178+ when(networkingUtils. findClusterBindAddress()). thenReturn(' 192.168.16.2' )
179+ when(k8sClient. waitForNodePort(anyString(), anyString())). thenReturn(' 42' )
180+
181+ createScmManager(). install()
182+ assertThat (config. scm. scmManager. url). endsWith(' 192.168.16.2:42/scm' )
183+ }
184+
185+ protected Map<String , String > getEnvAsMap () {
186+ commandExecutor. environment. collectEntries { it. split(' =' ) }
187+ }
188+
189+ private Map parseActualYaml () {
190+ def ys = new YamlSlurper ()
191+ return ys. parse(temporaryYamlFile) as Map
192+ }
193+
194+ private ScmManagerSetup createScmManager () {
195+ when(networkingUtils. createUrl(anyString(), anyString(), anyString())). thenCallRealMethod()
196+ when(networkingUtils. createUrl(anyString(), anyString())). thenCallRealMethod()
197+ new ScmManagerSetup (config, commandExecutor, new FileSystemUtils () {
198+ @Override
199+ Path writeTempFile (Map mapValues ) {
200+ def ret = super . writeTempFile(mapValues)
201+ temporaryYamlFile = Path . of(ret. toString(). replace(" .ftl" , " " )) // Path after template invocation
202+ return ret
203+ }
204+ }, new HelmStrategy (config, helmClient), k8sClient, networkingUtils)
205+ }
206+ }
0 commit comments