${ [1].map(() => { const namespaces = ['default']; const partitions = ['default']; const ns = location.search.ns || 'default'; const partition = location.search.partition || 'default'; const dc = location.search.dc; const service = location.pathname.get(2); const routeCount = env( 'CONSUL_ROUTE_COUNT', Math.floor( ( Math.random() * env('CONSUL_ROUTE_MAX', 10) ) + parseInt(env('CONSUL_ROUTE_MIN', 1)) ) ); const headerCount = env( 'CONSUL_HEADER_COUNT', Math.floor( ( Math.random() * env('CONSUL_HEADER_MAX', 3) ) + parseInt(env('CONSUL_HEADER_MIN', 1)) ) ); const queryParamCount = env( 'CONSUL_QUERYPARAM_COUNT', Math.floor( ( Math.random() * env('CONSUL_QUERYPARAM_MAX', 3) ) + parseInt(env('CONSUL_QUERYPARAM_MIN', 1)) ) ); const resolverCount = env( 'CONSUL_RESOLVER_COUNT', Math.floor( ( Math.random() * env('CONSUL_RESOLVER_MAX', 10) ) + parseInt(env('CONSUL_RESOLVER_MIN', 1)) ) ); const redirectCount = env( 'CONSUL_REDIRECT_COUNT', Math.floor( ( Math.random() * env('CONSUL_REDIRECT_MAX', resolverCount) ) + parseInt(env('CONSUL_REDIRECT_MIN', 0)) ) ); const splitterCount = env( 'CONSUL_SPLITTER_COUNT', Math.floor( ( Math.random() * env('CONSUL_SPLITTER_MAX', 5) ) + parseInt(env('CONSUL_SPLITTER_MIN', 1)) ) ); const splitCount = env( 'CONSUL_SPLIT_COUNT', Math.floor( ( Math.random() * env('CONSUL_SPLIT_MAX', 10) ) + parseInt(env('CONSUL_SPLIT_MIN', 1)) ) ); // make some resolvers let resolvers = range( resolverCount ).map(() => { const service = fake.hacker.noun().split(' ').join('-'); return { ServiceName: service, Name: `${service}.${ns}.${partition}.${dc}`, Subsets: range( env( 'CONSUL_SUBSET_COUNT', Math.floor( ( Math.random() * env('CONSUL_SUBSET_MAX', 3) ) + parseInt(env('CONSUL_SUBSET_MIN', 1)) ) ) ).map((item) => `v${item + 1}`) }; }); // make some redirects const redirects = range( redirectCount ).map((item, i) => { const service = resolvers[i].ServiceName; return { ServiceName: service, Name: `${service}.${ns}.${partition}.redirect-${dc}`, Subsets: [] }; }); // make some resolver targets with possible subsets let resolverTargets = resolvers.reduce( function(prev, resolver) { const targets = [`${resolver.Name}`]; return prev.concat(targets.concat( resolver.Subsets.map( function(item) { return `${item}.${targets[0]}` } ) ).map( (item) => `resolver:${item}` )); }, [] ); const redirectTargets = redirects.map( function(item) { return `resolver:${item.Name}`; } ); resolverTargets = resolverTargets.concat(redirectTargets); resolvers = resolvers.concat(redirects); const splitters = range( splitterCount ).map(() => ({ Name: `${service}-${fake.hacker.noun()}.${ns}.${partition}`, Splits: range( splitCount ).map((item, i, arr) => ({ "Weight": 100 / arr.length, "NextNode": fake.helpers.randomize(resolverTargets) })) })); const splitterTargets = splitters.map( function(item) { return `splitter:${item.Name}`; } ); const nextNodes = resolverTargets.concat(splitterTargets); return ` { "Chain": { "ServiceName": "${service}", "Namespace": "${ns}", "Partition": "${partition}", "Datacenter": "${dc}", "Protocol": "http", "StartNode": "router:${service}", "Nodes": { "router:${service}": { "Type": "router", "Name": "${service}", "Routes": [ ${ range( routeCount ).map((item, i) => { const path = fake.helpers.randomize(['PathExact', 'PathPrefix', 'PathRegex', '']); const splitter = fake.helpers.randomize(splitters); const nextNode = fake.helpers.randomize(nextNodes); return ` { "NextNode": "${nextNode}", "Definition": { "Match": { "HTTP": { ${ path !== '' ? ` "${path}": "${path === 'PathRegex' ? `${fake.helpers.randomize(['^[0-9]{1,3}?$', '(\w+)\s(\w+)'])}` : `/${fake.lorem.words(fake.random.number({min: 1, max: 5})).split(' ').join('/')}${fake.random.boolean() ? fake.system.fileName() : ''}`}" ` : `"": ""`} ${ fake.random.boolean() ? ` ,"Header": [ ${ range( headerCount ).map(item => ` { "Name": "X-${fake.hacker.noun().split(' ').map(item => `${item.substr(0, 1).toUpperCase()}${item.substr(1)}`).join('-')}", ${fake.random.boolean() ? ` "Invert": true, ` : `` } ${fake.helpers.randomize([ '"Present": true', '"Exact": true', '"Prefix": "abc"', '"Suffix": "xyz"', '"Regex": "[abc]"' ])} } `)} ] ` : ``} ${ fake.random.boolean() ? ` ,"QueryParam": [ ${ range( queryParamCount ).map(item => ` { "Name": "${fake.hacker.noun().split(' ').join('-')}", ${fake.helpers.randomize([ '"Present": true', '"Exact": true', '"Prefix": "abc"', '"Suffix": "xyz"', '"Regex": "[abc]"' ])} } `)} ] ` : ``} ${ fake.random.boolean() ? ` ,"Methods": [ ${ fake.helpers.shuffle( ["GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "PATCH"] ).filter(item => fake.random.boolean()).map(item => ` "${item}" `) } ] ` : ``} } }, "Destination": { "Service": "${nextNode}", "PrefixRewrite": "/" } } } `;})} ] }, ${resolvers.map((resolver) => { const failoverCount = env( 'CONSUL_FAILOVER_COUNT', fake.helpers.randomize([0, 0, 0, 0, 0, 1, 2, 3]) ); const failover = ({ Datacenter: `${resolver.Name.replace(`.${dc}`, `.fail-${dc}`).replace(`.redirect-${dc}`, `.fail-${dc}`)}`, Partition: `${resolver.Name.replace(`${ns}.${partition}.`, `${ns}.fail-${partition}.`).replace(`${ns}.redirect-${partition}.`, `${ns}.fail-${partition}.`)}`, Namespace: `${resolver.Name.replace(`.${ns}.${partition}`, `.fail-${ns}.${partition}`).replace(`.redirect-${ns}.${partition}`, `.fail-${ns}.${partition}`)}`, })[env('CONSUL_FAILOVER_TYPE', 'Datacenter')]; return ` "resolver:${resolver.Name}": { "Type": "resolver", "Name": "${resolver.Name}", "Resolver": { "ConnectTimeout": "5s", ${failoverCount > 0 ? ` "Failover": { "Targets": [ ${range(failoverCount).map(item => ` "${failover.replace('fail-', `fail-${item + 1}-`)}" `)} ] }, ` : `` } "Target": "${resolver.Name}" } }${resolver.Subsets.length > 0 ? ',' : ''} ${resolver.Subsets.map((subset) => { const id = `${subset}.${resolver.Name}`; const failover = ({ Datacenter: `${subset}.${resolver.Name.replace(`.${dc}`, `.fail-${dc}`)}`, Partition: `${subset}.${resolver.Name.replace(`${ns}.${partition}.`, `${ns}.fail-${partition}.`)}`, Namespace: `${subset}.${resolver.Name.replace(`.${ns}.${partition}`, `.fail-${ns}.${partition}`)}`, })[env('CONSUL_FAILOVER_TYPE', 'Datacenter')]; return ` "resolver:${id}": { "Type": "resolver", "Name": "${id}", "Resolver": { "ConnectTimeout": "5s", ${failoverCount > 0 ? ` "Failover": { "Targets": [ ${range(failoverCount).map(item => ` "${failover.replace('fail-', `fail-${item + 1}-`)}" `)} ] }, ` : `` } "Target": "${id}" } } `; })} `})}, ${splitters.map((item, i) => ` "splitter:${item.Name}": { "Type": "splitter", "Name": "${item.Name}", "Splits": [ ${item.Splits.map(item => ` { "Weight": ${item.Weight}, "NextNode": "${item.NextNode}" } `)} ] } `)} }, "Targets": { ${resolvers.map(item => { const uuid = fake.random.uuid(); const domain = 'consul'; const name = `${item.Name}.internal.${uuid}.${domain}`; return ` "${item.Name}": { "ID": "${item.Name}", "Service": "${item.ServiceName}", "Namespace": "${ns}", "Partition": "${partition}", "Datacenter": "${dc}", "MeshGateway": {}, "SNI": "${name}", "Name": "${name}" }${item.Subsets.length > 0 ? ',' : ''} ${item.Subsets.map(ktem => { const id = `${ktem}.${item.Name}`; const name = `${id}.internal.${uuid}.${domain}`; return ` "${id}": { "ID": "${id}", "Service": "${item.ServiceName}", "ServiceSubset": "${ktem}", "Namespace": "${ns}", "Partition": "${partition}", "Datacenter": "${dc}", "MeshGateway": { }, "Subset": { "Filter": "Service.Meta.value == ${ktem}" }, "SNI": "${name}", "Name": "${name}" } `})} `})} } } } `})}