diff --git a/package-lock.json b/package-lock.json index ae20eeb60..e662a8b15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@modelcontextprotocol/client": "^2.0.0", "@modelcontextprotocol/node": "^2.0.0", "@modelcontextprotocol/server": "^2.0.0", - "@rockcarver/frodo-lib": "4.3.3", + "@rockcarver/frodo-lib": "4.4.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -1908,9 +1908,9 @@ } }, "node_modules/@rockcarver/frodo-lib": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.3.3.tgz", - "integrity": "sha512-we+K7ONOTXdIaHSDAhOWp9yPLctUcLqQ23M/nVuHK7GHqBxdNHrBWQlYmiidbP+0t9/EcO/2Ey9tup4ItkDrCg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.4.0.tgz", + "integrity": "sha512-mE8uB+51bKziDjwEyaB/far1Re9wPV+bS1ULeLLpQtKiU4trKcmiMjCFGoEbzKKDInSoJvY1cUiikdCVOlys7Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index eb5701c60..857e0f7f0 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "@modelcontextprotocol/client": "^2.0.0", "@modelcontextprotocol/node": "^2.0.0", "@modelcontextprotocol/server": "^2.0.0", - "@rockcarver/frodo-lib": "4.3.3", + "@rockcarver/frodo-lib": "4.4.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", diff --git a/src/cli/FrodoCommand.ts b/src/cli/FrodoCommand.ts index b72d67b45..524aa1a6d 100644 --- a/src/cli/FrodoCommand.ts +++ b/src/cli/FrodoCommand.ts @@ -2,6 +2,7 @@ import { frodo, FrodoError, state } from '@rockcarver/frodo-lib'; import { RetryStrategy } from '@rockcarver/frodo-lib/types/api/BaseApi.js'; import { AddHelpTextContext, Argument, Command, Help, Option } from 'commander'; import fs from 'fs'; +import propertiesReader from 'properties-reader'; import { cleanupProgressIndicators, @@ -427,6 +428,19 @@ function cloneArgument(argument: Argument): Argument { return cloned; } +/** + * Option that collects repeated values into an array. + */ +export class ListOption extends Option { + constructor(flags: string, description?: string) { + super(flags, description); + this.argParser((value: string, previous: string[] = []) => { + previous.push(value); + return previous; + }).default([]); + } +} + export const hostArgument = new Argument( '[host]', 'AM base URL, e.g.: https://cdk.iam.example.com/am. To use a connection profile, just specify a unique substring or alias.' @@ -523,6 +537,22 @@ const directoryOption = withHelpGroup( RUNTIME_OPTIONS_HEADING ); +const envOption = withHelpGroup( + new ListOption( + '-E, --env ', + 'Set an environment variable for placeholder resolution. May be specified multiple times. Overrides values from --env-file.' + ), + RUNTIME_OPTIONS_HEADING +); + +const envFileOption = withHelpGroup( + new ListOption( + '--env-file ', + 'Read environment variables from a file for placeholder resolution. May be specified multiple times; later files override earlier ones.' + ), + RUNTIME_OPTIONS_HEADING +); + const insecureOption = withHelpGroup( new Option( '-k, --insecure', @@ -631,6 +661,8 @@ const defaultOpts = [ flushCacheOption, retryOption, useRealmPrefixOnManagedObjects, + envOption, + envFileOption, ]; /** @@ -715,6 +747,31 @@ const stateMap = { [retryOption.attributeName()]: (strategy: RetryStrategy) => { state.setAxiosRetryStrategy(strategy); }, + [envFileOption.attributeName()]: (files: string[]) => { + for (const filePath of files) { + try { + propertiesReader(filePath).each((key: string, value: string) => { + state.setEnv(key, value); + }); + } catch (error) { + throw new FrodoError(`Error parsing env file ${filePath}`, error); + } + } + }, + [envOption.attributeName()]: (envs: string[]) => { + for (const env of envs) { + const separatorIndex = env.indexOf('='); + if (separatorIndex < 0) { + throw new FrodoError( + `Invalid env format; expected "key=value" but got "${env}"` + ); + } + state.setEnv( + env.substring(0, separatorIndex), + env.substring(separatorIndex + 1) + ); + } + }, }; /** @@ -2449,7 +2506,13 @@ export class FrodoCommand extends FrodoStubCommand { } // handle options - for (const [k, v] of Object.entries(options)) { + for (const [k, v] of Object.entries(options).sort(([k1], [k2]) => { + if (k1 === envFileOption.attributeName()) return -1; + if (k2 === envFileOption.attributeName()) return 1; + if (k1 === envOption.attributeName()) return -1; + if (k2 === envOption.attributeName()) return 1; + return 0; + })) { // handle only default options if (Object.keys(stateMap).includes(k)) { debugMessage( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts index e02521a55..c9b9d75e5 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity access-config'); - const outcome = await configManagerExportAccessConfig(options.envFile); + const outcome = await configManagerExportAccessConfig(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts index cef4b6e9f..ef6827166 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity audit'); - const outcome = await configManagerExportAudit(options.envFile); + const outcome = await configManagerExportAudit(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts index a13aa9152..8ba2bffde 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity kba-config'); - const outcome = await configManagerExportKbaConfig(options.envFile); + const outcome = await configManagerExportKbaConfig(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts index 02caebd42..c5594e476 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity remote-servers'); - const outcome = await configManagerExportRemoteServers(options.envFile); + const outcome = await configManagerExportRemoteServers(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts index 40dafdf17..d57273473 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity ui-configuration'); - const outcome = await configManagerExportUiConfig(options.envFile); + const outcome = await configManagerExportUiConfig(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-variables.ts b/src/cli/config-manager/config-manager-push/config-manager-push-variables.ts new file mode 100644 index 000000000..fb88730cd --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-variables.ts @@ -0,0 +1,48 @@ +import { frodo } from '@rockcarver/frodo-lib'; +import { Option } from 'commander'; + +import { configManagerImportVariables } from '../../../configManagerOps/FrConfigVariableOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push variables', + [], + deploymentTypes + ); + program + .description('Import variables.') + .addOption( + new Option( + '-n, --name ', + 'Variable name; import only the specified variable. If omitted, all variables are imported.' + ) + ) + + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing variables'); + const outcome = await configManagerImportVariables(options.name); + if (!outcome) process.exitCode = 1; + }); + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index f900b92d2..542ec2c7e 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -27,6 +27,7 @@ import ServiceObjects from './config-manager-push-service-objects'; import TermsAndConditions from './config-manager-push-terms-and-conditions'; import Themes from './config-manager-push-themes'; import UiConfig from './config-manager-push-ui-config'; +import Variables from './config-manager-push-variables'; export default function setup() { const program = new FrodoStubCommand('push').description( @@ -60,6 +61,7 @@ export default function setup() { program.addCommand(CSP().name('csp')); program.addCommand(Restart().name('restart')); program.addCommand(Journeys().name('journeys')); + program.addCommand(Variables().name('variables')); return program; } diff --git a/src/cli/idm/idm-export.ts b/src/cli/idm/idm-export.ts index 76ce6cdd3..b4549dac7 100644 --- a/src/cli/idm/idm-export.ts +++ b/src/cli/idm/idm-export.ts @@ -38,11 +38,10 @@ export default function setup() { ) .addOption( new Option( - '-E, --entities-file [entities-file]', + '-e, --entities-file [entities-file]', 'Name of the entity file. Ignored with -i.' ) ) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-a, --all', @@ -99,7 +98,6 @@ export default function setup() { const outcome = await exportConfigEntityToFile( options.entityId, options.file, - options.envFile, options.metadata, options.extract ); @@ -115,7 +113,6 @@ export default function setup() { const outcome = await exportAllConfigEntitiesToFile( options.file, options.entitiesFile, - options.envFile, options.metadata ); if (!outcome) process.exitCode = 1; @@ -140,7 +137,6 @@ export default function setup() { ); const outcome = await exportAllConfigEntitiesToFiles( options.entitiesFile, - options.envFile, options.metadata, options.extract ); diff --git a/src/cli/idm/idm-import.ts b/src/cli/idm/idm-import.ts index 967e66d0c..a3f0d52e9 100644 --- a/src/cli/idm/idm-import.ts +++ b/src/cli/idm/idm-import.ts @@ -48,11 +48,10 @@ export default function setup() { .addOption(new Option('-f, --file [file]', 'Import file. Ignored with -A.')) .addOption( new Option( - '-E, --entities-file [entities-file]', + '-e, --entities-file [entities-file]', 'Name of the entity file. Ignored with -i.' ) ) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-a, --all', @@ -103,8 +102,7 @@ export default function setup() { ); const outcome = await importConfigEntityByIdFromFile( options.entityId, - options.file, - options.envFile + options.file ); if (!outcome) process.exitCode = 1; } @@ -119,8 +117,7 @@ export default function setup() { ); const outcome = await importAllConfigEntitiesFromFile( options.file, - options.entitiesFile, - options.envFile + options.entitiesFile ); if (!outcome) process.exitCode = 1; } @@ -132,10 +129,7 @@ export default function setup() { verboseMessage( `Importing first object${envMessage}${fileMessage}...` ); - const outcome = await importFirstConfigEntityFromFile( - options.file, - options.envFile - ); + const outcome = await importFirstConfigEntityFromFile(options.file); if (!outcome) process.exitCode = 1; } // require --directory -D for all-separate functions @@ -156,8 +150,7 @@ export default function setup() { `Importing IDM configuration objects${entitiesMessage}${envMessage}${directoryMessage}` ); const outcome = await importAllConfigEntitiesFromFiles( - options.entitiesFile, - options.envFile + options.entitiesFile ); if (!outcome) process.exitCode = 1; } diff --git a/src/cli/idm/idm-schema-object-export.ts b/src/cli/idm/idm-schema-object-export.ts index 559402c38..04cbea003 100644 --- a/src/cli/idm/idm-schema-object-export.ts +++ b/src/cli/idm/idm-schema-object-export.ts @@ -51,7 +51,6 @@ export default function setup() { 'Export file if -x or -a are included. Ignored with -A.' ) ) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-N, --no-metadata', @@ -93,7 +92,6 @@ export default function setup() { const outcome = await exportManagedObjectToFile( options.individualObject, options.file, - options.envFile, options.extract ); if (!outcome) process.exitCode = 1; @@ -108,7 +106,6 @@ export default function setup() { const outcome = await exportConfigEntityToFile( 'managed', options.file, - options.envFile, options.metadata, false ); @@ -124,7 +121,6 @@ export default function setup() { const outcome = await exportConfigEntityToFile( 'managed', options.file, - options.envFile, options.metadata, true ); diff --git a/src/cli/idm/idm-schema-object-import.ts b/src/cli/idm/idm-schema-object-import.ts index eaf8a175d..22e343122 100644 --- a/src/cli/idm/idm-schema-object-import.ts +++ b/src/cli/idm/idm-schema-object-import.ts @@ -28,7 +28,6 @@ export default function setup() { program .description('Import IDM configuration managed objects.') .addOption(new Option('-f, --file [file]', 'Import file.')) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-i, --individual-object', @@ -73,8 +72,7 @@ export default function setup() { ); const outcome = await importManagedObjectFromFile( options.file, - undefined, - options.envFile + undefined ); if (!outcome) process.exitCode = 1; } else if ( @@ -86,8 +84,7 @@ export default function setup() { ); const outcome = await importConfigEntityByIdFromFile( 'managed', - options.file, - options.envFile + options.file ); if (!outcome) process.exitCode = 1; } else if ( @@ -97,10 +94,7 @@ export default function setup() { verboseMessage( `Importing IDM configuration objects ${envMessage}${directoryMessage}` ); - const outcome = await importAllConfigEntitiesFromFiles( - undefined, - options.envFile - ); + const outcome = await importAllConfigEntitiesFromFiles(undefined); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/promote/promote.ts b/src/cli/promote/promote.ts index 1c7dd09e2..e7ab814d4 100644 --- a/src/cli/promote/promote.ts +++ b/src/cli/promote/promote.ts @@ -37,7 +37,7 @@ export default function setup() { ) .addOption( new Option( - '-E, --frodo-export-dir ', + '-e, --frodo-export-dir ', 'The directory where the frodo export is located.' ) ) diff --git a/src/configManagerOps/FrConfigAccessConfigOps.ts b/src/configManagerOps/FrConfigAccessConfigOps.ts index 5dbcb81ed..a4252b4d6 100644 --- a/src/configManagerOps/FrConfigAccessConfigOps.ts +++ b/src/configManagerOps/FrConfigAccessConfigOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportAccessConfig( - envFile?: string -): Promise { +export async function configManagerExportAccessConfig(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('access', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['access']; - + const exportData = await readConfigEntity('access'); saveJsonToFile( exportData, getFilePath('access-config/access.json', true), diff --git a/src/configManagerOps/FrConfigAuditOps.ts b/src/configManagerOps/FrConfigAuditOps.ts index 3d794f007..d64e5f4bb 100644 --- a/src/configManagerOps/FrConfigAuditOps.ts +++ b/src/configManagerOps/FrConfigAuditOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportAudit( - envFile?: string -): Promise { +export async function configManagerExportAudit(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('audit', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['audit']; - + const exportData = await readConfigEntity('audit'); saveJsonToFile(exportData, getFilePath('audit/audit.json', true), false); return true; } catch (error) { diff --git a/src/configManagerOps/FrConfigEntityOps.ts b/src/configManagerOps/FrConfigEntityOps.ts index e74a22960..b3743c12d 100644 --- a/src/configManagerOps/FrConfigEntityOps.ts +++ b/src/configManagerOps/FrConfigEntityOps.ts @@ -1,28 +1,17 @@ import { frodo } from '@rockcarver/frodo-lib'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity } = frodo.idm.config; +const { readConfigEntity } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportConfigEntity( - envFile?: string -): Promise { +export async function configManagerExportConfigEntity(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('ui/configuration', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['ui/configuration']; - + const exportData = await readConfigEntity('ui/configuration'); saveJsonToFile( exportData, getFilePath('ui-configuration.json', true), diff --git a/src/configManagerOps/FrConfigKbaOps.ts b/src/configManagerOps/FrConfigKbaOps.ts index 79d8e7daa..4fb9f3a4a 100644 --- a/src/configManagerOps/FrConfigKbaOps.ts +++ b/src/configManagerOps/FrConfigKbaOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportKbaConfig( - envFile?: string -): Promise { +export async function configManagerExportKbaConfig(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('selfservice.kba', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['selfservice.kba']; - + const exportData = await readConfigEntity('selfservice.kba'); saveJsonToFile( exportData, getFilePath('kba/selfservice.kba.json', true), diff --git a/src/configManagerOps/FrConfigPasswordPolicyOps.ts b/src/configManagerOps/FrConfigPasswordPolicyOps.ts index 78d84d94f..9f9d9f78c 100644 --- a/src/configManagerOps/FrConfigPasswordPolicyOps.ts +++ b/src/configManagerOps/FrConfigPasswordPolicyOps.ts @@ -1,43 +1,31 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; import { realmList } from '../utils/FrConfig'; const { getFilePath, saveJsonToFile } = frodo.utils; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; /** * Export IDM password policy configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function configManagerExportPasswordPolicy( - realm?: string, - envFile?: string + realm?: string ): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); if (realm && realm !== '__default__realm__') { - const realmData = ( - await exportConfigEntity(`fieldPolicy/${realm}_user`, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm[`fieldPolicy/${realm}_user`]; + const realmData = await readConfigEntity(`fieldPolicy/${realm}_user`); const fileName = `realms/${realm}/password-policy/${realm}_user-password-policy.json`; saveJsonToFile(realmData, getFilePath(fileName, true), false, true); } else { for (const realmName of await realmList()) { // fr-config-manager doesn't support root themes if (realmName === '/') continue; - const realmData = ( - await exportConfigEntity(`fieldPolicy/${realmName}_user`, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm[`fieldPolicy/${realmName}_user`]; + const realmData = await readConfigEntity( + `fieldPolicy/${realmName}_user` + ); const fileName = `realms/${realmName}/password-policy/${realmName}_user-password-policy.json`; saveJsonToFile(realmData, getFilePath(fileName, true), false, true); } diff --git a/src/configManagerOps/FrConfigRemoteServersOps.ts b/src/configManagerOps/FrConfigRemoteServersOps.ts index 4a140c5de..e540a96b4 100644 --- a/src/configManagerOps/FrConfigRemoteServersOps.ts +++ b/src/configManagerOps/FrConfigRemoteServersOps.ts @@ -1,29 +1,20 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportRemoteServers( - envFile?: string -): Promise { +export async function configManagerExportRemoteServers(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('provisioner.openicf.connectorinfoprovider', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['provisioner.openicf.connectorinfoprovider']; - + const exportData = await readConfigEntity( + 'provisioner.openicf.connectorinfoprovider' + ); saveJsonToFile( exportData, getFilePath( diff --git a/src/configManagerOps/FrConfigUiConfigOps.ts b/src/configManagerOps/FrConfigUiConfigOps.ts index c2aecb87f..70fd9318c 100644 --- a/src/configManagerOps/FrConfigUiConfigOps.ts +++ b/src/configManagerOps/FrConfigUiConfigOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportUiConfig( - envFile?: string -): Promise { +export async function configManagerExportUiConfig(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('ui/configuration', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['ui/configuration']; - + const exportData = await readConfigEntity('ui/configuration'); saveJsonToFile( exportData, getFilePath('ui/ui-configuration.json', true), diff --git a/src/configManagerOps/FrConfigVariableOps.ts b/src/configManagerOps/FrConfigVariableOps.ts index b4ed54637..4b550edb0 100644 --- a/src/configManagerOps/FrConfigVariableOps.ts +++ b/src/configManagerOps/FrConfigVariableOps.ts @@ -1,16 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import { VariableSkeleton } from '@rockcarver/frodo-lib/types/api/cloud/VariablesApi'; +import fs from 'fs'; import { createProgressIndicator, printError, + printMessage, stopProgressIndicator, updateProgressIndicator, } from '../utils/Console'; import { escapePlaceholders, esvToEnv } from '../utils/FrConfig'; -const { getFilePath, saveJsonToFile } = frodo.utils; -const { readVariables } = frodo.cloud.variable; +const { getFilePath, saveJsonToFile, readJsonFile } = frodo.utils; +const { readVariables, importVariables } = frodo.cloud.variable; /** * Export all variables to seperate files @@ -71,3 +73,100 @@ export async function configManagerExportVariables(): Promise { } return false; } + +/** + * Import variables to tenant + * @param { string } variableName name of the variable to import + * @returns {Promise} true if successful, false otherwise + */ +export async function configManagerImportVariables( + variableName?: string +): Promise { + let indicatorId: string; + + const spinnerId = createProgressIndicator( + 'indeterminate', + 0, + `Reading variables...` + ); + + try { + const variablesDir = getFilePath(`esvs/variables`); + if (!fs.existsSync(variablesDir)) { + stopProgressIndicator(spinnerId, `No variables directory found`, 'fail'); + return false; + } + + const fileNames = fs + .readdirSync(variablesDir) + .filter((name) => name.toLowerCase().endsWith('.json')) + .filter((name) => !variableName || name === `${variableName}.json`); + + if (fileNames.length === 0) { + stopProgressIndicator( + spinnerId, + variableName + ? `No matching variable found for ${variableName}` + : 'No variables found to import', + 'fail' + ); + return false; + } + + stopProgressIndicator( + spinnerId, + `Successfully read ${fileNames.length} variables.`, + 'success' + ); + + indicatorId = createProgressIndicator( + 'determinate', + fileNames.length, + 'Importing variables' + ); + + const importData = { + variable: Object.fromEntries( + fileNames.map((fileName) => { + const variable = readJsonFile( + `${variablesDir}/${fileName}` + ) as VariableSkeleton; + // valueBase64 will not be encoded by this point, so set value so it encodes on import + variable.value = variable.valueBase64; + return [variable._id, variable]; + }) + ), + }; + + const imported = await importVariables(importData); + + let unchanged = 0; + let updated = 0; + + for (const v of imported) { + if (v.loaded) { + printMessage(`Variable ${v._id} unchanged`); + unchanged++; + } else { + printMessage(`Variable ${v._id} updated`); + updated++; + } + } + + stopProgressIndicator( + indicatorId, + `${imported.length} variables imported.` + ); + + printMessage( + updated > 0 + ? `Changes made to variables: ${updated} updated, ${unchanged} unchanged` + : `No changes, (${unchanged} variable(s) already up to date)` + ); + return true; + } catch (error) { + stopProgressIndicator(indicatorId, `Error importing variables`, 'fail'); + printError(error); + return false; + } +} diff --git a/src/ops/IdmOps.ts b/src/ops/IdmOps.ts index 139334a3c..7f0131785 100644 --- a/src/ops/IdmOps.ts +++ b/src/ops/IdmOps.ts @@ -7,7 +7,6 @@ import { } from '@rockcarver/frodo-lib/types/ops/MappingOps'; import fs from 'fs'; import path from 'path'; -import propertiesReader from 'properties-reader'; import { extractDataToFile, @@ -104,7 +103,6 @@ export type ManagedSkeleton = IdObjectSkeletonInterface & { * Export an IDM configuration object. * @param {string} id the desired configuration object * @param {string} file optional export file name (or directory name if exporting mappings separately) - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true * @param {boolean} extract true to extract idm scripts, false otherwise. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise @@ -112,16 +110,11 @@ export type ManagedSkeleton = IdObjectSkeletonInterface & { export async function exportConfigEntityToFile( id: string, file?: string, - envFile?: string, includeMeta: boolean = true, extract: boolean = false ): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = await exportConfigEntity(id, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }); + const exportData = await exportConfigEntity(id); if (!extract) { const fileName = file || getTypedFilename(`${id}`, 'idm'); saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta); @@ -157,22 +150,19 @@ export async function exportConfigEntityToFile( * Export an IDM configuration managed object. * @param {string} name the desired configuration object * @param {string} file optional export file name - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} extract true to extract idm scripts, false otherwise. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function exportManagedObjectToFile( name: string, file?: string, - envFile?: string, extract: boolean = false ): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = (await readSubConfigEntity('managed', name, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - })) as ObjectSkeleton; + const exportData = (await readSubConfigEntity( + 'managed', + name + )) as ObjectSkeleton; if (extract && extractManagedObjectScriptsToDirectory(exportData)) { const fileName = getTypedFilename(name, 'managed'); saveJsonToFile( @@ -195,21 +185,18 @@ export async function exportManagedObjectToFile( * Export all IDM configuration objects * @param {string} file file to export to * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function exportAllConfigEntitiesToFile( file?: string, entitiesFile?: string, - envFile?: string, includeMeta: boolean = true ): Promise { try { - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); const exportData = await exportConfigEntities( { - envReplaceParams: options.envReplaceParams, entitiesToExport: options.entitiesToExportOrImport, }, errorHandler @@ -229,23 +216,20 @@ export async function exportAllConfigEntitiesToFile( /** * Export all IDM configuration objects to separate files * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true * @param {boolean} extract true to extract idm scripts, false otherwise. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function exportAllConfigEntitiesToFiles( entitiesFile?: string, - envFile?: string, includeMeta: boolean = true, extract: boolean = false ): Promise { const errors: Error[] = []; try { - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); const exportData = await exportConfigEntities( { - envReplaceParams: options.envReplaceParams, entitiesToExport: options.entitiesToExportOrImport, }, errorHandler @@ -309,14 +293,12 @@ export async function exportAllConfigEntitiesToFiles( * Import an IDM configuration object by id from file. * @param {string} entityId the configuration object to import * @param {string} file optional file to import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importConfigEntityByIdFromFile( entityId: string, file?: string, - envFile?: string, validate: boolean = false ): Promise { try { @@ -356,13 +338,11 @@ export async function importConfigEntityByIdFromFile( importData.idm[entityId] = entity; } } - const options = getIdmImportExportOptions(undefined, envFile); await importConfigEntities( importData, entityId, { - envReplaceParams: options.envReplaceParams, entitiesToImport: undefined, validate, }, @@ -402,13 +382,11 @@ export async function deleteConfigEntityById( /** * Import first IDM configuration object from file. * @param {string} file optional file to import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importFirstConfigEntityFromFile( file: string, - envFile?: string, validate: boolean = false ): Promise { const filePath = getFilePath(file); @@ -463,13 +441,10 @@ export async function importFirstConfigEntityFromFile( ]); } - const options = getIdmImportExportOptions(undefined, envFile); - await importConfigEntities( importData, entityId, { - envReplaceParams: options.envReplaceParams, entitiesToImport: undefined, validate, }, @@ -492,14 +467,12 @@ export async function importFirstConfigEntityFromFile( * Import all IDM configuration objects from a single file * @param {string} file the file with the configuration objects * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importAllConfigEntitiesFromFile( file: string, entitiesFile?: string, - envFile?: string, validate: boolean = false ): Promise { let indicatorId: string; @@ -514,13 +487,12 @@ export async function importAllConfigEntitiesFromFile( 0, `Importing config entities from ${filePath}...` ); - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); await importConfigEntities( importData as ConfigEntityExportInterface, undefined, { entitiesToImport: options.entitiesToExportOrImport, - envReplaceParams: options.envReplaceParams, validate, }, errorHandler @@ -541,13 +513,11 @@ export async function importAllConfigEntitiesFromFile( /** * Import an individual managed object from a file * @param {string} file the file containing the managed object - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importManagedObjectFromFile( file: string, - envFile?: string, validate: boolean = false ): Promise { let indicatorId: string; @@ -563,10 +533,9 @@ export async function importManagedObjectFromFile( 0, `Importing config managed object from ${filePath}...` ); - const options = getIdmImportExportOptions(undefined, envFile); + const options = getIdmImportExportOptions(undefined); await importSubConfigEntity('managed', importData, { entitiesToImport: options.entitiesToExportOrImport, - envReplaceParams: options.envReplaceParams, validate, }); @@ -589,13 +558,11 @@ export async function importManagedObjectFromFile( /** * Import all IDM configuration objects from working directory * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importAllConfigEntitiesFromFiles( entitiesFile?: string, - envFile?: string, validate: boolean = false ): Promise { let indicatorId: string; @@ -607,13 +574,12 @@ export async function importAllConfigEntitiesFromFiles( 0, `Importing config entities from ${baseDirectory}...` ); - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); await importConfigEntities( importData as ConfigEntityExportInterface, undefined, { entitiesToImport: options.entitiesToExportOrImport, - envReplaceParams: options.envReplaceParams, validate, }, errorHandler @@ -721,14 +687,9 @@ export function resolveAllExtractedScriptsForImport( /** * Helper that returns options for exporting/importing IDM config entities * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {ConfigEntityExportOptions} the config export options */ -export function getIdmImportExportOptions( - entitiesFile?: string, - envFile?: string -): { - envReplaceParams: string[][]; +export function getIdmImportExportOptions(entitiesFile?: string): { entitiesToExportOrImport: string[]; } { // read list of entities to export/import @@ -738,19 +699,8 @@ export function getIdmImportExportOptions( const entriesData = JSON.parse(data); entitiesToExportOrImport = entriesData.idm; } - - // read list of configs to parameterize for environment specific values - const envReplaceParams: string[][] = []; - if (envFile) { - const envParams = propertiesReader(envFile); - envParams.each((key: string, value: string) => { - envReplaceParams.push([key, value]); - }); - } - return { entitiesToExportOrImport, - envReplaceParams, }; } diff --git a/test/client_cli/en/__snapshots__/config-manager-push-variables.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-variables.test.js.snap new file mode 100644 index 000000000..1a1e0ed0f --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-variables.test.js.snap @@ -0,0 +1,33 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push variables' should be expected english 1`] = ` +"Usage: frodo config-manager push variables [options] [host] [realm] [username] [password] + +[Experimental] Import variables. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' + or '/parent/child' otherwise. (default: "alpha" for + Identity Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + If given without a password, and it matches the username + already stored in the connection profile for the target + host, frodo uses that profile's stored password instead of + requiring it on the command line. + password Password. + +Deployment: Cloud-only + +Options: + -n, --name Variable name; import only the specified variable. If + omitted, all variables are imported. + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index 7e4d9ecd6..e0c932fb4 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -44,5 +44,6 @@ Commands: iga-workflows [Experimental] Import iga-workflows. restart [Experimental] Restart the environment. secret-mappings [Experimental] Import secret mappings. + variables [Experimental] Import variables. " `; diff --git a/test/client_cli/en/__snapshots__/idm-export.test.js.snap b/test/client_cli/en/__snapshots__/idm-export.test.js.snap index 4b31d1097..3445850fc 100644 --- a/test/client_cli/en/__snapshots__/idm-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-export.test.js.snap @@ -31,8 +31,7 @@ Options: -A, --all-separate Export all IDM configuration objects into separate JSON files in directory -D. Ignored with -i, and -a. - -e, --env-file [envfile] Name of the env file. - -E, --entities-file [entities-file] Name of the entity file. Ignored with -i. + -e, --entities-file [entities-file] Name of the entity file. Ignored with -i. -f, --file [file] Export file if -x or -a is provided. Ignored with -A. -i, --entity-id Config entity id/name. E.g. "managed", diff --git a/test/client_cli/en/__snapshots__/idm-import.test.js.snap b/test/client_cli/en/__snapshots__/idm-import.test.js.snap index 01e5bb60d..328ec7217 100644 --- a/test/client_cli/en/__snapshots__/idm-import.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-import.test.js.snap @@ -31,8 +31,7 @@ Options: -A, --all-separate Import all IDM configuration objects from separate files in directory -D. Ignored with -i, and -a. - -e, --env-file [envfile] Name of the env file. - -E, --entities-file [entities-file] Name of the entity file. Ignored with -i. + -e, --entities-file [entities-file] Name of the entity file. Ignored with -i. -f, --file [file] Import file. Ignored with -A. -i, --entity-id Config entity id/name. E.g. "managed", "sync", "provisioner-", diff --git a/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap b/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap index 4801d9e1a..89a9d3534 100644 --- a/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap @@ -29,7 +29,6 @@ Options: into a single file in directory -D. -A, --all-separate Export all IDM configuration managed objects into separate JSON files in directory -D. - -e, --env-file [envfile] Name of the env file. -f, --file [file] Export file if -x or -a are included. Ignored with -A. -i, --individual-object Export an individual managed object by diff --git a/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap b/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap index 07c27130c..7b351e7bf 100644 --- a/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap @@ -6,29 +6,28 @@ exports[`CLI help interface for 'idm schema object import' should be expected en Import IDM configuration managed objects. Arguments: - host AM base URL, e.g.: https://cdk.iam.example.com/am. - To use a connection profile, just specify a unique - substring or alias. - realm Realm. Specify realm as '/' for the root realm or - 'realm' or '/parent/child' otherwise. (default: - "alpha" for Identity Cloud tenants, "/" otherwise.) - username Username to login with. Must be an admin user with - appropriate rights to manage authentication - journeys/trees. If given without a password, and it - matches the username already stored in the - connection profile for the target host, frodo uses - that profile's stored password instead of requiring - it on the command line. - password Password. + host AM base URL, e.g.: https://cdk.iam.example.com/am. To + use a connection profile, just specify a unique + substring or alias. + realm Realm. Specify realm as '/' for the root realm or + 'realm' or '/parent/child' otherwise. (default: + "alpha" for Identity Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication + journeys/trees. If given without a password, and it + matches the username already stored in the connection + profile for the target host, frodo uses that + profile's stored password instead of requiring it on + the command line. + password Password. Options: - -e, --env-file [envfile] Name of the env file. - -f, --file [file] Import file. - -i, --individual-object Import an individual object. Requires the use of the - -f to specify the file. - -h, --help Help - -hh, --help-more Help with all options. - -hhh, --help-all Help with all options, environment variables, and - usage examples. + -f, --file [file] Import file. + -i, --individual-object Import an individual object. Requires the use of the + -f to specify the file. + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and + usage examples. " `; diff --git a/test/client_cli/en/__snapshots__/promote.test.js.snap b/test/client_cli/en/__snapshots__/promote.test.js.snap index f0f30f450..c8f87961f 100644 --- a/test/client_cli/en/__snapshots__/promote.test.js.snap +++ b/test/client_cli/en/__snapshots__/promote.test.js.snap @@ -25,7 +25,7 @@ Arguments: password Password. Options: - -E, --frodo-export-dir The directory where the frodo export is + -e, --frodo-export-dir The directory where the frodo export is located. -M, --master-dir The directory where the master configurations is located. diff --git a/test/client_cli/en/config-manager-push-variables.test.js b/test/client_cli/en/config-manager-push-variables.test.js new file mode 100644 index 000000000..65246a5ee --- /dev/null +++ b/test/client_cli/en/config-manager-push-variables.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push variables --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push variables' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); \ No newline at end of file diff --git a/test/e2e/__snapshots__/config-manager-push-variables.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-variables.e2e.test.js.snap new file mode 100644 index 000000000..4ae6c901e --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-variables.e2e.test.js.snap @@ -0,0 +1,47 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Should import variables into cloud "frodo config-manager push variables --env-file test/e2e/exports/fr-config-manager/cloud/fr-test-2.env --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables --env-file test/e2e/exports/fr-config-manager/cloud/fr-test-2.env --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 2 variables. +Variable esv-fr-var-test-2 updated +Variable esv-fr-var-test updated +• 2 variables imported. +Changes made to variables: 2 updated, 0 unchanged +" +`; + +exports[`Should import variables into cloud "frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 1 variables. +Variable esv-fr-var-test updated +• 1 variables imported. +Changes made to variables: 1 updated, 0 unchanged +" +`; + +exports[`Should import variables into cloud "frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 2 variables. +Variable esv-fr-var-test-2 updated +Variable esv-fr-var-test updated +• 2 variables imported. +Changes made to variables: 2 updated, 0 unchanged +" +`; + +exports[`Should import variables into cloud "frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20-D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20-D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 1 variables. +Variable esv-fr-var-test-2 updated +• 1 variables imported. +Changes made to variables: 1 updated, 0 unchanged +" +`; diff --git a/test/e2e/__snapshots__/idm-export.e2e.test.js.snap b/test/e2e/__snapshots__/idm-export.e2e.test.js.snap index 3ba4ff75e..017620312 100644 --- a/test/e2e/__snapshots__/idm-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idm-export.e2e.test.js.snap @@ -1,10 +1,10 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 1`] = `0`; +exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 1`] = `0`; -exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 2`] = `""`; +exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 2`] = `""`; -exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json: allIdmTestFile.json 1`] = ` +exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json: allIdmTestFile.json 1`] = ` { "idm": { "repo.ds": { @@ -67167,11 +67167,11 @@ println "Hello World!" } `; -exports[`frodo idm export "frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 1`] = `0`; +exports[`frodo idm export "frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 1`] = `0`; -exports[`frodo idm export "frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 2`] = `""`; +exports[`frodo idm export "frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 2`] = `""`; -exports[`frodo idm export "frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json: my-script.idm.json 1`] = ` +exports[`frodo idm export "frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json: my-script.idm.json 1`] = ` { "idm": { "script": { diff --git a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap index c2dd6ef6e..cbf3fd022 100644 --- a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap @@ -12,10 +12,19 @@ exports[`frodo idm import "frodo idm import --all --file all.idm.json -D test/e2 " `; +exports[`frodo idm import "frodo idm import --all --file all.idm.json -D test/e2e/exports/all": Should import all configs from the file 'all.idm.json' in directory 'test/e2e/exports/all'" 2`] = `1`; + exports[`frodo idm import "frodo idm import --all-separate --directory test/e2e/exports/all-separate/cloud/global/idm --env-file test/e2e/env/testEnvFile.env --entities-file test/e2e/env/testEntitiesFile.json": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm' according to the env and entity files" 1`] = `""`; +exports[`frodo idm import "frodo idm import --all-separate --directory test/e2e/exports/all-separate/cloud/global/idm --env-file test/e2e/env/testEnvFile.env --entities-file test/e2e/env/testEntitiesFile.json": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm' according to the env and entity files" 2`] = ` +"✔ Imported config entities +" +`; + exports[`frodo idm import "frodo idm import --entity-id script --file test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; +exports[`frodo idm import "frodo idm import --entity-id script --file test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 2`] = `""`; + exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 1`] = `""`; exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 2`] = `""`; @@ -46,6 +55,8 @@ Error updating config entity endpoint/testEndpoint2 " `; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/cloud/global/idm": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm'" 2`] = `1`; + exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 1`] = `""`; exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 2`] = ` @@ -53,10 +64,20 @@ exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/fo " `; -exports[`frodo idm import "frodo idm import -af test/e2e/exports/all/all.idm.json -e test/e2e/env/testEnvFile.env -E test/e2e/env/testEntitiesFile.json": Should import all configs from the file 'test/e2e/exports/all/all.idm.json' according to the env and entity files" 1`] = `""`; +exports[`frodo idm import "frodo idm import -af test/e2e/exports/all/all.idm.json --env-file test/e2e/env/testEnvFile.env -e test/e2e/env/testEntitiesFile.json": Should import all configs from the file 'test/e2e/exports/all/all.idm.json' according to the env and entity files" 1`] = `""`; + +exports[`frodo idm import "frodo idm import -af test/e2e/exports/all/all.idm.json --env-file test/e2e/env/testEnvFile.env -e test/e2e/env/testEntitiesFile.json": Should import all configs from the file 'test/e2e/exports/all/all.idm.json' according to the env and entity files" 2`] = ` +"✔ Imported config entities +" +`; exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 2`] = ` +"✔ Imported script from test/e2e/exports/all-separate/cloud/global/idm/script.idm.json. +" +`; + exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 1`] = `""`; exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 2`] = ` @@ -79,6 +100,10 @@ exports[`frodo idm import "frodo idm import -i managed -f test/e2e/exports/all-s exports[`frodo idm import "frodo idm import -i managed -f test/e2e/exports/all-separate/forgeops/global/idm/managed/managed.idm.json --type forgeops": Should import idm configuration 'managed'. 2`] = `""`; +exports[`frodo idm import "frodo idm import -i script --env-file test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; + +exports[`frodo idm import "frodo idm import -i script --env-file test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 2`] = `""`; + exports[`frodo idm import "frodo idm import -i script -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the directory test/e2e/exports/all-separate/cloud/global/idm" 1`] = `""`; -exports[`frodo idm import "frodo idm import -i script -e test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; +exports[`frodo idm import "frodo idm import -i script -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the directory test/e2e/exports/all-separate/cloud/global/idm" 2`] = `""`; diff --git a/test/e2e/__snapshots__/promote.e2e.test.js.snap b/test/e2e/__snapshots__/promote.e2e.test.js.snap index 2e700bd1e..ba7943ef7 100644 --- a/test/e2e/__snapshots__/promote.e2e.test.js.snap +++ b/test/e2e/__snapshots__/promote.e2e.test.js.snap @@ -1,20 +1,20 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on authentication changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on authentication changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on authentication changes 2`] = ` +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on authentication changes 2`] = ` "✔ Imported alpha realm authentication settings. ✔ Imported bravo realm authentication settings. " `; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on managedapplication changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on managedapplication changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on managedapplication changes 2`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on managedapplication changes 2`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on mapping changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on mapping changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on mapping changes 2`] = ` +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on mapping changes 2`] = ` "✖ Error importing mapping undefined Invalid mapping id undefined. Must start with 'sync/' or 'mapping/' ✖ Error importing mapping undefined @@ -24,6 +24,6 @@ Error deleting mapping undefined " `; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on variable changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on variable changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on variable changes 2`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on variable changes 2`] = `""`; diff --git a/test/e2e/config-manager-push-variables.e2e.test.js b/test/e2e/config-manager-push-variables.e2e.test.js new file mode 100644 index 000000000..d6893409c --- /dev/null +++ b/test/e2e/config-manager-push-variables.e2e.test.js @@ -0,0 +1,89 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// Cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D test/e2e/exports/fr-config-manager/cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables --env-file test/e2e/exports/fr-config-manager/cloud/fr-test-2.env --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20 -D test/e2e/exports/fr-config-manager/cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud + +*/ + +import { getEnv, testSuccess } from './utils/TestUtils'; +import { connection as c } from './utils/TestConfig'; + +process.env['FRODO_MOCK'] = '1'; +const cloudEnv = getEnv(c); + +const allDirectory = "test/e2e/exports/fr-config-manager/cloud"; +const envDir1 = "test/e2e/exports/fr-config-manager/cloud/fr-test.env" +const envDir2 = "test/e2e/exports/fr-config-manager/cloud/fr-test-2.env" + +describe('Should import variables into cloud', () => { + test(`"frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D ${allDirectory} ": should import two variables into cloud"`, async () => { + const CMD = `frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); + test(`"frodo config-manager push variables --env-file ${envDir2} --env-file ${envDir1} -D ${allDirectory} ": should import two variables into cloud"`, async () => { + const CMD = `frodo config-manager push variables --env-file ${envDir2} --env-file ${envDir1} -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); + test(`"frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20-D ${allDirectory} ": should import the specified variable into cloud"`, async () => { + const CMD = `frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20 -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); + test(`"frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file ${envDir1} -D ${allDirectory} ": should import the specified variable into cloud"`, async () => { + const CMD = `frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file ${envDir1} -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test-2.json b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test-2.json new file mode 100644 index 000000000..470671f0d --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test-2.json @@ -0,0 +1,6 @@ +{ + "_id": "esv-fr-var-test-2", + "description": "", + "expressionType": "int", + "valueBase64": "${ESV_FR_VAR_TEST_2}" +} diff --git a/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test.json b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test.json new file mode 100644 index 000000000..a2688a23a --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test.json @@ -0,0 +1,6 @@ +{ + "_id": "esv-fr-var-test", + "description": "", + "expressionType": "string", + "valueBase64": "${ESV_FR_VAR_TEST}" +} diff --git a/test/e2e/exports/fr-config-manager/cloud/fr-test-2.env b/test/e2e/exports/fr-config-manager/cloud/fr-test-2.env new file mode 100644 index 000000000..13e60a35d --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/fr-test-2.env @@ -0,0 +1,2 @@ +# test.env +ESV_FR_VAR_TEST_2=30 diff --git a/test/e2e/exports/fr-config-manager/cloud/fr-test.env b/test/e2e/exports/fr-config-manager/cloud/fr-test.env new file mode 100644 index 000000000..6995b3bbf --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/fr-test.env @@ -0,0 +1 @@ +ESV_FR_VAR_TEST=test3 \ No newline at end of file diff --git a/test/e2e/idm-export.e2e.test.js b/test/e2e/idm-export.e2e.test.js index a655f74c7..436091a37 100644 --- a/test/e2e/idm-export.e2e.test.js +++ b/test/e2e/idm-export.e2e.test.js @@ -49,11 +49,11 @@ /* // Cloud FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export --entity-id script -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -i script -D testDir4 FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -xNi sync FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -a -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -AD testDir1 // ForgeOps @@ -88,9 +88,9 @@ describe('frodo idm export', () => { await testExport(CMD, env, type, exportFile, undefined, false); }); - test(`"frodo idm export -xi script -e ${envFile} -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json`, async () => { + test(`"frodo idm export -xi script --env-file ${envFile} -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json`, async () => { const exportFile = 'my-script.idm.json'; - const CMD = `frodo idm export -xi script -e ${envFile} -f ${exportFile}`; + const CMD = `frodo idm export -xi script --env-file ${envFile} -f ${exportFile}`; await testExport(CMD, env, type, exportFile, undefined, false); }); @@ -111,9 +111,9 @@ describe('frodo idm export', () => { await testExport(CMD, env, type, exportFile); }); - test(`"frodo idm export --all --file allIdmTestFile.json -E ${entitiesFile} -e ${envFile} --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json`, async () => { + test(`"frodo idm export --all --file allIdmTestFile.json -e ${entitiesFile} --env-file ${envFile} --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json`, async () => { const exportFile = 'allIdmTestFile.json'; - const CMD = `frodo idm export --all --file ${exportFile} -E ${entitiesFile} -e ${envFile} --no-metadata`; + const CMD = `frodo idm export --all --file ${exportFile} -e ${entitiesFile} --env-file ${envFile} --no-metadata`; await testExport(CMD, env, type, exportFile, undefined, false); }); diff --git a/test/e2e/idm-import.e2e.test.js b/test/e2e/idm-import.e2e.test.js index edf93b3f2..0523ed62f 100644 --- a/test/e2e/idm-import.e2e.test.js +++ b/test/e2e/idm-import.e2e.test.js @@ -50,8 +50,8 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -i script -D test/e2e/exports/all-separate/cloud/global/idm FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -f test/e2e/exports/all-separate/cloud/global/idm/script.idm.json FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import --entity-id script --file test/e2e/exports/all-separate/cloud/global/idm/script.idm.json -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -i script -e test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -af test/e2e/exports/all/all.idm.json -e test/e2e/env/testEnvFile.env -E test/e2e/env/testEntitiesFile.json +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -i script --env-file test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -af test/e2e/exports/all/all.idm.json --env-file test/e2e/env/testEnvFile.env -e test/e2e/env/testEntitiesFile.json FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import --all --file all.idm.json -D test/e2e/exports/all FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -AD test/e2e/exports/all-separate/cloud/global/idm FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import --all-separate --directory test/e2e/exports/all-separate/cloud/global/idm --env-file test/e2e/env/testEnvFile.env --entities-file test/e2e/env/testEntitiesFile.json @@ -67,7 +67,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, testSuccess } from './utils/TestUtils'; +import { getEnv, testFail, testSuccess } from './utils/TestUtils'; import { connection as c , forgeops_connection as fc} from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -93,58 +93,42 @@ describe('frodo idm import', () => { test(`"frodo idm import -i script -D ${idmExportDirectory}": should import the idm config with name 'script' from the directory ${idmExportDirectory}"`, async () => { const CMD = `frodo idm import -i script -D ${idmExportDirectory}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + await testSuccess(CMD, env); }); test(`"frodo idm import -f ${idmScriptConfigExport}": should import the idm config from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import -f ${idmScriptConfigExport}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + await testSuccess(CMD, env); }); test(`"frodo idm import --entity-id script --file ${idmScriptConfigExport}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import --entity-id script --file ${idmScriptConfigExport}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + await testSuccess(CMD, env); }); - test(`"frodo idm import -i script -e ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { - const CMD = `frodo idm import -i script -e ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + test(`"frodo idm import -i script --env-file ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { + const CMD = `frodo idm import -i script --env-file ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}`; + await testSuccess(CMD, env); }); - test(`"frodo idm import -af ${allIdmExport} -e ${testEnvFile} -E ${testEntitiesFile}": Should import all configs from the file '${allIdmExport}' according to the env and entity files"`, async () => { - const CMD = `frodo idm import -af ${allIdmExport} -e ${testEnvFile} -E ${testEntitiesFile}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + test(`"frodo idm import -af ${allIdmExport} --env-file ${testEnvFile} -e ${testEntitiesFile}": Should import all configs from the file '${allIdmExport}' according to the env and entity files"`, async () => { + const CMD = `frodo idm import -af ${allIdmExport} --env-file ${testEnvFile} -e ${testEntitiesFile}`; + await testSuccess(CMD, env); }); test(`"frodo idm import --all --file ${allIdmExportFileName} -D ${allIdmExportDirectory}": Should import all configs from the file '${allIdmExportFileName}' in directory '${allIdmExportDirectory}'"`, async () => { const CMD = `frodo idm import --all --file ${allIdmExportFileName} -D ${allIdmExportDirectory}`; - try { - await exec(CMD, env); - fail("Command should've failed"); - } catch (e) { - expect(e.stderr).toMatchSnapshot(); - } + await testFail(CMD, env); }); test(`"frodo idm import -AD ${idmExportDirectory}": Should import all configs from the directory '${idmExportDirectory}'"`, async () => { const CMD = `frodo idm import -AD ${idmExportDirectory}`; - try { - await exec(CMD, env); - fail("Command should've failed"); - } catch (e) { - expect(e.stderr).toMatchSnapshot(); - } + await testFail(CMD, env); }); test(`"frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}": Should import all configs from the directory '${idmExportDirectory}' according to the env and entity files"`, async () => { const CMD = `frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + await testSuccess(CMD, env); }); // Forgeops Tests diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/am_1076162899/recording.har new file mode 100644 index 000000000..de45a9a73 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:41.732Z", + "time": 122, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 122 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1200, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.021Z", + "time": 92, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 92 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/environment_1072573434/recording.har new file mode 100644 index 000000000..700937287 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/environment_1072573434/recording.har @@ -0,0 +1,349 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.120Z", + "time": 88, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 88 + } + }, + { + "_id": "3daf558b49299e3222a8d2ba4621a44f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 62, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "62" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1931, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"MjA=\",\"description\":\"\",\"expressionType\":\"int\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test-2" + }, + "response": { + "bodySize": 192, + "content": { + "mimeType": "application/json", + "size": 192, + "text": "{\"_id\":\"esv-fr-var-test-2\",\"description\":\"\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-08-18T16:21:04.679475Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"MjA=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "192" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 325, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.300Z", + "time": 712, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 712 + } + }, + { + "_id": "727ec25947ab373570117e235c9de3f1", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 81, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "81" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1929, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"dGhpcyBpcyBhIHRlc3Q=\",\"description\":\"\",\"expressionType\":\"string\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test" + }, + "response": { + "bodySize": 204, + "content": { + "mimeType": "application/json", + "size": 204, + "text": "{\"_id\":\"esv-fr-var-test\",\"description\":\"\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-08-18T15:56:05.379214Z\",\"lastChangedBy\":\"phales@trivir.com\",\"loaded\":false,\"valueBase64\":\"dGhpcyBpcyBhIHRlc3Q=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "204" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 325, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:43.018Z", + "time": 732, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 732 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/oauth2_393036114/recording.har new file mode 100644 index 000000000..e6f6b40b7 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 976, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:41.869Z", + "time": 145, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 145 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/openidm_3290118515/recording.har new file mode 100644 index 000000000..591551c76 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.083Z", + "time": 170, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 170 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.214Z", + "time": 77, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 77 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/am_1076162899/recording.har new file mode 100644 index 000000000..d33de331d --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:53.817Z", + "time": 127, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 127 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.160Z", + "time": 105, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 105 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/environment_1072573434/recording.har new file mode 100644 index 000000000..0006b756b --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/environment_1072573434/recording.har @@ -0,0 +1,349 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.271Z", + "time": 87, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 87 + } + }, + { + "_id": "ba4d1659c53d7693f77ef9e9d7347132", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 62, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "62" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1931, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"MzA=\",\"description\":\"\",\"expressionType\":\"int\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test-2" + }, + "response": { + "bodySize": 195, + "content": { + "mimeType": "application/json", + "size": 195, + "text": "{\"_id\":\"esv-fr-var-test-2\",\"description\":\"\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-08-18T16:22:55.326263155Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"MzA=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "195" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 300, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.451Z", + "time": 1264, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 1264 + } + }, + { + "_id": "606aeb9ad1f7bba793fc549bdc390f93", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 69, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "69" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1929, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"dGVzdDM=\",\"description\":\"\",\"expressionType\":\"string\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test" + }, + "response": { + "bodySize": 200, + "content": { + "mimeType": "application/json", + "size": 200, + "text": "{\"_id\":\"esv-fr-var-test\",\"description\":\"\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-08-18T16:22:56.468876525Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"dGVzdDM=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "200" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 300, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:55.721Z", + "time": 993, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 993 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/oauth2_393036114/recording.har new file mode 100644 index 000000000..b479476b8 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:53.958Z", + "time": 196, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 196 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/openidm_3290118515/recording.har new file mode 100644 index 000000000..fb9e055c2 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.221Z", + "time": 167, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 167 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.365Z", + "time": 78, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 78 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/am_1076162899/recording.har new file mode 100644 index 000000000..1525829f6 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1200, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.125Z", + "time": 134, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 134 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1200, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.432Z", + "time": 115, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 115 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/environment_1072573434/recording.har new file mode 100644 index 000000000..1e232eeff --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/environment_1072573434/recording.har @@ -0,0 +1,237 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.553Z", + "time": 93, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 93 + } + }, + { + "_id": "3daf558b49299e3222a8d2ba4621a44f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 62, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "62" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1931, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"MjA=\",\"description\":\"\",\"expressionType\":\"int\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test-2" + }, + "response": { + "bodySize": 194, + "content": { + "mimeType": "application/json", + "size": 194, + "text": "{\"_id\":\"esv-fr-var-test-2\",\"description\":\"\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-08-18T16:23:44.65920969Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"MjA=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "194" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 325, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.752Z", + "time": 1276, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 1276 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/oauth2_393036114/recording.har new file mode 100644 index 000000000..c2cd3143d --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.273Z", + "time": 154, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 154 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/openidm_3290118515/recording.har new file mode 100644 index 000000000..27212141a --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.497Z", + "time": 168, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 168 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.652Z", + "time": 92, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 92 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/am_1076162899/recording.har new file mode 100644 index 000000000..e975d52b0 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:06.864Z", + "time": 139, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 139 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.251Z", + "time": 100, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 100 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/environment_1072573434/recording.har new file mode 100644 index 000000000..0bde1a600 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/environment_1072573434/recording.har @@ -0,0 +1,237 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.357Z", + "time": 92, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 92 + } + }, + { + "_id": "8c6014bd75cd441b9a022a5e9ad95aef", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 69, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "69" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1929, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"dGVzdDI=\",\"description\":\"\",\"expressionType\":\"string\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test" + }, + "response": { + "bodySize": 200, + "content": { + "mimeType": "application/json", + "size": 200, + "text": "{\"_id\":\"esv-fr-var-test\",\"description\":\"\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-08-18T16:24:08.268417121Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"dGVzdDI=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "200" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 300, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.540Z", + "time": 964, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 964 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/oauth2_393036114/recording.har new file mode 100644 index 000000000..5b6e58a16 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.017Z", + "time": 227, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 227 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/openidm_3290118515/recording.har new file mode 100644 index 000000000..786a0ce7a --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.313Z", + "time": 178, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 178 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.456Z", + "time": 74, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 74 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/openidm_3290118515/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/environment_1072573434/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/environment_1072573434/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/environment_1072573434/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/environment_1072573434/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/openidm_3290118515/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/openidm_3290118515/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/openidm_3290118515/recording.har diff --git a/test/e2e/promote.e2e.test.js b/test/e2e/promote.e2e.test.js index 0172f72f6..d6a7d9037 100644 --- a/test/e2e/promote.e2e.test.js +++ b/test/e2e/promote.e2e.test.js @@ -50,23 +50,23 @@ ************* ******* DISCLAMER ******* To re-record these you will need to setup the cloud enviornment each time, you might also need to update the full-export-separate with a new export of the whole config with -AxND flags ************* -FRODO_MOCK=record FRODO_TEST_NAME='emailtemplate' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='journey' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='authentication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='resourcetype' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='script' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='idm' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='agent' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='policy' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='managedapplication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='theme' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='application' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='variable' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='sync' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='mapping' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='service' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='journeyPromoteNoPrompt' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote --prune-no-prompt -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='node' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='emailtemplate' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='journey' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='authentication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='resourcetype' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='script' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='idm' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='agent' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='policy' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='managedapplication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='theme' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='application' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='variable' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='sync' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='mapping' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='service' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='journeyPromoteNoPrompt' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote --prune-no-prompt -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='node' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] */ import { getEnv, testPromote } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; @@ -75,8 +75,8 @@ process.env['FRODO_MOCK'] = '1'; const env = getEnv(c); const sourceDir = `./test/e2e/exports/full-export-separate` -describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*', () => { - test.skip('"emailtemplate frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on email template changes', async () => { +describe('frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*', () => { + test.skip('"emailtemplate frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on email template changes', async () => { let name = 'emailtemplate'; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -84,7 +84,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"journey frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on journey changes', async () => { + test.skip('"journey frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on journey changes', async () => { let name = "journey"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -92,7 +92,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"authentication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on authentication changes', async () => { + test('"authentication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on authentication changes', async () => { let name = "authentication"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -100,7 +100,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"resourcetype frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on resourcetype changes', async () => { + test.skip('"resourcetype frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on resourcetype changes', async () => { let name = "resourcetype"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -108,7 +108,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"script frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on script changes', async () => { + test.skip('"script frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on script changes', async () => { let name = "script"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -116,7 +116,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"idm frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on idm changes', async () => { + test.skip('"idm frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on idm changes', async () => { let name = "idm"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -124,7 +124,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"idp frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on idp changes', async () => { + test.skip('"idp frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on idp changes', async () => { let name = "idp"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -132,7 +132,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"agent frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on agent changes', async () => { + test.skip('"agent frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on agent changes', async () => { let name = "agent"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -140,7 +140,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"policy frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on policy changes', async () => { + test.skip('"policy frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on policy changes', async () => { let name = "policy"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -148,7 +148,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on managedapplication changes', async () => { + test('"managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on managedapplication changes', async () => { let name = "managedapplication"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -156,7 +156,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"theme frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on theme changes', async () => { + test.skip('"theme frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on theme changes', async () => { let name = "theme"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -164,7 +164,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"application frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on application changes', async () => { + test.skip('"application frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on application changes', async () => { let name = "application"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -172,7 +172,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"variable frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on variable changes', async () => { + test('"variable frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on variable changes', async () => { let name = "variable"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -180,7 +180,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"sync frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on sync changes', async () => { + test.skip('"sync frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on sync changes', async () => { let name = "sync"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -188,7 +188,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"mapping frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on mapping changes', async () => { + test('"mapping frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on mapping changes', async () => { let name = "mapping"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -196,7 +196,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"service frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on service changes', async () => { + test.skip('"service frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on service changes', async () => { let name = "service"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -204,7 +204,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"node frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on node changes', async () => { + test.skip('"node frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on node changes', async () => { let name = "node"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; diff --git a/test/e2e/utils/TestUtils.js b/test/e2e/utils/TestUtils.js index c93317ae0..df9e12283 100644 --- a/test/e2e/utils/TestUtils.js +++ b/test/e2e/utils/TestUtils.js @@ -331,7 +331,7 @@ export async function testPromote( ) { env.env.FRODO_TEST_NAME = name const tempDir = await copyAndModifyDirectory(sourceDir, modifiedFilesDir, referenceSubDirs) - const CMD = `frodo promote -M ${sourceDir} -E ${tempDir}`; + const CMD = `frodo promote -M ${sourceDir} -e ${tempDir}`; const { stdout, stderr } = await exec(CMD, env); assertNoPollyReplayError(stdout, CMD); assertNoPollyReplayError(stderr, CMD);