@docupace/pipeline 1.0.39 → 1.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,783 +1,783 @@
1
- import fs from 'fs-extra';
2
- import path from 'path';
3
- import axios from 'axios';
4
- import crypto from 'crypto';
5
-
6
- import {
7
- cloneEnvRepository,
8
- readDeployConfig,
9
- pushDeployConfig,
10
- cloneRepository,
11
- } from '../next/deploy.js';
12
-
13
- import { getVaultSecrets, updateVaultSecrets } from './vault.js';
14
- import {
15
- getVaultSecretsConfigs,
16
- environmentConfig,
17
- coreSiteEnvMap,
18
- } from '../next/config.js';
19
-
20
- async function ensureDirectoryExists(dirPath) {
21
- try {
22
- await fs.promises.mkdir(dirPath, { recursive: true });
23
- console.log(`Directory created or already exists: ${dirPath}`);
24
- } catch (err) {
25
- console.error(`Failed to create directory: ${err.message}`);
26
- }
27
- }
28
-
29
- export async function getAuth0AuthToken(auth0Domain, clientId, clientSecret) {
30
- try {
31
- const response = await axios.post(
32
- `https://${auth0Domain}/oauth/token`,
33
- {
34
- client_id: clientId,
35
- client_secret: clientSecret,
36
- audience: `https://${auth0Domain}/api/v2/`,
37
- grant_type: 'client_credentials',
38
- },
39
- {
40
- headers: {
41
- 'Content-Type': 'application/json',
42
- },
43
- },
44
- );
45
-
46
- const authToken = response.data.access_token;
47
- // console.log("Auth0 Auth Token:", authToken);
48
- return authToken;
49
- } catch (error) {
50
- console.error(
51
- 'Error fetching Auth0 token:',
52
- error.response ? error.response.data : error.message,
53
- );
54
- }
55
- }
56
-
57
- async function configureUI(
58
- siteHost,
59
- coreURL,
60
- connectURL,
61
- docupaceHost,
62
- site,
63
- env,
64
- auth0Domain,
65
- auth0ClientId,
66
- auth0ClientSecret,
67
- auth0Token,
68
- vaultSiteSecretsPath,
69
- imageTag,
70
- repoPath,
71
- useS3,
72
- ) {
73
- console.log(
74
- `Configuring UI for site: ${site} Host: ${siteHost} in env: ${env}`,
75
- );
76
- siteHost = siteHost.replace('https://', '');
77
- coreURL = coreURL.replace('https://', '');
78
- connectURL = connectURL.replace('https://', '');
79
-
80
- try {
81
- const auth0Response = await axios.get(
82
- `https://${auth0Domain}/api/v2/clients`,
83
- {
84
- headers: { authorization: `Bearer ${auth0Token}` },
85
- },
86
- );
87
-
88
- const uiClient = auth0Response.data.find(
89
- (client) => client.name === 'docupace-ui-main',
90
- );
91
- const uiAuth0ClientId = uiClient.client_id;
92
- const uiAuth0ClientSecret = uiClient.client_secret;
93
-
94
- // Generate Auth0 Secret
95
- const uiAuth0Secret = crypto
96
- .randomBytes(48)
97
- .toString('base64')
98
- .replace(/[^a-zA-Z0-9]/g, '');
99
-
100
- // Prepare data payload
101
- console.log('Preparing Vault UI data payload...');
102
- const uiSecretData = JSON.stringify({
103
- data: {
104
- AUTH0_CLIENT_ID: uiAuth0ClientId,
105
- AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
106
- AUTH0_SECRET: uiAuth0Secret,
107
- },
108
- });
109
-
110
- await updateVaultSecrets(vaultSiteSecretsPath, uiSecretData);
111
-
112
- let siteAWSSecrets = null;
113
-
114
- if (useS3 === true || useS3 === 'true') {
115
- const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
116
- siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
117
- console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
118
- }
119
-
120
- // Prepare ui.app.yaml
121
- const uiAppYaml = `
122
- repo: docupace-ui-main
123
- revision: master
124
- `.trim();
125
-
126
- // Prepare ui.values.yaml
127
- const uiValuesYaml = `
128
- uiMain:
129
- auth0BaseUrl: https://${siteHost}
130
- auth0IssuerBaseUrl: https://${auth0Domain}
131
- auth0ClientId: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_ID
132
- graphqlClientUrl: https://${siteHost}/api/graphql
133
- graphqlServerUrl: https://${siteHost}/api/graphql
134
- connectUrl: https://${connectURL}
135
- coreUrl: https://${coreURL}
136
- env:
137
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_SECRET
138
- AUTH0_SECRET: vault:secret/data/${site}/ui/config#AUTH0_SECRET
139
- ${
140
- useS3 === true || useS3 === 'true'
141
- ? `
142
- AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
143
- AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
144
- AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
145
- `.trim()
146
- : ''
147
- }
148
- image:
149
- repository: registry.paperout.com/docupace-ui-main-dev-docker-local/docupace-ui-main
150
- tag: ${imageTag}
151
- ${
152
- useS3 === true || useS3 === 'true'
153
- ? `
154
- serviceAccount:
155
- create: true
156
- annotations:
157
- eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket
158
- `.trim()
159
- : ''
160
- }
161
- imagePullSecrets:
162
- - name: jf-artifactory
163
- ingress:
164
- enabled: true
165
- className: nginx
166
- annotations:
167
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
168
- external-dns.alpha.kubernetes.io/zone: public
169
- cert-manager.io/cluster-issuer: letsencrypt
170
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
171
- hosts:
172
- - host: ${siteHost}
173
- paths:
174
- - path: /
175
- pathType: Prefix
176
- tls:
177
- - hosts:
178
- - ${siteHost}
179
- secretName: dp-next-ui-cert
180
- externalConnectIngress:
181
- enabled: true
182
- className: nginx
183
- annotations:
184
- cert-manager.io/cluster-issuer: letsencrypt
185
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
186
- external-dns.alpha.kubernetes.io/zone: public
187
- nginx.ingress.kubernetes.io/backend-protocol: HTTPS
188
- nginx.ingress.kubernetes.io/configuration-snippet: |
189
- proxy_set_header Host ${siteHost};
190
- nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
191
- hosts:
192
- - host: ${siteHost}
193
- paths:
194
- - path: /core
195
- - path: /core_b2b
196
- - path: /core_reports
197
- - path: /corerealm
198
- - path: /connect
199
- - path: /webstart
200
- - path: /core_ws
201
- - path: /core_docupload
202
- - path: /core_ariws
203
- - path: /core_restws
204
- - path: /core_webdav
205
- tls:
206
- - hosts:
207
- - ${siteHost}
208
- secretName: dp-next-ui-cert
209
- externalConnectService:
210
- enabled: true
211
- name: external-connect
212
- domain: ${docupaceHost}
213
- `.trim();
214
-
215
- console.log('Writing configuration files...');
216
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
217
-
218
- await fs.writeFile(
219
- `${repoPath}/dp/${site}/ui.app.yaml`,
220
- uiAppYaml,
221
- (err) => {
222
- if (err) {
223
- console.error('Failed to write the file:', err);
224
- } else {
225
- console.log('File written successfully.');
226
- }
227
- },
228
- );
229
-
230
- await fs.writeFile(
231
- `${repoPath}/dp/${site}/ui.values.yaml`,
232
- uiValuesYaml,
233
- (err) => {
234
- if (err) {
235
- console.error('Failed to write the file:', err);
236
- } else {
237
- console.log('File written successfully.');
238
- }
239
- },
240
- );
241
- console.log('Done!');
242
- console.log('Updating Core Site Config...');
243
- await updateCoreSiteConfig(site, env, useS3);
244
- } catch (error) {
245
- console.error('Error configuring UI:', error);
246
- }
247
- }
248
-
249
- async function configureCCUI(
250
- siteHost,
251
- coreURL,
252
- connectURL,
253
- docupaceHost,
254
- site,
255
- env,
256
- auth0Domain,
257
- auth0ClientId,
258
- auth0ClientSecret,
259
- auth0Token,
260
- vaultSiteSecretsPath,
261
- imageTag,
262
- repoPath,
263
- useS3,
264
- ccUrl,
265
- ) {
266
- console.log(
267
- `Configuring CC UI for site: ${site} Host: ${siteHost} in env: ${env}`,
268
- );
269
- siteHost = siteHost.replace('https://', '');
270
- coreURL = coreURL.replace('https://', '');
271
- connectURL = connectURL.replace('https://', '');
272
- ccUrl = ccUrl.replace('https://', '');
273
-
274
- try {
275
- const auth0Response = await axios.get(
276
- `https://${auth0Domain}/api/v2/clients`,
277
- {
278
- headers: { authorization: `Bearer ${auth0Token}` },
279
- },
280
- );
281
-
282
- const uiClient = auth0Response.data.find(
283
- (client) => client.name === 'docupace-ui-cc',
284
- );
285
- const uiAuth0ClientId = uiClient.client_id;
286
- const uiAuth0ClientSecret = uiClient.client_secret;
287
-
288
- // Generate Auth0 Secret
289
- const uiAuth0Secret = crypto
290
- .randomBytes(48)
291
- .toString('base64')
292
- .replace(/[^a-zA-Z0-9]/g, '');
293
-
294
- // Prepare data payload
295
- console.log('Preparing Vault CC UI data payload...');
296
- const ccUISecretData = JSON.stringify({
297
- data: {
298
- AUTH0_CLIENT_ID: uiAuth0ClientId,
299
- AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
300
- AUTH0_SECRET: uiAuth0Secret,
301
- },
302
- });
303
- console.log('Updating Vault Site Secret =>', vaultSiteSecretsPath);
304
- await updateVaultSecrets(vaultSiteSecretsPath, ccUISecretData);
305
-
306
- let siteAWSSecrets = null;
307
-
308
- if (useS3 === true || useS3 === 'true') {
309
- const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
310
- siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
311
- console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
312
- }
313
-
314
- // Prepare cc.app.yaml
315
- const uiССAppYaml = `
316
- repo: docupace-ui-main
317
- revision: master
318
- `.trim();
319
- // Prepare cc.values.yaml
320
- const uiССValuesYaml = `
321
- uiMain:
322
- auth0BaseUrl: https://${ccUrl}
323
- auth0IssuerBaseUrl: https://${auth0Domain}
324
- auth0ClientId: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_ID
325
- graphqlClientUrl: https://${siteHost}/api/graphql
326
- graphqlServerUrl: https://${siteHost}/api/graphql
327
- connectUrl: https://${connectURL}
328
- coreUrl: https://${coreURL}
329
- env:
330
- AUTH0_AUDIENCE: core-api-access
331
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_SECRET
332
- AUTH0_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_SECRET
333
- ${
334
- useS3 === true || useS3 === 'true'
335
- ? `
336
- AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
337
- AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
338
- AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
339
- image:
340
- repository: registry.paperout.com/docupace-ui-main-dev-docker-local/cc-ui-app
341
- tag: ${imageTag}
342
- imagePullSecrets:
343
- - name: jf-artifactory
344
- ingress:
345
- enabled: true
346
- className: nginx
347
- annotations:
348
- external-dns.alpha.kubernetes.io/hostname: ${ccUrl}
349
- external-dns.alpha.kubernetes.io/zone: public
350
- cert-manager.io/cluster-issuer: letsencrypt
351
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
352
- hosts:
353
- - host: ${ccUrl}
354
- paths:
355
- - path: /
356
- pathType: Prefix
357
- tls:
358
- - hosts:
359
- - ${ccUrl}
360
- secretName: dp-cc-ui-cert
361
- `.trim()
362
- : ''
363
- }
364
- ${
365
- useS3 === true || useS3 === 'true'
366
- ? `
367
- serviceAccount:
368
- create: true
369
- annotations:
370
- eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket
371
- `.trim()
372
- : ''
373
- }
374
- `.trim();
375
-
376
- console.log('Writing configuration files...');
377
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
378
-
379
- await fs.writeFile(
380
- `${repoPath}/dp/${site}/cc.app.yaml`,
381
- uiССAppYaml,
382
- (err) => {
383
- if (err) {
384
- console.error('Failed to write the file:', err);
385
- } else {
386
- console.log('File written successfully.');
387
- }
388
- },
389
- );
390
-
391
- await fs.writeFile(
392
- `${repoPath}/dp/${site}/cc.values.yaml`,
393
- uiССValuesYaml,
394
- (err) => {
395
- if (err) {
396
- console.error('Failed to write the file:', err);
397
- } else {
398
- console.log('File written successfully.');
399
- }
400
- },
401
- );
402
- console.log('Done!');
403
- console.log('Updating Core Site Config...');
404
- await updateCoreSiteConfig(site, env, useS3);
405
- } catch (error) {
406
- console.error('Error configuring UI:', error);
407
- }
408
- }
409
-
410
- export async function cleanAndWritePropertiesFile(configPath, content) {
411
- try {
412
- const cleanedContent = content
413
- .split('\n')
414
- .map((line) => line.trim())
415
- .filter((line) => line !== '')
416
- .join('\n');
417
-
418
- await fs.writeFile(configPath, cleanedContent, 'utf8');
419
- console.log(`Cleaned and written file to: ${configPath}`);
420
- } catch (error) {
421
- console.error('Error writing properties file:', error.message);
422
- process.exit(1);
423
- }
424
- }
425
-
426
- export async function updateCoreSiteConfig(site, env, useS3) {
427
- try {
428
- const coreSiteEnv = coreSiteEnvMap[env];
429
-
430
- const coreSiteConfigRepoPath = await cloneRepository(
431
- `${coreSiteEnv}-site-settings`,
432
- );
433
-
434
- const configPath = path.join(
435
- `${coreSiteEnv}-site-settings`,
436
- site.toUpperCase(),
437
- 'docucore-nextUI.properties',
438
- );
439
-
440
- let siteAWSSecrets = null;
441
-
442
- if (useS3 === true || useS3 === 'true') {
443
- const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
444
- siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
445
- console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
446
- }
447
-
448
- const coreSiteConfig = `
449
- ${
450
- siteAWSSecrets
451
- ? `
452
- com.docupace.imports.files.FilesImportConfig.aws.accessKeyId=${siteAWSSecrets.AWS_ACCESS_KEY_ID}
453
- com.docupace.imports.files.FilesImportConfig.aws.accessKeySecret=${siteAWSSecrets.AWS_SECRET_ACCESS_KEY}
454
- com.docupace.imports.files.FilesImportConfig.aws.region=${siteAWSSecrets.AWS_REGION}
455
- `.trim()
456
- : ''
457
- }
458
- `;
459
-
460
- await fs.ensureDir(path.join(coreSiteConfigRepoPath, site.toUpperCase()));
461
- await cleanAndWritePropertiesFile(configPath, coreSiteConfig);
462
- await pushDeployConfig(
463
- coreSiteConfigRepoPath,
464
- `Core config: docucore-nextUI.properties for site: (${site.toUpperCase()}) update in env: (${env})`,
465
- );
466
- } catch (error) {
467
- console.error('Error:', error.message);
468
- process.exit(1);
469
- }
470
- }
471
-
472
- async function configureGraphQLServer(
473
- siteHost,
474
- coreURL,
475
- docupaceHost,
476
- site,
477
- env,
478
- auth0Domain,
479
- auth0ClientId,
480
- auth0ClientSecret,
481
- auth0Token,
482
- vaultSiteSecretsPath,
483
- imageTag,
484
- standardConfigRemoteBranch,
485
- repoPath,
486
- commonSecrets,
487
- ) {
488
- siteHost = siteHost.replace('https://', '');
489
- coreURL = coreURL.replace('https://', '');
490
- console.log(
491
- `Configuring GraphQL Server for site: ${site} Host: ${siteHost} in env: ${env}`,
492
- );
493
-
494
- try {
495
- const auth0Response = await axios.get(
496
- `https://${auth0Domain}/api/v2/clients`,
497
- {
498
- headers: { authorization: `Bearer ${auth0Token}` },
499
- },
500
- );
501
-
502
- const graphQLServerClient = auth0Response.data.find(
503
- (client) => client.name === 'docupace-graphql',
504
- );
505
- const graphQLServerClientCredentials = auth0Response.data.find(
506
- (client) => client.name === 'docupace-graphql-client-credentials',
507
- );
508
-
509
- const graphQLServerAuth0ClientId = graphQLServerClient.client_id;
510
- const graphQLServerAuth0ClientSecret = graphQLServerClient.client_secret;
511
-
512
- const graphQLServerCCAuth0ClientId =
513
- graphQLServerClientCredentials.client_id;
514
- const graphQLServerCCAuth0ClientSecret =
515
- graphQLServerClientCredentials.client_secret;
516
-
517
- // Prepare data payload
518
- console.log('Preparing Vault GraphQL Server data payload...');
519
- const graphQLServerSecretData = JSON.stringify({
520
- data: {
521
- AUTH0_CLIENT_ID: graphQLServerAuth0ClientId,
522
- AUTH0_CLIENT_SECRET: graphQLServerAuth0ClientSecret,
523
- AUTH0_CC_CLIENT_ID: graphQLServerCCAuth0ClientId,
524
- AUTH0_CC_CLIENT_SECRET: graphQLServerCCAuth0ClientSecret,
525
- CORE_PASSWORD: commonSecrets.CORE_PASSWORD,
526
- REMOTE_CONFIG_PATH: commonSecrets.REMOTE_CONFIG_PATH,
527
- STANDARD_CONFIG_REMOTE_PATH: commonSecrets.STANDARD_CONFIG_REMOTE_PATH,
528
- },
529
- });
530
-
531
- await updateVaultSecrets(vaultSiteSecretsPath, graphQLServerSecretData);
532
-
533
- // Prepare ui.app.yaml
534
- const graphQLServerAppYaml = `
535
- repo: docupace-graphql-server
536
- revision: ${standardConfigRemoteBranch}
537
- `.trim();
538
-
539
- // Prepare ui.values.yaml
540
- const graphQLServerValuesYaml = `
541
- graphqlServer:
542
- auth0Domain: https://${auth0Domain}
543
- auth0ClientId: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_ID
544
- auth0Audience: ${commonSecrets.CORE_API_IDENTIFIER}
545
- baseUrl: https://${siteHost}/api/graphql
546
- coreUrl: https://${coreURL}
547
- integrationHubUrl: "https://${commonSecrets.INTEGRATION_HUB_URL}"
548
- standardConfigRemoteBranch: ${standardConfigRemoteBranch}
549
- apiLevel: "2"
550
- env:
551
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_SECRET
552
- STANDARD_CONFIG_REMOTE_PATH: vault:secret/data/common/config#STANDARD_CONFIG_REMOTE_PATH
553
- SITE_CONFIG_REMOTE_PATH: vault:secret/data/${site}/common/config#SITE_CONFIG_REMOTE_PATH
554
- AUTH0_CC_CLIENT_ID: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_ID
555
- AUTH0_CC_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_SECRET
556
- image:
557
- repository: registry.paperout.com/docupace-graphql-server-dev-docker-local/docupace-graphql-server
558
- tag: ${imageTag}
559
- imagePullSecrets:
560
- - name: jf-artifactory
561
- ingress:
562
- annotations:
563
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
564
- external-dns.alpha.kubernetes.io/zone: public
565
- cert-manager.io/cluster-issuer: letsencrypt
566
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
567
- enabled: true
568
- className: nginx
569
- hosts:
570
- - host: ${siteHost}
571
- paths:
572
- - path: /api/graphql
573
- pathType: Prefix
574
- tls:
575
- - hosts:
576
- - ${siteHost}
577
- secretName: dp-next-ui-cert
578
- `.trim();
579
-
580
- // Write configuration files
581
- console.log('Writing ArgoCD GraphQL Server configuration files...');
582
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
583
-
584
- await fs.writeFile(
585
- `${repoPath}/dp/${site}/graphql-server.app.yaml`,
586
- graphQLServerAppYaml,
587
- (err) => {
588
- if (err) {
589
- console.error('Failed to write the file:', err);
590
- } else {
591
- console.log('File written successfully.');
592
- }
593
- },
594
- );
595
-
596
- await fs.writeFile(
597
- `${repoPath}/dp/${site}/graphql-server.values.yaml`,
598
- graphQLServerValuesYaml,
599
- (err) => {
600
- if (err) {
601
- console.error('Failed to write the file:', err);
602
- } else {
603
- console.log('File written successfully.');
604
- }
605
- },
606
- );
607
- console.log('Done!');
608
- } catch (error) {
609
- console.error('Error configuring GraphQL Server:', error);
610
- }
611
- }
612
-
613
- export async function configureFromSite(
614
- fromSite,
615
- toSite,
616
- fromEnv,
617
- toEnv,
618
- deployUI,
619
- deployGraphQLServer,
620
- useNewDomain,
621
- useS3,
622
- deployCCUI,
623
- ) {
624
- console.log(
625
- `Configuring Auth0 tenants and ArgoCD apps for site: ${toSite} in env: ${toEnv} from site: ${fromSite}`,
626
- );
627
- // Common Secrets
628
- const commonSecretsPath = getVaultSecretsConfigs(toSite).commonSecretsPath;
629
- console.log(`commonSecretsPath => ${commonSecretsPath}`);
630
- const commonSecrets = await getVaultSecrets(commonSecretsPath);
631
-
632
- // Site Common Secrets
633
- const siteCommonSecretsPath =
634
- getVaultSecretsConfigs(toSite).siteCommonSecretsPath;
635
- console.log(`siteCommonSecretsPath => ${siteCommonSecretsPath}`);
636
- const siteCommonSecrets = await getVaultSecrets(siteCommonSecretsPath);
637
-
638
- const auth0Domain = `docupace-${toEnv}-${toSite}.us.auth0.com`;
639
- const auth0ClientId = siteCommonSecrets.AUTH0_CLIENT_ID;
640
- const auth0ClientSecret = siteCommonSecrets.AUTH0_CLIENT_SECRET;
641
- const auth0Token = await getAuth0AuthToken(
642
- auth0Domain,
643
- auth0ClientId,
644
- auth0ClientSecret,
645
- );
646
-
647
- // UI MAIN app
648
- const uiSecretsPath = getVaultSecretsConfigs(toSite).uiSecretsPath;
649
- console.log(`uiSecretsPath => ${uiSecretsPath}`);
650
-
651
- // UI CC app
652
- const ccUISecretsPath = getVaultSecretsConfigs(toSite).ccUISecretsPath;
653
- console.log(`ccUISecretsPath => ${ccUISecretsPath}`);
654
-
655
- // GraphQL-Server app
656
- const graphqlSecretsPath =
657
- getVaultSecretsConfigs(toSite).graphqlServerSecretsPath;
658
- console.log(`graphqlSecretsPath => ${graphqlSecretsPath}`);
659
-
660
- let repoPathFromEnv = '';
661
- let repoPathToEnv = '';
662
- // Clone repositories
663
- if (fromEnv === toEnv) {
664
- repoPathFromEnv = await cloneEnvRepository(fromEnv);
665
- repoPathToEnv = repoPathFromEnv;
666
- } else {
667
- repoPathFromEnv = await cloneEnvRepository(fromEnv);
668
- repoPathToEnv = await cloneEnvRepository(toEnv);
669
- }
670
-
671
- //TODO: clone fromEnv and toEnv. replace above with this
672
-
673
- // const auth0RepoPath = await cloneRepository('auth0-site-setup');
674
-
675
- // Read deploy configs
676
- const { deployConfig: deployUIConfig } = await readDeployConfig(
677
- 'ui',
678
- fromEnv,
679
- fromSite,
680
- 'values',
681
- );
682
- const uiImageTag = deployUIConfig.image.tag;
683
-
684
- const { deployConfig: deployGraphQLServerConfig } = await readDeployConfig(
685
- 'graphql-server',
686
- fromEnv,
687
- fromSite,
688
- 'values',
689
- );
690
- const graphqlImageTag = deployGraphQLServerConfig.image.tag;
691
- const graphqlStandardConfigRemoteBranch =
692
- deployGraphQLServerConfig.graphqlServer.standardConfigRemoteBranch;
693
-
694
- console.log(
695
- `Copying Latest UI Image Tag: ${deployUIConfig.image.tag} from site: ${fromSite} to site: ${toSite}`,
696
- );
697
- console.log(
698
- `Copying Latest GraphQL Server Image Tag: ${deployGraphQLServerConfig.image.tag} from site: ${fromSite} to site: ${toSite}`,
699
- );
700
-
701
- const envConfig = environmentConfig[toEnv];
702
-
703
- let CORE_URL, SITE_HOST, CORE_API_CONTEXT, CONNECT_URL, DOCUPACE_HOST;
704
- const newUrl = envConfig.newUrl(toSite);
705
- const ccUrl = envConfig.ccUrl(toSite);
706
-
707
- SITE_HOST = `${newUrl}`;
708
-
709
- if (useNewDomain === true || useNewDomain === 'true') {
710
- const newUrl = envConfig.newUrl(toSite);
711
- CORE_URL = `${newUrl}/core`;
712
- // SITE_HOST = newUrl;
713
- CORE_API_CONTEXT = 'core';
714
- CONNECT_URL = `${newUrl}/connect`;
715
- DOCUPACE_HOST = envConfig.docupaceHost();
716
- } else {
717
- const oldUrl = envConfig.oldUrl(toSite);
718
- CORE_URL = oldUrl;
719
- // SITE_HOST = oldUrl;
720
- CORE_API_CONTEXT = toSite;
721
- CONNECT_URL = `${oldUrl}_ui`;
722
- }
723
-
724
- if (deployUI === true || deployUI === 'true') {
725
- await configureUI(
726
- SITE_HOST,
727
- CORE_URL,
728
- CONNECT_URL,
729
- DOCUPACE_HOST,
730
- toSite,
731
- toEnv,
732
- auth0Domain,
733
- auth0ClientId,
734
- auth0ClientSecret,
735
- auth0Token,
736
- uiSecretsPath,
737
- uiImageTag,
738
- repoPathToEnv,
739
- useS3,
740
- );
741
- }
742
-
743
- if (deployCCUI === true || deployCCUI === 'true') {
744
- await configureCCUI(
745
- SITE_HOST,
746
- CORE_URL,
747
- CONNECT_URL,
748
- DOCUPACE_HOST,
749
- toSite,
750
- toEnv,
751
- auth0Domain,
752
- auth0ClientId,
753
- auth0ClientSecret,
754
- auth0Token,
755
- ccUISecretsPath,
756
- uiImageTag,
757
- repoPathToEnv,
758
- useS3,
759
- ccUrl,
760
- );
761
- }
762
-
763
- await configureGraphQLServer(
764
- SITE_HOST,
765
- CORE_URL,
766
- DOCUPACE_HOST,
767
- toSite,
768
- toEnv,
769
- auth0Domain,
770
- auth0ClientId,
771
- auth0ClientSecret,
772
- auth0Token,
773
- graphqlSecretsPath,
774
- graphqlImageTag,
775
- graphqlStandardConfigRemoteBranch,
776
- repoPathToEnv,
777
- commonSecrets,
778
- );
779
- await pushDeployConfig(
780
- repoPathToEnv,
781
- `Config update for ${toSite} from ${fromSite} with UI: ${uiImageTag} and GraphQL: ${graphqlImageTag}`,
782
- );
783
- }
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import axios from 'axios';
4
+ import crypto from 'crypto';
5
+
6
+ import {
7
+ cloneEnvRepository,
8
+ readDeployConfig,
9
+ pushDeployConfig,
10
+ cloneRepository,
11
+ } from '../next/deploy.js';
12
+
13
+ import { getVaultSecrets, updateVaultSecrets } from './vault.js';
14
+ import {
15
+ getVaultSecretsConfigs,
16
+ environmentConfig,
17
+ coreSiteEnvMap,
18
+ } from '../next/config.js';
19
+
20
+ async function ensureDirectoryExists(dirPath) {
21
+ try {
22
+ await fs.promises.mkdir(dirPath, { recursive: true });
23
+ console.log(`Directory created or already exists: ${dirPath}`);
24
+ } catch (err) {
25
+ console.error(`Failed to create directory: ${err.message}`);
26
+ }
27
+ }
28
+
29
+ export async function getAuth0AuthToken(auth0Domain, clientId, clientSecret) {
30
+ try {
31
+ const response = await axios.post(
32
+ `https://${auth0Domain}/oauth/token`,
33
+ {
34
+ client_id: clientId,
35
+ client_secret: clientSecret,
36
+ audience: `https://${auth0Domain}/api/v2/`,
37
+ grant_type: 'client_credentials',
38
+ },
39
+ {
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ },
43
+ },
44
+ );
45
+
46
+ const authToken = response.data.access_token;
47
+ // console.log("Auth0 Auth Token:", authToken);
48
+ return authToken;
49
+ } catch (error) {
50
+ console.error(
51
+ 'Error fetching Auth0 token:',
52
+ error.response ? error.response.data : error.message,
53
+ );
54
+ }
55
+ }
56
+
57
+ async function configureUI(
58
+ siteHost,
59
+ coreURL,
60
+ connectURL,
61
+ docupaceHost,
62
+ site,
63
+ env,
64
+ auth0Domain,
65
+ auth0ClientId,
66
+ auth0ClientSecret,
67
+ auth0Token,
68
+ vaultSiteSecretsPath,
69
+ imageTag,
70
+ repoPath,
71
+ useS3,
72
+ ) {
73
+ console.log(
74
+ `Configuring UI for site: ${site} Host: ${siteHost} in env: ${env}`,
75
+ );
76
+ siteHost = siteHost.replace('https://', '');
77
+ coreURL = coreURL.replace('https://', '');
78
+ connectURL = connectURL.replace('https://', '');
79
+
80
+ try {
81
+ const auth0Response = await axios.get(
82
+ `https://${auth0Domain}/api/v2/clients`,
83
+ {
84
+ headers: { authorization: `Bearer ${auth0Token}` },
85
+ },
86
+ );
87
+
88
+ const uiClient = auth0Response.data.find(
89
+ (client) => client.name === 'docupace-ui-main',
90
+ );
91
+ const uiAuth0ClientId = uiClient.client_id;
92
+ const uiAuth0ClientSecret = uiClient.client_secret;
93
+
94
+ // Generate Auth0 Secret
95
+ const uiAuth0Secret = crypto
96
+ .randomBytes(48)
97
+ .toString('base64')
98
+ .replace(/[^a-zA-Z0-9]/g, '');
99
+
100
+ // Prepare data payload
101
+ console.log('Preparing Vault UI data payload...');
102
+ const uiSecretData = JSON.stringify({
103
+ data: {
104
+ AUTH0_CLIENT_ID: uiAuth0ClientId,
105
+ AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
106
+ AUTH0_SECRET: uiAuth0Secret,
107
+ },
108
+ });
109
+
110
+ await updateVaultSecrets(vaultSiteSecretsPath, uiSecretData);
111
+
112
+ let siteAWSSecrets = null;
113
+
114
+ if (useS3 === true || useS3 === 'true') {
115
+ const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
116
+ siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
117
+ console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
118
+ }
119
+
120
+ // Prepare ui.app.yaml
121
+ const uiAppYaml = `
122
+ repo: docupace-ui-main
123
+ revision: master
124
+ `.trim();
125
+
126
+ // Prepare ui.values.yaml
127
+ const uiValuesYaml = `
128
+ uiMain:
129
+ auth0BaseUrl: https://${siteHost}
130
+ auth0IssuerBaseUrl: https://${auth0Domain}
131
+ auth0ClientId: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_ID
132
+ graphqlClientUrl: https://${siteHost}/api/graphql
133
+ graphqlServerUrl: https://${siteHost}/api/graphql
134
+ connectUrl: https://${connectURL}
135
+ coreUrl: https://${coreURL}
136
+ env:
137
+ AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_SECRET
138
+ AUTH0_SECRET: vault:secret/data/${site}/ui/config#AUTH0_SECRET
139
+ ${
140
+ useS3 === true || useS3 === 'true'
141
+ ? `
142
+ AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
143
+ AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
144
+ AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
145
+ `.trim()
146
+ : ''
147
+ }
148
+ image:
149
+ repository: registry.paperout.com/docupace-ui-main-dev-docker-local/docupace-ui-main
150
+ tag: ${imageTag}
151
+ ${
152
+ useS3 === true || useS3 === 'true'
153
+ ? `
154
+ serviceAccount:
155
+ create: true
156
+ annotations:
157
+ eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket
158
+ `.trim()
159
+ : ''
160
+ }
161
+ imagePullSecrets:
162
+ - name: jf-artifactory
163
+ ingress:
164
+ enabled: true
165
+ className: nginx
166
+ annotations:
167
+ external-dns.alpha.kubernetes.io/hostname: ${siteHost}
168
+ external-dns.alpha.kubernetes.io/zone: public
169
+ cert-manager.io/cluster-issuer: letsencrypt
170
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
171
+ hosts:
172
+ - host: ${siteHost}
173
+ paths:
174
+ - path: /
175
+ pathType: Prefix
176
+ tls:
177
+ - hosts:
178
+ - ${siteHost}
179
+ secretName: dp-next-ui-cert
180
+ externalConnectIngress:
181
+ enabled: true
182
+ className: nginx
183
+ annotations:
184
+ cert-manager.io/cluster-issuer: letsencrypt
185
+ external-dns.alpha.kubernetes.io/hostname: ${siteHost}
186
+ external-dns.alpha.kubernetes.io/zone: public
187
+ nginx.ingress.kubernetes.io/backend-protocol: HTTPS
188
+ nginx.ingress.kubernetes.io/configuration-snippet: |
189
+ proxy_set_header Host ${siteHost};
190
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
191
+ hosts:
192
+ - host: ${siteHost}
193
+ paths:
194
+ - path: /core
195
+ - path: /core_b2b
196
+ - path: /core_reports
197
+ - path: /corerealm
198
+ - path: /connect
199
+ - path: /webstart
200
+ - path: /core_ws
201
+ - path: /core_docupload
202
+ - path: /core_ariws
203
+ - path: /core_restws
204
+ - path: /core_webdav
205
+ tls:
206
+ - hosts:
207
+ - ${siteHost}
208
+ secretName: dp-next-ui-cert
209
+ externalConnectService:
210
+ enabled: true
211
+ name: external-connect
212
+ domain: ${docupaceHost}
213
+ `.trim();
214
+
215
+ console.log('Writing configuration files...');
216
+ await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
217
+
218
+ await fs.writeFile(
219
+ `${repoPath}/dp/${site}/ui.app.yaml`,
220
+ uiAppYaml,
221
+ (err) => {
222
+ if (err) {
223
+ console.error('Failed to write the file:', err);
224
+ } else {
225
+ console.log('File written successfully.');
226
+ }
227
+ },
228
+ );
229
+
230
+ await fs.writeFile(
231
+ `${repoPath}/dp/${site}/ui.values.yaml`,
232
+ uiValuesYaml,
233
+ (err) => {
234
+ if (err) {
235
+ console.error('Failed to write the file:', err);
236
+ } else {
237
+ console.log('File written successfully.');
238
+ }
239
+ },
240
+ );
241
+ console.log('Done!');
242
+ console.log('Updating Core Site Config...');
243
+ await updateCoreSiteConfig(site, env, useS3);
244
+ } catch (error) {
245
+ console.error('Error configuring UI:', error);
246
+ }
247
+ }
248
+
249
+ async function configureCCUI(
250
+ siteHost,
251
+ coreURL,
252
+ connectURL,
253
+ docupaceHost,
254
+ site,
255
+ env,
256
+ auth0Domain,
257
+ auth0ClientId,
258
+ auth0ClientSecret,
259
+ auth0Token,
260
+ vaultSiteSecretsPath,
261
+ imageTag,
262
+ repoPath,
263
+ useS3,
264
+ ccUrl,
265
+ ) {
266
+ console.log(
267
+ `Configuring CC UI for site: ${site} Host: ${siteHost} in env: ${env}`,
268
+ );
269
+ siteHost = siteHost.replace('https://', '');
270
+ coreURL = coreURL.replace('https://', '');
271
+ connectURL = connectURL.replace('https://', '');
272
+ ccUrl = ccUrl.replace('https://', '');
273
+
274
+ try {
275
+ const auth0Response = await axios.get(
276
+ `https://${auth0Domain}/api/v2/clients`,
277
+ {
278
+ headers: { authorization: `Bearer ${auth0Token}` },
279
+ },
280
+ );
281
+
282
+ const uiClient = auth0Response.data.find(
283
+ (client) => client.name === 'docupace-ui-cc',
284
+ );
285
+ const uiAuth0ClientId = uiClient.client_id;
286
+ const uiAuth0ClientSecret = uiClient.client_secret;
287
+
288
+ // Generate Auth0 Secret
289
+ const uiAuth0Secret = crypto
290
+ .randomBytes(48)
291
+ .toString('base64')
292
+ .replace(/[^a-zA-Z0-9]/g, '');
293
+
294
+ // Prepare data payload
295
+ console.log('Preparing Vault CC UI data payload...');
296
+ const ccUISecretData = JSON.stringify({
297
+ data: {
298
+ AUTH0_CLIENT_ID: uiAuth0ClientId,
299
+ AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
300
+ AUTH0_SECRET: uiAuth0Secret,
301
+ },
302
+ });
303
+ console.log('Updating Vault Site Secret =>', vaultSiteSecretsPath);
304
+ await updateVaultSecrets(vaultSiteSecretsPath, ccUISecretData);
305
+
306
+ let siteAWSSecrets = null;
307
+
308
+ if (useS3 === true || useS3 === 'true') {
309
+ const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
310
+ siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
311
+ console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
312
+ }
313
+
314
+ // Prepare cc.app.yaml
315
+ const uiССAppYaml = `
316
+ repo: docupace-ui-main
317
+ revision: master
318
+ `.trim();
319
+ // Prepare cc.values.yaml
320
+ const uiССValuesYaml = `
321
+ uiMain:
322
+ auth0BaseUrl: https://${ccUrl}
323
+ auth0IssuerBaseUrl: https://${auth0Domain}
324
+ auth0ClientId: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_ID
325
+ graphqlClientUrl: https://${siteHost}/api/graphql
326
+ graphqlServerUrl: https://${siteHost}/api/graphql
327
+ connectUrl: https://${connectURL}
328
+ coreUrl: https://${coreURL}
329
+ env:
330
+ AUTH0_AUDIENCE: core-api-access
331
+ AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_SECRET
332
+ AUTH0_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_SECRET
333
+ ${
334
+ useS3 === true || useS3 === 'true'
335
+ ? `
336
+ AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
337
+ AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
338
+ AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
339
+ image:
340
+ repository: registry.paperout.com/docupace-ui-main-dev-docker-local/cc-ui-app
341
+ tag: ${imageTag}
342
+ imagePullSecrets:
343
+ - name: jf-artifactory
344
+ ingress:
345
+ enabled: true
346
+ className: nginx
347
+ annotations:
348
+ external-dns.alpha.kubernetes.io/hostname: ${ccUrl}
349
+ external-dns.alpha.kubernetes.io/zone: public
350
+ cert-manager.io/cluster-issuer: letsencrypt
351
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
352
+ hosts:
353
+ - host: ${ccUrl}
354
+ paths:
355
+ - path: /
356
+ pathType: Prefix
357
+ tls:
358
+ - hosts:
359
+ - ${ccUrl}
360
+ secretName: dp-cc-ui-cert
361
+ `.trim()
362
+ : ''
363
+ }
364
+ ${
365
+ useS3 === true || useS3 === 'true'
366
+ ? `
367
+ serviceAccount:
368
+ create: true
369
+ annotations:
370
+ eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket
371
+ `.trim()
372
+ : ''
373
+ }
374
+ `.trim();
375
+
376
+ console.log('Writing configuration files...');
377
+ await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
378
+
379
+ await fs.writeFile(
380
+ `${repoPath}/dp/${site}/cc.app.yaml`,
381
+ uiССAppYaml,
382
+ (err) => {
383
+ if (err) {
384
+ console.error('Failed to write the file:', err);
385
+ } else {
386
+ console.log('File written successfully.');
387
+ }
388
+ },
389
+ );
390
+
391
+ await fs.writeFile(
392
+ `${repoPath}/dp/${site}/cc.values.yaml`,
393
+ uiССValuesYaml,
394
+ (err) => {
395
+ if (err) {
396
+ console.error('Failed to write the file:', err);
397
+ } else {
398
+ console.log('File written successfully.');
399
+ }
400
+ },
401
+ );
402
+ console.log('Done!');
403
+ console.log('Updating Core Site Config...');
404
+ await updateCoreSiteConfig(site, env, useS3);
405
+ } catch (error) {
406
+ console.error('Error configuring UI:', error);
407
+ }
408
+ }
409
+
410
+ export async function cleanAndWritePropertiesFile(configPath, content) {
411
+ try {
412
+ const cleanedContent = content
413
+ .split('\n')
414
+ .map((line) => line.trim())
415
+ .filter((line) => line !== '')
416
+ .join('\n');
417
+
418
+ await fs.writeFile(configPath, cleanedContent, 'utf8');
419
+ console.log(`Cleaned and written file to: ${configPath}`);
420
+ } catch (error) {
421
+ console.error('Error writing properties file:', error.message);
422
+ process.exit(1);
423
+ }
424
+ }
425
+
426
+ export async function updateCoreSiteConfig(site, env, useS3) {
427
+ try {
428
+ const coreSiteEnv = coreSiteEnvMap[env];
429
+
430
+ const coreSiteConfigRepoPath = await cloneRepository(
431
+ `${coreSiteEnv}-site-settings`,
432
+ );
433
+
434
+ const configPath = path.join(
435
+ `${coreSiteEnv}-site-settings`,
436
+ site.toUpperCase(),
437
+ 'docucore-nextUI.properties',
438
+ );
439
+
440
+ let siteAWSSecrets = null;
441
+
442
+ if (useS3 === true || useS3 === 'true') {
443
+ const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
444
+ siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
445
+ console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
446
+ }
447
+
448
+ const coreSiteConfig = `
449
+ ${
450
+ siteAWSSecrets
451
+ ? `
452
+ com.docupace.imports.files.FilesImportConfig.aws.accessKeyId=${siteAWSSecrets.AWS_ACCESS_KEY_ID}
453
+ com.docupace.imports.files.FilesImportConfig.aws.accessKeySecret=${siteAWSSecrets.AWS_SECRET_ACCESS_KEY}
454
+ com.docupace.imports.files.FilesImportConfig.aws.region=${siteAWSSecrets.AWS_REGION}
455
+ `.trim()
456
+ : ''
457
+ }
458
+ `;
459
+
460
+ await fs.ensureDir(path.join(coreSiteConfigRepoPath, site.toUpperCase()));
461
+ await cleanAndWritePropertiesFile(configPath, coreSiteConfig);
462
+ await pushDeployConfig(
463
+ coreSiteConfigRepoPath,
464
+ `Core config: docucore-nextUI.properties for site: (${site.toUpperCase()}) update in env: (${env})`,
465
+ );
466
+ } catch (error) {
467
+ console.error('Error:', error.message);
468
+ process.exit(1);
469
+ }
470
+ }
471
+
472
+ async function configureGraphQLServer(
473
+ siteHost,
474
+ coreURL,
475
+ docupaceHost,
476
+ site,
477
+ env,
478
+ auth0Domain,
479
+ auth0ClientId,
480
+ auth0ClientSecret,
481
+ auth0Token,
482
+ vaultSiteSecretsPath,
483
+ imageTag,
484
+ standardConfigRemoteBranch,
485
+ repoPath,
486
+ commonSecrets,
487
+ ) {
488
+ siteHost = siteHost.replace('https://', '');
489
+ coreURL = coreURL.replace('https://', '');
490
+ console.log(
491
+ `Configuring GraphQL Server for site: ${site} Host: ${siteHost} in env: ${env}`,
492
+ );
493
+
494
+ try {
495
+ const auth0Response = await axios.get(
496
+ `https://${auth0Domain}/api/v2/clients`,
497
+ {
498
+ headers: { authorization: `Bearer ${auth0Token}` },
499
+ },
500
+ );
501
+
502
+ const graphQLServerClient = auth0Response.data.find(
503
+ (client) => client.name === 'docupace-graphql',
504
+ );
505
+ const graphQLServerClientCredentials = auth0Response.data.find(
506
+ (client) => client.name === 'docupace-graphql-client-credentials',
507
+ );
508
+
509
+ const graphQLServerAuth0ClientId = graphQLServerClient.client_id;
510
+ const graphQLServerAuth0ClientSecret = graphQLServerClient.client_secret;
511
+
512
+ const graphQLServerCCAuth0ClientId =
513
+ graphQLServerClientCredentials.client_id;
514
+ const graphQLServerCCAuth0ClientSecret =
515
+ graphQLServerClientCredentials.client_secret;
516
+
517
+ // Prepare data payload
518
+ console.log('Preparing Vault GraphQL Server data payload...');
519
+ const graphQLServerSecretData = JSON.stringify({
520
+ data: {
521
+ AUTH0_CLIENT_ID: graphQLServerAuth0ClientId,
522
+ AUTH0_CLIENT_SECRET: graphQLServerAuth0ClientSecret,
523
+ AUTH0_CC_CLIENT_ID: graphQLServerCCAuth0ClientId,
524
+ AUTH0_CC_CLIENT_SECRET: graphQLServerCCAuth0ClientSecret,
525
+ CORE_PASSWORD: commonSecrets.CORE_PASSWORD,
526
+ REMOTE_CONFIG_PATH: commonSecrets.REMOTE_CONFIG_PATH,
527
+ STANDARD_CONFIG_REMOTE_PATH: commonSecrets.STANDARD_CONFIG_REMOTE_PATH,
528
+ },
529
+ });
530
+
531
+ await updateVaultSecrets(vaultSiteSecretsPath, graphQLServerSecretData);
532
+
533
+ // Prepare ui.app.yaml
534
+ const graphQLServerAppYaml = `
535
+ repo: docupace-graphql-server
536
+ revision: ${standardConfigRemoteBranch}
537
+ `.trim();
538
+
539
+ // Prepare ui.values.yaml
540
+ const graphQLServerValuesYaml = `
541
+ graphqlServer:
542
+ auth0Domain: https://${auth0Domain}
543
+ auth0ClientId: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_ID
544
+ auth0Audience: ${commonSecrets.CORE_API_IDENTIFIER}
545
+ baseUrl: https://${siteHost}/api/graphql
546
+ coreUrl: https://${coreURL}
547
+ integrationHubUrl: "https://${commonSecrets.INTEGRATION_HUB_URL}"
548
+ standardConfigRemoteBranch: ${standardConfigRemoteBranch}
549
+ apiLevel: "2"
550
+ env:
551
+ AUTH0_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_SECRET
552
+ STANDARD_CONFIG_REMOTE_PATH: vault:secret/data/common/config#STANDARD_CONFIG_REMOTE_PATH
553
+ SITE_CONFIG_REMOTE_PATH: vault:secret/data/${site}/common/config#SITE_CONFIG_REMOTE_PATH
554
+ AUTH0_CC_CLIENT_ID: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_ID
555
+ AUTH0_CC_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_SECRET
556
+ image:
557
+ repository: registry.paperout.com/docupace-graphql-server-dev-docker-local/docupace-graphql-server
558
+ tag: ${imageTag}
559
+ imagePullSecrets:
560
+ - name: jf-artifactory
561
+ ingress:
562
+ annotations:
563
+ external-dns.alpha.kubernetes.io/hostname: ${siteHost}
564
+ external-dns.alpha.kubernetes.io/zone: public
565
+ cert-manager.io/cluster-issuer: letsencrypt
566
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
567
+ enabled: true
568
+ className: nginx
569
+ hosts:
570
+ - host: ${siteHost}
571
+ paths:
572
+ - path: /api/graphql
573
+ pathType: Prefix
574
+ tls:
575
+ - hosts:
576
+ - ${siteHost}
577
+ secretName: dp-next-ui-cert
578
+ `.trim();
579
+
580
+ // Write configuration files
581
+ console.log('Writing ArgoCD GraphQL Server configuration files...');
582
+ await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
583
+
584
+ await fs.writeFile(
585
+ `${repoPath}/dp/${site}/graphql-server.app.yaml`,
586
+ graphQLServerAppYaml,
587
+ (err) => {
588
+ if (err) {
589
+ console.error('Failed to write the file:', err);
590
+ } else {
591
+ console.log('File written successfully.');
592
+ }
593
+ },
594
+ );
595
+
596
+ await fs.writeFile(
597
+ `${repoPath}/dp/${site}/graphql-server.values.yaml`,
598
+ graphQLServerValuesYaml,
599
+ (err) => {
600
+ if (err) {
601
+ console.error('Failed to write the file:', err);
602
+ } else {
603
+ console.log('File written successfully.');
604
+ }
605
+ },
606
+ );
607
+ console.log('Done!');
608
+ } catch (error) {
609
+ console.error('Error configuring GraphQL Server:', error);
610
+ }
611
+ }
612
+
613
+ export async function configureFromSite(
614
+ fromSite,
615
+ toSite,
616
+ fromEnv,
617
+ toEnv,
618
+ deployUI,
619
+ deployGraphQLServer,
620
+ useNewDomain,
621
+ useS3,
622
+ deployCCUI,
623
+ ) {
624
+ console.log(
625
+ `Configuring Auth0 tenants and ArgoCD apps for site: ${toSite} in env: ${toEnv} from site: ${fromSite}`,
626
+ );
627
+ // Common Secrets
628
+ const commonSecretsPath = getVaultSecretsConfigs(toSite).commonSecretsPath;
629
+ console.log(`commonSecretsPath => ${commonSecretsPath}`);
630
+ const commonSecrets = await getVaultSecrets(commonSecretsPath);
631
+
632
+ // Site Common Secrets
633
+ const siteCommonSecretsPath =
634
+ getVaultSecretsConfigs(toSite).siteCommonSecretsPath;
635
+ console.log(`siteCommonSecretsPath => ${siteCommonSecretsPath}`);
636
+ const siteCommonSecrets = await getVaultSecrets(siteCommonSecretsPath);
637
+
638
+ const auth0Domain = `docupace-${toEnv}-${toSite}.us.auth0.com`;
639
+ const auth0ClientId = siteCommonSecrets.AUTH0_CLIENT_ID;
640
+ const auth0ClientSecret = siteCommonSecrets.AUTH0_CLIENT_SECRET;
641
+ const auth0Token = await getAuth0AuthToken(
642
+ auth0Domain,
643
+ auth0ClientId,
644
+ auth0ClientSecret,
645
+ );
646
+
647
+ // UI MAIN app
648
+ const uiSecretsPath = getVaultSecretsConfigs(toSite).uiSecretsPath;
649
+ console.log(`uiSecretsPath => ${uiSecretsPath}`);
650
+
651
+ // UI CC app
652
+ const ccUISecretsPath = getVaultSecretsConfigs(toSite).ccUISecretsPath;
653
+ console.log(`ccUISecretsPath => ${ccUISecretsPath}`);
654
+
655
+ // GraphQL-Server app
656
+ const graphqlSecretsPath =
657
+ getVaultSecretsConfigs(toSite).graphqlServerSecretsPath;
658
+ console.log(`graphqlSecretsPath => ${graphqlSecretsPath}`);
659
+
660
+ let repoPathFromEnv = '';
661
+ let repoPathToEnv = '';
662
+ // Clone repositories
663
+ if (fromEnv === toEnv) {
664
+ repoPathFromEnv = await cloneEnvRepository(fromEnv);
665
+ repoPathToEnv = repoPathFromEnv;
666
+ } else {
667
+ repoPathFromEnv = await cloneEnvRepository(fromEnv);
668
+ repoPathToEnv = await cloneEnvRepository(toEnv);
669
+ }
670
+
671
+ //TODO: clone fromEnv and toEnv. replace above with this
672
+
673
+ // const auth0RepoPath = await cloneRepository('auth0-site-setup');
674
+
675
+ // Read deploy configs
676
+ const { deployConfig: deployUIConfig } = await readDeployConfig(
677
+ 'ui',
678
+ fromEnv,
679
+ fromSite,
680
+ 'values',
681
+ );
682
+ const uiImageTag = deployUIConfig.image.tag;
683
+
684
+ const { deployConfig: deployGraphQLServerConfig } = await readDeployConfig(
685
+ 'graphql-server',
686
+ fromEnv,
687
+ fromSite,
688
+ 'values',
689
+ );
690
+ const graphqlImageTag = deployGraphQLServerConfig.image.tag;
691
+ const graphqlStandardConfigRemoteBranch =
692
+ deployGraphQLServerConfig.graphqlServer.standardConfigRemoteBranch;
693
+
694
+ console.log(
695
+ `Copying Latest UI Image Tag: ${deployUIConfig.image.tag} from site: ${fromSite} to site: ${toSite}`,
696
+ );
697
+ console.log(
698
+ `Copying Latest GraphQL Server Image Tag: ${deployGraphQLServerConfig.image.tag} from site: ${fromSite} to site: ${toSite}`,
699
+ );
700
+
701
+ const envConfig = environmentConfig[toEnv];
702
+
703
+ let CORE_URL, SITE_HOST, CORE_API_CONTEXT, CONNECT_URL, DOCUPACE_HOST;
704
+ const newUrl = envConfig.newUrl(toSite);
705
+ const ccUrl = envConfig.ccUrl(toSite);
706
+
707
+ SITE_HOST = `${newUrl}`;
708
+
709
+ if (useNewDomain === true || useNewDomain === 'true') {
710
+ const newUrl = envConfig.newUrl(toSite);
711
+ CORE_URL = `${newUrl}/core`;
712
+ // SITE_HOST = newUrl;
713
+ CORE_API_CONTEXT = 'core';
714
+ CONNECT_URL = `${newUrl}/connect`;
715
+ DOCUPACE_HOST = envConfig.docupaceHost();
716
+ } else {
717
+ const oldUrl = envConfig.oldUrl(toSite);
718
+ CORE_URL = oldUrl;
719
+ // SITE_HOST = oldUrl;
720
+ CORE_API_CONTEXT = toSite;
721
+ CONNECT_URL = `${oldUrl}_ui`;
722
+ }
723
+
724
+ if (deployUI === true || deployUI === 'true') {
725
+ await configureUI(
726
+ SITE_HOST,
727
+ CORE_URL,
728
+ CONNECT_URL,
729
+ DOCUPACE_HOST,
730
+ toSite,
731
+ toEnv,
732
+ auth0Domain,
733
+ auth0ClientId,
734
+ auth0ClientSecret,
735
+ auth0Token,
736
+ uiSecretsPath,
737
+ uiImageTag,
738
+ repoPathToEnv,
739
+ useS3,
740
+ );
741
+ }
742
+
743
+ if (deployCCUI === true || deployCCUI === 'true') {
744
+ await configureCCUI(
745
+ SITE_HOST,
746
+ CORE_URL,
747
+ CONNECT_URL,
748
+ DOCUPACE_HOST,
749
+ toSite,
750
+ toEnv,
751
+ auth0Domain,
752
+ auth0ClientId,
753
+ auth0ClientSecret,
754
+ auth0Token,
755
+ ccUISecretsPath,
756
+ uiImageTag,
757
+ repoPathToEnv,
758
+ useS3,
759
+ ccUrl,
760
+ );
761
+ }
762
+
763
+ await configureGraphQLServer(
764
+ SITE_HOST,
765
+ CORE_URL,
766
+ DOCUPACE_HOST,
767
+ toSite,
768
+ toEnv,
769
+ auth0Domain,
770
+ auth0ClientId,
771
+ auth0ClientSecret,
772
+ auth0Token,
773
+ graphqlSecretsPath,
774
+ graphqlImageTag,
775
+ graphqlStandardConfigRemoteBranch,
776
+ repoPathToEnv,
777
+ commonSecrets,
778
+ );
779
+ await pushDeployConfig(
780
+ repoPathToEnv,
781
+ `Config update for ${toSite} from ${fromSite} with UI: ${uiImageTag} and GraphQL: ${graphqlImageTag}`,
782
+ );
783
+ }