Skip to content

Commit 5e6ddc7

Browse files
committed
cleanup
1 parent d949480 commit 5e6ddc7

File tree

1 file changed

+206
-0
lines changed

1 file changed

+206
-0
lines changed
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
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

Comments
 (0)