From 1ef18c4b67cdda14bbadea40bba8724af078efb2 Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 5 Nov 2020 16:03:49 +0000 Subject: [PATCH] ui: Move mocks into the ui project (#9084) * Add consul-api-double under api * Update config to reflect api change * Remove consul-api-double as a dependency * api -> mock-api * Fixup mocks path for staging --- ui/package.json | 4 - ui/packages/consul-ui/config/environment.js | 4 +- ui/packages/consul-ui/lib/startup/index.js | 2 +- ui/packages/consul-ui/mock-api/README.md | 7 + ui/packages/consul-ui/mock-api/v1/.config | 8 + ui/packages/consul-ui/mock-api/v1/acl/.config | 14 + ui/packages/consul-ui/mock-api/v1/acl/_ | 28 ++ .../consul-ui/mock-api/v1/acl/destroy/_ | 1 + .../consul-ui/mock-api/v1/acl/idp/.config | 13 + ui/packages/consul-ui/mock-api/v1/acl/idp/_ | 10 + ui/packages/consul-ui/mock-api/v1/acl/idps | 30 ++ ui/packages/consul-ui/mock-api/v1/acl/info/_ | 19 + ui/packages/consul-ui/mock-api/v1/acl/list | 71 ++++ .../consul-ui/mock-api/v1/acl/oidc/auth-url | 3 + .../consul-ui/mock-api/v1/acl/oidc/callback | 40 ++ .../consul-ui/mock-api/v1/acl/policies | 46 +++ .../consul-ui/mock-api/v1/acl/policy/.config | 13 + .../consul-ui/mock-api/v1/acl/policy/_ | 17 + .../mock-api/v1/acl/policy/translate | 8 + ui/packages/consul-ui/mock-api/v1/acl/role/_ | 64 ++++ .../mock-api/v1/acl/rolebindingrule/.config | 13 + .../mock-api/v1/acl/rolebindingrule/_ | 30 ++ .../mock-api/v1/acl/rolebindingrules | 49 +++ ui/packages/consul-ui/mock-api/v1/acl/roles | 90 +++++ .../consul-ui/mock-api/v1/acl/token/.config | 13 + ui/packages/consul-ui/mock-api/v1/acl/token/_ | 98 +++++ .../consul-ui/mock-api/v1/acl/token/self | 42 +++ ui/packages/consul-ui/mock-api/v1/acl/tokens | 108 ++++++ ui/packages/consul-ui/mock-api/v1/acl/update | 3 + .../mock-api/v1/agent/connect/authorize | 13 + .../mock-api/v1/agent/connect/ca/leaf/_ | 11 + .../mock-api/v1/agent/connect/ca/roots | 18 + .../mock-api/v1/agent/connect/proxy/_ | 17 + .../mock-api/v1/agent/service/register | 0 .../consul-ui/mock-api/v1/agent/services | 40 ++ .../consul-ui/mock-api/v1/catalog/connect/_ | 72 ++++ .../consul-ui/mock-api/v1/catalog/datacenters | 13 + .../consul-ui/mock-api/v1/catalog/deregister | 0 .../consul-ui/mock-api/v1/catalog/node/_ | 0 .../consul-ui/mock-api/v1/catalog/register | 0 .../consul-ui/mock-api/v1/catalog/service/_ | 0 .../consul-ui/mock-api/v1/connect/.config | 8 + ui/packages/consul-ui/mock-api/v1/connect/_ | 115 ++++++ .../mock-api/v1/connect/ca/configuration | 10 + .../consul-ui/mock-api/v1/connect/ca/roots | 18 + .../mock-api/v1/connect/intentions/_ | 91 +++++ .../mock-api/v1/connect/intentions/check | 4 + .../mock-api/v1/connect/intentions/exact | 93 +++++ .../mock-api/v1/connect/intentions/match | 38 ++ .../consul-ui/mock-api/v1/coordinate/.config | 10 + .../consul-ui/mock-api/v1/coordinate/nodes | 30 ++ .../mock-api/v1/discovery-chain/.config | 9 + .../consul-ui/mock-api/v1/discovery-chain/_ | 352 ++++++++++++++++++ .../v1/discovery-chain/virtual-admin-1 | 1 + .../v1/discovery-chain/virtual-admin-2 | 1 + .../v1/discovery-chain/virtual-admin-3 | 1 + .../v1/discovery-chain/virtual-admin-4 | 1 + .../v1/discovery-chain/virtual-admin-5 | 1 + .../mock-api/v1/health/service/.config | 8 + .../consul-ui/mock-api/v1/health/service/_ | 160 ++++++++ .../mock-api/v1/internal/acl/authorize | 34 ++ .../consul-ui/mock-api/v1/internal/ui/.config | 8 + .../ui/gateway-services-nodes/.config | 8 + .../v1/internal/ui/gateway-services-nodes/_ | 70 ++++ .../internal/ui/metrics-proxy/api/v1/.config | 5 + .../v1/internal/ui/metrics-proxy/api/v1/query | 181 +++++++++ .../ui/metrics-proxy/api/v1/query_range | 90 +++++ .../mock-api/v1/internal/ui/node/.config | 8 + .../consul-ui/mock-api/v1/internal/ui/node/_ | 105 ++++++ .../consul-ui/mock-api/v1/internal/ui/nodes | 90 +++++ .../mock-api/v1/internal/ui/oidc-auth-methods | 23 ++ .../v1/internal/ui/service-topology/.config | 9 + .../v1/internal/ui/service-topology/_ | 113 ++++++ .../mock-api/v1/internal/ui/services | 109 ++++++ ui/packages/consul-ui/mock-api/v1/kv/.config | 12 + ui/packages/consul-ui/mock-api/v1/kv/_ | 50 +++ ui/packages/consul-ui/mock-api/v1/kv/index | 28 ++ ui/packages/consul-ui/mock-api/v1/namespace/_ | 24 ++ ui/packages/consul-ui/mock-api/v1/namespaces | 64 ++++ .../consul-ui/mock-api/v1/session/destroy/_ | 1 + .../consul-ui/mock-api/v1/session/info/_ | 17 + .../mock-api/v1/session/node/.config | 8 + .../consul-ui/mock-api/v1/session/node/_ | 32 ++ .../consul-ui/mock-api/v1/status/leader | 1 + ui/packages/consul-ui/package.json | 1 - 85 files changed, 3066 insertions(+), 8 deletions(-) create mode 100644 ui/packages/consul-ui/mock-api/README.md create mode 100644 ui/packages/consul-ui/mock-api/v1/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/destroy/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/idp/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/idp/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/idps create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/info/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/list create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/oidc/auth-url create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/oidc/callback create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/policies create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/policy/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/policy/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/policy/translate create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/role/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/rolebindingrules create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/roles create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/token/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/token/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/token/self create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/tokens create mode 100644 ui/packages/consul-ui/mock-api/v1/acl/update create mode 100644 ui/packages/consul-ui/mock-api/v1/agent/connect/authorize create mode 100644 ui/packages/consul-ui/mock-api/v1/agent/connect/ca/leaf/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/agent/connect/ca/roots create mode 100644 ui/packages/consul-ui/mock-api/v1/agent/connect/proxy/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/agent/service/register create mode 100644 ui/packages/consul-ui/mock-api/v1/agent/services create mode 100644 ui/packages/consul-ui/mock-api/v1/catalog/connect/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/catalog/datacenters create mode 100644 ui/packages/consul-ui/mock-api/v1/catalog/deregister create mode 100644 ui/packages/consul-ui/mock-api/v1/catalog/node/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/catalog/register create mode 100644 ui/packages/consul-ui/mock-api/v1/catalog/service/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/ca/configuration create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/ca/roots create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/intentions/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/intentions/check create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/intentions/exact create mode 100644 ui/packages/consul-ui/mock-api/v1/connect/intentions/match create mode 100644 ui/packages/consul-ui/mock-api/v1/coordinate/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/coordinate/nodes create mode 100644 ui/packages/consul-ui/mock-api/v1/discovery-chain/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/discovery-chain/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-1 create mode 100644 ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-2 create mode 100644 ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-3 create mode 100644 ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-4 create mode 100644 ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-5 create mode 100644 ui/packages/consul-ui/mock-api/v1/health/service/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/health/service/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/acl/authorize create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query_range create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/node/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/node/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/nodes create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/oidc-auth-methods create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/internal/ui/services create mode 100644 ui/packages/consul-ui/mock-api/v1/kv/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/kv/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/kv/index create mode 100644 ui/packages/consul-ui/mock-api/v1/namespace/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/namespaces create mode 100644 ui/packages/consul-ui/mock-api/v1/session/destroy/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/session/info/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/session/node/.config create mode 100644 ui/packages/consul-ui/mock-api/v1/session/node/_ create mode 100644 ui/packages/consul-ui/mock-api/v1/status/leader diff --git a/ui/package.json b/ui/package.json index a0d50f5d4b..d14647a401 100644 --- a/ui/package.json +++ b/ui/package.json @@ -6,10 +6,6 @@ "workspaces": { "packages": [ "packages/*" - ], - "nohoist": [ - "**/@hashicorp/consul-api-double", - "**/@hashicorp/consul-api-double/**" ] }, "scripts": { diff --git a/ui/packages/consul-ui/config/environment.js b/ui/packages/consul-ui/config/environment.js index 180494616e..950c7a4764 100644 --- a/ui/packages/consul-ui/config/environment.js +++ b/ui/packages/consul-ui/config/environment.js @@ -120,7 +120,7 @@ module.exports = function(environment, $ = process.env) { 'auto-import': false, enabled: true, endpoints: { - '/v1': '/node_modules/@hashicorp/consul-api-double/v1', + '/v1': '/mock-api/v1', }, }, APP: Object.assign({}, ENV.APP, { @@ -150,7 +150,7 @@ module.exports = function(environment, $ = process.env) { '@hashicorp/ember-cli-api-double': { enabled: true, endpoints: { - '/v1': '/node_modules/@hashicorp/consul-api-double/v1', + '/v1': '/mock-api/v1', }, }, }); diff --git a/ui/packages/consul-ui/lib/startup/index.js b/ui/packages/consul-ui/lib/startup/index.js index dde5315121..fefb117aee 100644 --- a/ui/packages/consul-ui/lib/startup/index.js +++ b/ui/packages/consul-ui/lib/startup/index.js @@ -24,7 +24,7 @@ module.exports = { // so we can set this path name centrally in config // TODO: undefined here is a possible faker salt that we should be able // to pass in from ember serve/config somehow - const dir = path.resolve('./node_modules/@hashicorp/consul-api-double'); + const dir = path.resolve('./mock-api'); const controller = apiDouble(undefined, dir, read, $, path.resolve); [ apiDoubleHeaders(), diff --git a/ui/packages/consul-ui/mock-api/README.md b/ui/packages/consul-ui/mock-api/README.md new file mode 100644 index 0000000000..686fb89dfa --- /dev/null +++ b/ui/packages/consul-ui/mock-api/README.md @@ -0,0 +1,7 @@ +# consul-api-double + +Super simple API 'double' for easily visualizing the Consul API via the filesystem. + +This can be served via either a simple javascript HTTP server, or entirely via frontend methods if your project/circumstances means you are unable to use or it's complicated to use a backend server for testing. + +See [@hashicorp/api-double](https://github.com/hashicorp/api-double/) for more details. diff --git a/ui/packages/consul-ui/mock-api/v1/.config b/ui/packages/consul-ui/mock-api/v1/.config new file mode 100644 index 0000000000..b3baa4013a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/.config @@ -0,0 +1,8 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/.config b/ui/packages/consul-ui/mock-api/v1/acl/.config new file mode 100644 index 0000000000..746e92f0eb --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/.config @@ -0,0 +1,14 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + Status-Code: ${ + // when legacy is enabled tokens and policies return a 500 + (env('CONSUL_ACLS_LEGACY', false) && (location.pathname.get(2) === 'tokens' || location.pathname.get(2) === 'policies')) ? + 500 : + env('CONSUL_ACLS_ENABLE', false) ? (headers['x-consul-token'] !== '' ? 200 : 403) : 401 + } + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/_ b/ui/packages/consul-ui/mock-api/v1/acl/_ new file mode 100644 index 0000000000..e383c8badd --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/_ @@ -0,0 +1,28 @@ +${ + location.pathname.get(2) === 'policy' && http.method === 'PUT' ? ` +{ + "ID": "${fake.random.uuid()}-1", + "Name": "${body.Name || ''}", + "Description": "${body.Description || ''}", + "Datacenters": ${fake.helpers.randomize(['null', '["dc-1", "dc-2"]'])}, + "Rules": "${body.Rules || ''}" +} +` : location.pathname.get(2) === 'token' && http.method === 'PUT' ? + ` +{ + "AccessorID":"${fake.random.uuid()}-1", + "SecretID":"${fake.random.uuid()}", + "Name": "${body.Name || ''}", + "Policies": ["dc2-service-register", "global-service-read"], + "CreateTime":"2017-08-23T22:47:14.695408057Z", + "CreateIndex":7, + "ModifyIndex":7 +} +` : location.pathname.get(2) === 'role' && http.method === 'PUT' ? + ` +{ + "ID": "${fake.random.uuid()}-1" +} + ` : `true` +} + diff --git a/ui/packages/consul-ui/mock-api/v1/acl/destroy/_ b/ui/packages/consul-ui/mock-api/v1/acl/destroy/_ new file mode 100644 index 0000000000..27ba77ddaf --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/destroy/_ @@ -0,0 +1 @@ +true diff --git a/ui/packages/consul-ui/mock-api/v1/acl/idp/.config b/ui/packages/consul-ui/mock-api/v1/acl/idp/.config new file mode 100644 index 0000000000..485ab5df68 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/idp/.config @@ -0,0 +1,13 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + Status-Code: ${ + env('CONSUL_ACLS_LEGACY', false) ? + 500 : + env('CONSUL_ACLS_ENABLE', false) ? (headers['x-consul-token'] !== '' ? 200 : 403) : 401 + } + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/idp/_ b/ui/packages/consul-ui/mock-api/v1/acl/idp/_ new file mode 100644 index 0000000000..0418d191ba --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/idp/_ @@ -0,0 +1,10 @@ +{ + "Name": "${location.pathname.get(3)}", + "Description": "${fake.lorem.sentence()}", + "Type": "${fake.helpers.randomize(['kubernetes'])}", ${''/* oidc */} + "KubernetesHost": "https://${fake.internet.ip()}:8443", + "KubernetesCACert": "-----BEGIN CERTIFICATE-----${fake.internet.password(1357)}-----END CERTIFICATE-----", + "KubernetesServiceAccountJWT": "eyJhbGciOiJ${fake.internet.password(25)}.eyJ${fake.internet.password(61)}.${fake.internet.password(32)}", + "CreateIndex": 10, + "ModifyIndex": 10 +} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/idps b/ui/packages/consul-ui/mock-api/v1/acl/idps new file mode 100644 index 0000000000..e53030a5bb --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/idps @@ -0,0 +1,30 @@ +${ env('CONSUL_ACLS_LEGACY', false) ? `rpc error making call: rpc: can't find method ACL.Method` : ` +[ + ${ + range( + env( + 'CONSUL_IDP_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_IDP_MAX', 10) + ) + parseInt(env('CONSUL_IDP_MIN', 1)) + ) + ) + ).map( + function(item, i) { + const type = fake.helpers.randomize(['kubernetes']); // oidc + return ` + { + "Name": "idp-${i}", + "Description": "${fake.lorem.sentence()}", + "Type": "${type}", + ${ type === 'kubernetes' ? `"KubernetesHost": "https://${fake.internet.ip()}:8443",` : ``} + "CreateIndex": 10, + "ModifyIndex": 10 + } + ` + } + ) + } +] +`} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/info/_ b/ui/packages/consul-ui/mock-api/v1/acl/info/_ new file mode 100644 index 0000000000..b12b40004c --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/info/_ @@ -0,0 +1,19 @@ +[ + { + "ID":"${ location.pathname.get(3) }", + "Name":"${ location.pathname.get(3) } Token", + "Type":"${fake.helpers.randomize(['client', 'management'])}", + "Rules":${ + JSON.stringify( +`agent "${fake.hacker.noun()}" { + policy = "write" +} +node "node-0" { + policy = "read" +}` + ) + }, + "CreateIndex":4, + "ModifyIndex":4 + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/acl/list b/ui/packages/consul-ui/mock-api/v1/acl/list new file mode 100644 index 0000000000..aa9f8c6a7c --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/list @@ -0,0 +1,71 @@ +${ + env('CONSUL_ENABLE_ACLS', 1) ? ` +[ + ${ + (count = env( + 'CONSUL_ACL_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_ACL_MAX', 10) + ) + parseInt(env('CONSUL_ACL_MIN', 2)) + ) + )) >= 2 ? ` + { + "ID":"anonymous", + "Name":"Anonymous Token", + "Type":"client", + "Rules":"", + "CreateIndex":4, + "ModifyIndex":4 + }, + { + "ID":"secret", + "Name":"Master Token", + "Type":"management", + "Rules":"", + "CreateIndex":5, + "ModifyIndex":5 + }${count > 2 ? "," : ""} + ${ + range( + Math.max(0, count - 2) + ).map( + function(item, i) { + return `{ + "ID":"${fake.lorem.word()}-${i}", + "Name":"${fake.lorem.word()}-${i}", + "Type":"client", + "Rules":"", + "CreateIndex":5, + "ModifyIndex":5 + }`; + } + ) + }` : ` + ${ + range( + env( + 'CONSUL_ACL_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_ACL_MAX', 10) + ) + parseInt(env('CONSUL_ACL_MIN', 1)) + ) + ) + ).map( + function(item, i) { + return `{ + "ID":"${fake.lorem.word()}-${i}", + "Name":"${fake.lorem.word()}-${i}", + "Type":"client", + "Rules":"", + "CreateIndex":5, + "ModifyIndex":5 + }`; + } + ) + } + `} +] +` : "ACL support disabled" +} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/oidc/auth-url b/ui/packages/consul-ui/mock-api/v1/acl/oidc/auth-url new file mode 100644 index 0000000000..27bb33a91e --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/oidc/auth-url @@ -0,0 +1,3 @@ +{ + "AuthURL": "${env('CONSUL_OIDC_PROVIDER_URL')}&redirect_uri=${encodeURIComponent(http.body.RedirectURI)}&response_type=code&scope=openid" +} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/oidc/callback b/ui/packages/consul-ui/mock-api/v1/acl/oidc/callback new file mode 100644 index 0000000000..7ccf5fff74 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/oidc/callback @@ -0,0 +1,40 @@ +{ + "AccessorID": "${fake.random.uuid()}", + "SecretID": "${fake.random.uuid()}", + "Namespace": "${ + typeof location.search.ns !== 'undefined' ? location.search.ns : + typeof http.body.Namespace !== 'undefined' ? http.body.Namespace : 'default' + }", + "Local": false, + "Description": "${fake.lorem.sentence()}", + "Policies": [ + ${ + range(env('CONSUL_POLICY_COUNT', 3)).map( + function(item, i) { + return ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${location.search.policy || fake.hacker.noun()}" + } + `; + } + ) + } + ], + "Roles": [ + ${ + range(env('CONSUL_ROLE_COUNT', 10)).map( + function(item, j) { + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${location.search.role || fake.hacker.noun()}" + } + `; + } + ) + } + ], + "CreateTime": "2019-10-11T11:24:06.1385039Z" +} + diff --git a/ui/packages/consul-ui/mock-api/v1/acl/policies b/ui/packages/consul-ui/mock-api/v1/acl/policies new file mode 100644 index 0000000000..44bf495cba --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/policies @@ -0,0 +1,46 @@ +${ env('CONSUL_ACLS_LEGACY', false) ? `rpc error making call: rpc: can't find method ACL.Method` : ` +[ + ${ + range( + env( + 'CONSUL_POLICY_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_POLICY_MAX', 10) + ) + parseInt(env('CONSUL_POLICY_MIN', 1)) + ) + ) + ).map( + function(item, i) { + if(i === 1) { + return ` + { + "ID": "00000000-0000-0000-0000-000000000001", + "Name": "global-management", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "Description": "Built-In Management Policy", + "CreateIndex": 10, + "ModifyIndex": 10 + } + ` + } + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${fake.hacker.noun()}-${i}", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", + ` : ``} + "Description": "${fake.lorem.sentence()}", + "Datacenters": ${fake.helpers.randomize(['["aq west-5", "ch east-4"]'])}, + "CreateIndex": 10, + "ModifyIndex": 10 + } + ` + } + ) + } +] +`} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/policy/.config b/ui/packages/consul-ui/mock-api/v1/acl/policy/.config new file mode 100644 index 0000000000..485ab5df68 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/policy/.config @@ -0,0 +1,13 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + Status-Code: ${ + env('CONSUL_ACLS_LEGACY', false) ? + 500 : + env('CONSUL_ACLS_ENABLE', false) ? (headers['x-consul-token'] !== '' ? 200 : 403) : 401 + } + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/policy/_ b/ui/packages/consul-ui/mock-api/v1/acl/policy/_ new file mode 100644 index 0000000000..32fa47ea5e --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/policy/_ @@ -0,0 +1,17 @@ +{ + "ID": "${location.pathname.get(3)}", + "Namespace": "${ + typeof location.search.ns !== 'undefined' ? location.search.ns : + typeof http.body.Namespace !== 'undefined' ? http.body.Namespace : 'default' + }", + "Description": "${location.pathname.get(3) === '00000000-0000-0000-0000-000000000001' ? 'Built-in Management Policy' : fake.lorem.sentence()}", +${ location.pathname.get(3) !== '00000000-0000-0000-0000-000000000001' ? ` + "Datacenters": ${fake.helpers.randomize(['["aq west-5", "ch east-4"]'])}, + "Rules": ${JSON.stringify( +`key "foo" { + policy = "write" +}`)}, +` : "" } + "Name": "${location.pathname.get(3) === '00000000-0000-0000-0000-000000000001' ? 'global-management' : fake.hacker.noun() + '-policy'}" +} + diff --git a/ui/packages/consul-ui/mock-api/v1/acl/policy/translate b/ui/packages/consul-ui/mock-api/v1/acl/policy/translate new file mode 100644 index 0000000000..bd5b4aed43 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/policy/translate @@ -0,0 +1,8 @@ +key_prefix "foo" { + permission = "read" +} + +operator { + permission = "read" +} + diff --git a/ui/packages/consul-ui/mock-api/v1/acl/role/_ b/ui/packages/consul-ui/mock-api/v1/acl/role/_ new file mode 100644 index 0000000000..f891e50479 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/role/_ @@ -0,0 +1,64 @@ +{ + "ID": "${location.pathname.get(3)}", + "Name": "${fake.hacker.noun() + '-role'}", + "Namespace": "${ + typeof location.search.ns !== 'undefined' ? location.search.ns : + typeof http.body.Namespace !== 'undefined' ? http.body.Namespace : 'default' + }", + "Description": "${fake.lorem.sentence()}", + "Policies": [ + ${ + range(env('CONSUL_POLICY_COUNT', 3)).map( + function(item, i) { + return ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}" + } + `; + } + ) + } + ], + "ServiceIdentities": [ + ${ + range(env('CONSUL_SERVICE_IDENTITY_COUNT', env('CONSUL_IDENTITY_COUNT', 1))).map( + function(item, i) { + return ` + { + "ServiceName": "${fake.hacker.noun()}"${ fake.random.boolean() ? `, + "Datacenters": [ + ${ + range(env('CONSUL_DATACENTER_COUNT', fake.random.number({min: 1, max: 10}))).map( + function(item, i) { + return `"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}"`; + } + ) + } + ] + ` : ``} + } + `; + } + ) + } + ], + "NodeIdentities": [ + ${ + range(env('CONSUL_NODE_IDENTITY_COUNT', 1)).map( + function(item, i) { + return ` + { + "NodeName": "${fake.hacker.noun()}", + "Datacenter":"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}" + } + `; + } + ) + } + ], + "Hash": "${fake.internet.password(64)}=", + "CreateIndex": 57, + "ModifyIndex": 57 +} + diff --git a/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/.config b/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/.config new file mode 100644 index 0000000000..485ab5df68 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/.config @@ -0,0 +1,13 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + Status-Code: ${ + env('CONSUL_ACLS_LEGACY', false) ? + 500 : + env('CONSUL_ACLS_ENABLE', false) ? (headers['x-consul-token'] !== '' ? 200 : 403) : 401 + } + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/_ b/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/_ new file mode 100644 index 0000000000..119c98d77d --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrule/_ @@ -0,0 +1,30 @@ +{ + "ID": "${location.pathname.get(3)}", + "IDPName": "${fake.hacker.noun()}-idp", + "RoleName": "${ fake.random.boolean() ? `${fake.hacker.noun()}-role` : `${fake.hacker.noun()}-{{ serviceaccount.name }}`}", + "Description": "${fake.lorem.sentence()}", + "Matches": [ + ${ + range(env('CONSUL_MATCH_COUNT', 3)).map( + function(item, i) { + return ` + { + "Selectors": [ + ${ + range(env('CONSUL_SELECTOR_COUNT', fake.random.number({min: 1, max: 5}))).map( + function(item, i) { + return `"serviceaccount.name=${fake.hacker.noun()}"`; + } + ) + } + ] + } + `; + } + ) + } + ], + "MustExist": ${fake.helpers.randomize(['true', 'false'])}, + "CreateIndex": 10, + "ModifyIndex": 10 +} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrules b/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrules new file mode 100644 index 0000000000..8cf7c29b60 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/rolebindingrules @@ -0,0 +1,49 @@ +${ env('CONSUL_ACLS_LEGACY', false) ? `rpc error making call: rpc: can't find method ACL.Method` : ` +[ + ${ + range( + env( + 'CONSUL_BINDING_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_BINDING_MAX', 10) + ) + parseInt(env('CONSUL_BINDING_MIN', 1)) + ) + ) + ).map( + function(item, i) { + return ` + { + "Description": "${fake.lorem.sentence()}", + "IDPName": "${fake.hacker.noun()}-idp", + "Matches": [ + ${ + range(env('CONSUL_MATCH_COUNT', 3)).map( + function(item, i) { + return ` + { + "Selectors": [ + ${ + range(env('CONSUL_SELECTOR_COUNT', fake.random.number({min: 1, max: 5}))).map( + function(item, i) { + return `"serviceaccount.name=${fake.hacker.noun()}"`; + } + ) + } + ] + } + `; + } + ) + } + ], + "RoleName": "${ fake.random.boolean() ? `role-{$i}` : `{{ serviceaccount.name }}`}", + "CreateIndex": 10, + "ModifyIndex": 10 + } + ` + } + ) + } +] +`} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/roles b/ui/packages/consul-ui/mock-api/v1/acl/roles new file mode 100644 index 0000000000..0fc8fe5e1c --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/roles @@ -0,0 +1,90 @@ +${ env('CONSUL_ACLS_LEGACY', false) ? `rpc error making call: rpc: can't find method ACL.Method` : ` +[ + ${ + range( + env( + 'CONSUL_ROLE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_ROLE_MAX', 10) + ) + parseInt(env('CONSUL_ROLE_MIN', 1)) + ) + ) + ).map( + function(item, i) { + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${fake.hacker.noun()}-${i}", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "Description": "${fake.lorem.sentence()}", + "Policies": [ + ${ + range(env('CONSUL_POLICY_COUNT', 10)).map( + function(item, j) { + if(i == 1 && j == 0) { + return ` + { + "ID": "00000000-0000-0000-0000-000000000001", + "Name": "global-management" + } + `; + } + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${fake.hacker.noun()}" + } + `; + } + ) + } + ], + "ServiceIdentities": [ + ${ + range(env('CONSUL_SERVICE_IDENTITY_COUNT', env('CONSUL_IDENTITY_COUNT', 1))).map( + function(item, i) { + return ` + { + "ServiceName": "${fake.hacker.noun()}"${ fake.random.boolean() ? `, + "Datacenters": [ + ${ + range(env('CONSUL_DATACENTER_COUNT', fake.random.number({min: 1, max: 10}))).map( + function(item, i) { + return `"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}"`; + } + ) + } + ] + ` : ``} + } + `; + } + ) + } + ], + "NodeIdentities": [ + ${ + range(env('CONSUL_NODE_IDENTITY_COUNT', 1)).map( + function(item, i) { + return ` + { + "NodeName": "${fake.hacker.noun()}", + "Datacenter":"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}" + } + `; + } + ) + } + ], + "CreateIndex": ${fake.random.number()}, + "ModifyIndex": 10 + } + ` + } + ) + } +] +`} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/token/.config b/ui/packages/consul-ui/mock-api/v1/acl/token/.config new file mode 100644 index 0000000000..485ab5df68 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/token/.config @@ -0,0 +1,13 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + Status-Code: ${ + env('CONSUL_ACLS_LEGACY', false) ? + 500 : + env('CONSUL_ACLS_ENABLE', false) ? (headers['x-consul-token'] !== '' ? 200 : 403) : 401 + } + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/token/_ b/ui/packages/consul-ui/mock-api/v1/acl/token/_ new file mode 100644 index 0000000000..dc01a3c450 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/token/_ @@ -0,0 +1,98 @@ +{ + "AccessorID": "${location.pathname.get(3)}", + "SecretID":"${fake.random.uuid()}", + "IDPName": "${fake.hacker.noun()}", + "Namespace": "${ + typeof location.search.ns !== 'undefined' ? location.search.ns : + typeof http.body.Namespace !== 'undefined' ? http.body.Namespace : 'default' + }", + ${ location.pathname.get(3) === '00000000-0000-0000-0000-000000000002' ? + ` + "Name": "${fake.hacker.noun()}", + "Type":"${fake.helpers.randomize(['client', 'management'])}", + "Rules": ${ + JSON.stringify( +`agent "${fake.hacker.noun()}" { + policy = "write" +} +node "node-0" { + policy = "read" +}` + ) + }, + ` + : + ` + "Policies": [ + ${ + range(env('CONSUL_POLICY_COUNT', 3)).map( + function(item, i) { + return ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}" + } + `; + } + ) + } + ], + "Roles": [ + ${ + range(env('CONSUL_ROLE_COUNT', 10)).map( + function(item, j) { + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${fake.hacker.noun()}" + } + `; + } + ) + } + ], + "ServiceIdentities": [ + ${ + range(env('CONSUL_SERVICE_IDENTITY_COUNT', env('CONSUL_IDENTITY_COUNT', 1))).map( + function(item, i) { + return ` + { + "ServiceName": "${fake.hacker.noun()}"${ fake.random.boolean() ? `, + "Datacenters": [ + ${ + range(env('CONSUL_DATACENTER_COUNT', fake.random.number({min: 1, max: 10}))).map( + function(item, i) { + return `"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}"`; + } + ) + } + ] + ` : ``} + } + `; + } + ) + } + ], + "NodeIdentities": [ + ${ + range(env('CONSUL_NODE_IDENTITY_COUNT', 1)).map( + function(item, i) { + return ` + { + "NodeName": "${fake.hacker.noun()}", + "Datacenter":"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}" + } + `; + } + ) + } + ], + ${ fake.random.boolean() ? '"Local": true,' : "" } + ` + } + "CreateTime":"2017-08-23T22:47:14.695408057Z", + "CreateIndex":7, + "ModifyIndex":7 +} + diff --git a/ui/packages/consul-ui/mock-api/v1/acl/token/self b/ui/packages/consul-ui/mock-api/v1/acl/token/self new file mode 100644 index 0000000000..5b41756a62 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/token/self @@ -0,0 +1,42 @@ +${ env('CONSUL_ACLS_LEGACY', false) ? `rpc error making call: rpc: can't find method ACL.Method` : ` +{ + "AccessorID": "${fake.random.uuid()}", + "SecretID": ${typeof headers['X-Consul-Token'] !== 'undefined' ? '"' + headers['X-Consul-Token'] + '"' : null}, + "Namespace": "${ + typeof location.search.ns !== 'undefined' ? location.search.ns : + typeof http.body.Namespace !== 'undefined' ? http.body.Namespace : 'default' + }", + "Local": false, + "Description": "${fake.lorem.sentence()}", + "Policies": [ + ${ + range(env('CONSUL_POLICY_COUNT', 3)).map( + function(item, i) { + return ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${location.search.policy || fake.hacker.noun()}" + } + `; + } + ) + } + ], + "Roles": [ + ${ + range(env('CONSUL_ROLE_COUNT', 10)).map( + function(item, j) { + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${location.search.role || fake.hacker.noun()}" + } + `; + } + ) + } + ], + "CreateTime": "2019-10-11T11:24:06.1385039Z" +} +`} + diff --git a/ui/packages/consul-ui/mock-api/v1/acl/tokens b/ui/packages/consul-ui/mock-api/v1/acl/tokens new file mode 100644 index 0000000000..a76d58c497 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/tokens @@ -0,0 +1,108 @@ +${ env('CONSUL_ACLS_LEGACY', false) ? `rpc error making call: rpc: can't find method ACL.Method` : ` +[ + ${ + range( + env( + 'CONSUL_TOKEN_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_TOKEN_MAX', 10) + ) + parseInt(env('CONSUL_TOKEN_MIN', 1)) + ) + ) + ).map( + function(item, i) { + return ` + { + "AccessorID": "${i === 1 ? '00000000-0000-0000-0000-000000000002' : fake.random.uuid()}", + "Name": "token-${i}", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "IDPName": "${fake.hacker.noun()}", + "Policies": [ + ${ + range(env('CONSUL_POLICY_COUNT', 10)).map( + function(item, j) { + if(i == 1 && j == 0) { + return ` + { + "ID": "00000000-0000-0000-0000-000000000001", + "Name": "global-management" + } + `; + } + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${fake.hacker.noun()}" + } + `; + } + ) + } + ], + "Roles": [ + ${ + range(env('CONSUL_ROLE_COUNT', 10)).map( + function(item, j) { + return ` + { + "ID": "${fake.random.uuid()}", + "Name": "${fake.hacker.noun()}" + } + `; + } + ) + } + ], + "ServiceIdentities": [ + ${ + range(env('CONSUL_SERVICE_IDENTITY_COUNT', env('CONSUL_IDENTITY_COUNT', 1))).map( + function(item, i) { + return ` + { + "ServiceName": "${fake.hacker.noun()}"${ fake.random.boolean() ? `, + "Datacenters": [ + ${ + range(env('CONSUL_DATACENTER_COUNT', fake.random.number({min: 1, max: 10}))).map( + function(item, i) { + return `"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}"`; + } + ) + } + ] + ` : ``} + } + `; + } + ) + } + ], + "NodeIdentities": [ + ${ + range(env('CONSUL_NODE_IDENTITY_COUNT', 1)).map( + function(item, i) { + return ` + { + "NodeName": "${fake.hacker.noun()}", + "Datacenter":"${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${i}" + } + `; + } + ) + } + ], + ${ fake.random.boolean() && i !== 1 ? '"Legacy": true,' : "" } + ${ fake.random.boolean() ? '"Local": true,' : "" } + "CreateTime": "${fake.date.past(10).toISOString()}", + "Hash": "${fake.internet.password(64)}=", + "CreateIndex": 10, + "ModifyIndex": 10 + } + ` + } + ) + } +] +`} diff --git a/ui/packages/consul-ui/mock-api/v1/acl/update b/ui/packages/consul-ui/mock-api/v1/acl/update new file mode 100644 index 0000000000..0200653ac8 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/acl/update @@ -0,0 +1,3 @@ +{ + "ID": "${body.ID}" +} diff --git a/ui/packages/consul-ui/mock-api/v1/agent/connect/authorize b/ui/packages/consul-ui/mock-api/v1/agent/connect/authorize new file mode 100644 index 0000000000..e6a4b7fd2a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/agent/connect/authorize @@ -0,0 +1,13 @@ +${ + true ? ` +{ + "Authorized": true, + "Reason": "matches intention XXX" +} + ` : ` +{ + "Authorized": false, + "Reason": "denied by intention XXX" +} + ` +} diff --git a/ui/packages/consul-ui/mock-api/v1/agent/connect/ca/leaf/_ b/ui/packages/consul-ui/mock-api/v1/agent/connect/ca/leaf/_ new file mode 100644 index 0000000000..5ddcfd9412 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/agent/connect/ca/leaf/_ @@ -0,0 +1,11 @@ +{ + "SerialNumber": "08", + "CertPEM": "-----BEGIN CERTIFICATE-----\nMIIChjCCAi2gAwIBAgIBCDAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtDb25zdWwg\nQ0EgNzAeFw0xODA1MjExNjMzMjhaFw0xODA1MjQxNjMzMjhaMA4xDDAKBgNVBAMT\nA3dlYjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJdLqRKd1SRycFOFceMHOBZK\nQW8HHO8jZ5C8dRswD+IwTd/otJPiaPrVzGOAi4MsaEUgDMemvN1jiywHt3II08mj\nggFyMIIBbjAOBgNVHQ8BAf8EBAMCA7gwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG\nAQUFBwMBMAwGA1UdEwEB/wQCMAAwaAYDVR0OBGEEXzFmOjkxOmNhOjQxOjhmOmFj\nOjY3OmJmOjU5OmMyOmZhOjRlOjc1OjVjOmQ4OmYwOjU1OmRlOmJlOjc1OmI4OjMz\nOjMxOmQ1OjI0OmIwOjA0OmIzOmU4Ojk3OjViOjdlMGoGA1UdIwRjMGGAXzFmOjkx\nOmNhOjQxOjhmOmFjOjY3OmJmOjU5OmMyOmZhOjRlOjc1OjVjOmQ4OmYwOjU1OmRl\nOmJlOjc1OmI4OjMzOjMxOmQ1OjI0OmIwOjA0OmIzOmU4Ojk3OjViOjdlMFkGA1Ud\nEQRSMFCGTnNwaWZmZTovLzExMTExMTExLTIyMjItMzMzMy00NDQ0LTU1NTU1NTU1\nNTU1NS5jb25zdWwvbnMvZGVmYXVsdC9kYy9kYzEvc3ZjL3dlYjAKBggqhkjOPQQD\nAgNHADBEAiBS8kH3UERhBPHM/CQV/jXKLr0kReLqCdq1jZxc8Aq7hQIgFIus/ZX0\nOM/X3Yc1xb/qJiiEVzXcaz3oVFULOzrNAwk=\n-----END CERTIFICATE-----\n", + "PrivateKeyPEM": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAOGglbwY8HdD3LFX6Bc94co2pzeFTto8ebWoML5E+QfoAoGCCqGSM49\nAwEHoUQDQgAEl0upEp3VJHJwU4Vx4wc4FkpBbwcc7yNnkLx1GzAP4jBN3+i0k+Jo\n+tXMY4CLgyxoRSAMx6a83WOLLAe3cgjTyQ==\n-----END EC PRIVATE KEY-----\n", + "Service": "web", + "ServiceURI": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/web", + "ValidAfter": "2018-05-21T16:33:28Z", + "ValidBefore": "2018-05-24T16:33:28Z", + "CreateIndex": 5, + "ModifyIndex": 5 +} diff --git a/ui/packages/consul-ui/mock-api/v1/agent/connect/ca/roots b/ui/packages/consul-ui/mock-api/v1/agent/connect/ca/roots new file mode 100644 index 0000000000..2543cf543a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/agent/connect/ca/roots @@ -0,0 +1,18 @@ +{ + "ActiveRootID": "15:bf:3a:7d:ff:ea:c1:8c:46:67:6c:db:b8:81:18:36:ad:e5:d0:c7", + "Roots": [ + { + "ID": "15:bf:3a:7d:ff:ea:c1:8c:46:67:6c:db:b8:81:18:36:ad:e5:d0:c7", + "Name": "Consul CA Root Cert", + "SerialNumber": 7, + "SigningKeyID": "31:66:3a:39:31:3a:63:61:3a:34:31:3a:38:66:3a:61:63:3a:36:37:3a:62:66:3a:35:39:3a:63:32:3a:66:61:3a:34:65:3a:37:35:3a:35:63:3a:64:38:3a:66:30:3a:35:35:3a:64:65:3a:62:65:3a:37:35:3a:62:38:3a:33:33:3a:33:31:3a:64:35:3a:32:34:3a:62:30:3a:30:34:3a:62:33:3a:65:38:3a:39:37:3a:35:62:3a:37:65", + "NotBefore": "2018-05-21T16:33:28Z", + "NotAfter": "2028-05-18T16:33:28Z", + "RootCert": "-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIBBzAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtDb25zdWwg\nQ0EgNzAeFw0xODA1MjExNjMzMjhaFw0yODA1MTgxNjMzMjhaMBYxFDASBgNVBAMT\nC0NvbnN1bCBDQSA3MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER0qlxjnRcMEr\niSGlH7G7dYU7lzBEmLUSMZkyBbClmyV8+e8WANemjn+PLnCr40If9cmpr7RnC9Qk\nGTaLnLiF16OCAXswggF3MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/\nMGgGA1UdDgRhBF8xZjo5MTpjYTo0MTo4ZjphYzo2NzpiZjo1OTpjMjpmYTo0ZTo3\nNTo1YzpkODpmMDo1NTpkZTpiZTo3NTpiODozMzozMTpkNToyNDpiMDowNDpiMzpl\nODo5Nzo1Yjo3ZTBqBgNVHSMEYzBhgF8xZjo5MTpjYTo0MTo4ZjphYzo2NzpiZjo1\nOTpjMjpmYTo0ZTo3NTo1YzpkODpmMDo1NTpkZTpiZTo3NTpiODozMzozMTpkNToy\nNDpiMDowNDpiMzplODo5Nzo1Yjo3ZTA/BgNVHREEODA2hjRzcGlmZmU6Ly8xMjRk\nZjVhMC05ODIwLTc2YzMtOWFhOS02ZjYyMTY0YmExYzIuY29uc3VsMD0GA1UdHgEB\n/wQzMDGgLzAtgisxMjRkZjVhMC05ODIwLTc2YzMtOWFhOS02ZjYyMTY0YmExYzIu\nY29uc3VsMAoGCCqGSM49BAMCA0gAMEUCIQDzkkI7R+0U12a+zq2EQhP/n2mHmta+\nfs2hBxWIELGwTAIgLdO7RRw+z9nnxCIA6kNl//mIQb+PGItespiHZKAz74Q=\n-----END CERTIFICATE-----\n", + "IntermediateCerts": null, + "Active": true, + "CreateIndex": 8, + "ModifyIndex": 8 + } + ] +} diff --git a/ui/packages/consul-ui/mock-api/v1/agent/connect/proxy/_ b/ui/packages/consul-ui/mock-api/v1/agent/connect/proxy/_ new file mode 100644 index 0000000000..195f4a0180 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/agent/connect/proxy/_ @@ -0,0 +1,17 @@ +{ + "ProxyServiceID": "web-proxy", + "TargetServiceID": "web", + "TargetServiceName": "web", + "ContentHash": "cffa5f4635b134b9", + "ExecMode": "daemon", + "Command": [ + "/bin/consul", + "connect", + "proxy" + ], + "Config": { + "bind_address": "127.0.0.1", + "bind_port": 20199, + "local_service_address": "127.0.0.1:8181" + } +} diff --git a/ui/packages/consul-ui/mock-api/v1/agent/service/register b/ui/packages/consul-ui/mock-api/v1/agent/service/register new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/packages/consul-ui/mock-api/v1/agent/services b/ui/packages/consul-ui/mock-api/v1/agent/services new file mode 100644 index 0000000000..6397b362e9 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/agent/services @@ -0,0 +1,40 @@ +{ + "web": { + "Kind": "", + "ID": "web", + "Service": "web", + "Tags": [], + "Meta": {}, + "Port": 8181, + "Address": "", + "EnableTagOverride": false, + "CreateIndex": 0, + "ModifyIndex": 0, + "ProxyDestination": "", + "Connect": { + "Proxy": { + "ExecMode": "daemon", + "Command": [ + "/bin/consul", + "connect", + "proxy" + ], + "Config": null + } + } + }, + "web-proxy": { + "Kind": "connect-proxy", + "ID": "web-proxy", + "Service": "web-proxy", + "Tags": [], + "Meta": {}, + "Port": 20199, + "Address": "", + "EnableTagOverride": false, + "CreateIndex": 0, + "ModifyIndex": 0, + "ProxyDestination": "web", + "Connect": null + } +} diff --git a/ui/packages/consul-ui/mock-api/v1/catalog/connect/_ b/ui/packages/consul-ui/mock-api/v1/catalog/connect/_ new file mode 100644 index 0000000000..e15b696944 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/catalog/connect/_ @@ -0,0 +1,72 @@ +${ location.pathname.slice(4).indexOf('-proxy') !== -1 ? `[]` :` +[ + ${ + range( + env( + 'CONSUL_PROXY_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_PROXY_MAX', 10) + ) + parseInt(env('CONSUL_PROXY_MIN', 1)) + ) + ) + ).map((item, i) => ` + { + "ID": "${fake.random.uuid()}", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "Node": "node-${i}", + "Address": "${fake.internet.ip()}", + "Datacenter": "${location.search.dc}", + "TaggedAddresses": { + "lan": "${fake.internet.ip()}", + "wan": "${fake.internet.ip()}" + }, + "NodeMeta": { + "consul-network-segment": "" + }, + "ServiceConnect": {}, + "ServiceKind": "connect-proxy", + "ServiceID": "${location.pathname.slice(4)}-with-id-proxy", + "ServiceName": "${location.pathname.slice(4)}-proxy", + "ServiceTags": ["Tag", "Another Tag"], + "ServiceAddress": "${fake.internet.ip()}", + "ServiceMeta": {}, + "ServicePort": ${fake.random.number({min: 21000, max: 21255})}, + "ServiceEnableTagOverride": false, + "ServiceProxy": { + "Expose": { + "Checks": true, + "Paths": [ +${range(env('CONSUL_EXPOSED_COUNT', 3)).map((i) => ` + { + "Path": "/${fake.lorem.words(fake.random.number({min: 1, max: 5})).split(' ').join('/')}${fake.random.boolean() ? fake.system.fileName() : ''}", + "Protocol": "${fake.helpers.randomize(['http', 'http2', 'grpc'])}", + "LocalPathPort": ${fake.random.number({min: 0, max: 65535})}, + "ListenerPort": ${fake.random.number({min: 0, max: 65535})} + } +`)} + ] + }, + "DestinationServiceName": "${location.pathname.slice(4)}" + ${ location.pathname.slice(4) === "service-0" ? ` + , + "DestinationServiceID": "${location.pathname.slice(4)}-with-id", + "LocalServiceAddress": "${fake.internet.ip()}", + "LocalServicePort": ${fake.random.number({min: 0, max: 65535})} + ` + : ``} + }, + "ServiceProxyDestination": "${location.pathname.slice(4)}", + "ServiceWeights": { + "Passing": 1, + "Warning": 1 + }, + "CreateIndex": 11, + "ModifyIndex": 11 + } + `) + } +] +`} diff --git a/ui/packages/consul-ui/mock-api/v1/catalog/datacenters b/ui/packages/consul-ui/mock-api/v1/catalog/datacenters new file mode 100644 index 0000000000..1b091390c1 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/catalog/datacenters @@ -0,0 +1,13 @@ +[ + ${ + range(env('CONSUL_DATACENTER_COUNT', 10)).map((item, i) => { + if(i === 0) { + return `"dc1"`; + } + return ` + "${fake.address.countryCode().toLowerCase()}_${ i % 2 ? "west" : "east"}-${i}" +`; + } + ) + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/catalog/deregister b/ui/packages/consul-ui/mock-api/v1/catalog/deregister new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/packages/consul-ui/mock-api/v1/catalog/node/_ b/ui/packages/consul-ui/mock-api/v1/catalog/node/_ new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/packages/consul-ui/mock-api/v1/catalog/register b/ui/packages/consul-ui/mock-api/v1/catalog/register new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/packages/consul-ui/mock-api/v1/catalog/service/_ b/ui/packages/consul-ui/mock-api/v1/catalog/service/_ new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/packages/consul-ui/mock-api/v1/connect/.config b/ui/packages/consul-ui/mock-api/v1/connect/.config new file mode 100644 index 0000000000..b3baa4013a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/.config @@ -0,0 +1,8 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/connect/_ b/ui/packages/consul-ui/mock-api/v1/connect/_ new file mode 100644 index 0000000000..389033975e --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/_ @@ -0,0 +1,115 @@ +${ + location.pathname.get(2) === 'intentions' && http.method === 'GET' ? ` +[ + ${ + range( + env( + 'CONSUL_INTENTION_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_INTENTION_MAX', 10) + ) + parseInt(env('CONSUL_INTENTION_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + const legacy = fake.random.boolean(); + return ` + { +${legacy ? ` + "ID": "${fake.random.uuid()}", + "Action": "${fake.helpers.randomize(['allow', 'deny'])}", +`:``} + "Description": "${fake.lorem.sentence()}", + "SourceNS": "default", + "SourceName": "${fake.hacker.noun()}-${i}", + "DestinationNS": "default", + "DestinationName": "${fake.hacker.noun()}", + "SourceType": "${fake.helpers.randomize(['consul', 'externaluri'])}", +${!legacy ? ` + "Permissions": [ +${range( + env( + 'CONSUL_INTENTION_PERMISSION_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_INTENTION_PERMISSION_MAX', 10) + ) + parseInt(env('CONSUL_INTENTION_PERMISSION_MIN', 1)) + ) + ) +).map((item, i) => { + const headerCount = env( + 'CONSUL_HEADER_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_HEADER_MAX', 3) + ) + parseInt(env('CONSUL_HEADER_MIN', 1)) + ) + ); + const path = fake.helpers.randomize(['PathExact', 'PathPrefix', 'PathRegex', '']); + return ` + { + "Action": "${fake.helpers.randomize(['allow', 'deny'])}", + "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() ? ` + "Methods": [ + ${ + fake.helpers.shuffle( + ["GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "PATCH"] + ).filter(item => fake.random.boolean()).map(item => ` + "${item}" + `) + } + ], +` : ``} + "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": "abc"', + '"Prefix": "abc"', + '"Suffix": "xyz"', + '"Regex": "[abc]"' +])} + } +`)} + ] + } + } + +`})} + ], +`:``} + "Precedence": ${i + 1}, +${ fake.random.number({min: 1, max: 10}) > 2 ? ` + "Meta": { + "external-source": "${fake.helpers.randomize(['kubernetes'])}" + }, +` : `` } + "CreatedAt": "2018-05-21T16:41:27.977155457Z", + "UpdatedAt": "2018-05-21T16:41:27.977157724Z", + "CreateIndex": 11, + "ModifyIndex": 11 + } + `; + } + ) + } +] + ` : location.pathname.get(2) === 'intentions' && http.method === 'POST' ? ` +{ + "ID": "${ location.pathname.get(3) }" +} + ` : `` +} diff --git a/ui/packages/consul-ui/mock-api/v1/connect/ca/configuration b/ui/packages/consul-ui/mock-api/v1/connect/ca/configuration new file mode 100644 index 0000000000..352457d23e --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/ca/configuration @@ -0,0 +1,10 @@ +{ + "Provider": "consul", + "Config": { + "PrivateKey": null, + "RootCert": null, + "RotationPeriod": 7776000000000000 + }, + "CreateIndex": 5, + "ModifyIndex": 5 +} diff --git a/ui/packages/consul-ui/mock-api/v1/connect/ca/roots b/ui/packages/consul-ui/mock-api/v1/connect/ca/roots new file mode 100644 index 0000000000..2543cf543a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/ca/roots @@ -0,0 +1,18 @@ +{ + "ActiveRootID": "15:bf:3a:7d:ff:ea:c1:8c:46:67:6c:db:b8:81:18:36:ad:e5:d0:c7", + "Roots": [ + { + "ID": "15:bf:3a:7d:ff:ea:c1:8c:46:67:6c:db:b8:81:18:36:ad:e5:d0:c7", + "Name": "Consul CA Root Cert", + "SerialNumber": 7, + "SigningKeyID": "31:66:3a:39:31:3a:63:61:3a:34:31:3a:38:66:3a:61:63:3a:36:37:3a:62:66:3a:35:39:3a:63:32:3a:66:61:3a:34:65:3a:37:35:3a:35:63:3a:64:38:3a:66:30:3a:35:35:3a:64:65:3a:62:65:3a:37:35:3a:62:38:3a:33:33:3a:33:31:3a:64:35:3a:32:34:3a:62:30:3a:30:34:3a:62:33:3a:65:38:3a:39:37:3a:35:62:3a:37:65", + "NotBefore": "2018-05-21T16:33:28Z", + "NotAfter": "2028-05-18T16:33:28Z", + "RootCert": "-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIBBzAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtDb25zdWwg\nQ0EgNzAeFw0xODA1MjExNjMzMjhaFw0yODA1MTgxNjMzMjhaMBYxFDASBgNVBAMT\nC0NvbnN1bCBDQSA3MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER0qlxjnRcMEr\niSGlH7G7dYU7lzBEmLUSMZkyBbClmyV8+e8WANemjn+PLnCr40If9cmpr7RnC9Qk\nGTaLnLiF16OCAXswggF3MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/\nMGgGA1UdDgRhBF8xZjo5MTpjYTo0MTo4ZjphYzo2NzpiZjo1OTpjMjpmYTo0ZTo3\nNTo1YzpkODpmMDo1NTpkZTpiZTo3NTpiODozMzozMTpkNToyNDpiMDowNDpiMzpl\nODo5Nzo1Yjo3ZTBqBgNVHSMEYzBhgF8xZjo5MTpjYTo0MTo4ZjphYzo2NzpiZjo1\nOTpjMjpmYTo0ZTo3NTo1YzpkODpmMDo1NTpkZTpiZTo3NTpiODozMzozMTpkNToy\nNDpiMDowNDpiMzplODo5Nzo1Yjo3ZTA/BgNVHREEODA2hjRzcGlmZmU6Ly8xMjRk\nZjVhMC05ODIwLTc2YzMtOWFhOS02ZjYyMTY0YmExYzIuY29uc3VsMD0GA1UdHgEB\n/wQzMDGgLzAtgisxMjRkZjVhMC05ODIwLTc2YzMtOWFhOS02ZjYyMTY0YmExYzIu\nY29uc3VsMAoGCCqGSM49BAMCA0gAMEUCIQDzkkI7R+0U12a+zq2EQhP/n2mHmta+\nfs2hBxWIELGwTAIgLdO7RRw+z9nnxCIA6kNl//mIQb+PGItespiHZKAz74Q=\n-----END CERTIFICATE-----\n", + "IntermediateCerts": null, + "Active": true, + "CreateIndex": 8, + "ModifyIndex": 8 + } + ] +} diff --git a/ui/packages/consul-ui/mock-api/v1/connect/intentions/_ b/ui/packages/consul-ui/mock-api/v1/connect/intentions/_ new file mode 100644 index 0000000000..f3e9a8ca51 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/intentions/_ @@ -0,0 +1,91 @@ +${range(1).map(item => { + const ID = location.pathname.get(3); + const legacy = ID.indexOf('%3A') === -1; +return ` + { + "ID": "${legacy ? ID : ''}" +${ http.method !== "PUT" ? ` + ,"Description": "${fake.lorem.sentence()}", + "SourceNS": "default", + "SourceName": "${fake.hacker.noun()}", + "DestinationNS": "default", + "DestinationName": "${fake.hacker.noun()}", + "SourceType": "${fake.helpers.randomize(['consul', 'externaluri'])}", +${legacy ? ` + "Action": "${fake.helpers.randomize(['allow', 'deny'])}", +`:``} +${!legacy ? ` + "Permissions": [ +${range( + env( + 'CONSUL_INTENTION_PERMISSION_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_INTENTION_PERMISSION_MAX', 10) + ) + parseInt(env('CONSUL_INTENTION_PERMISSION_MIN', 1)) + ) + ) +).map((item, i) => { + const headerCount = env( + 'CONSUL_HEADER_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_HEADER_MAX', 3) + ) + parseInt(env('CONSUL_HEADER_MIN', 1)) + ) + ); + const path = fake.helpers.randomize(['PathExact', 'PathPrefix', 'PathRegex', '']); + return ` + { + "Action": "${fake.helpers.randomize(['allow', 'deny'])}", + "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() ? ` + "Methods": [ + ${ + fake.helpers.shuffle( + ["GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "PATCH"] + ).filter(item => fake.random.boolean()).map(item => ` + "${item}" + `) + } + ], +` : ``} + "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": "abc"', + '"Prefix": "abc"', + '"Suffix": "xyz"', + '"Regex": "[abc]"' +])} + } +`)} + ] + } + } +`})} + ], +`:``} + "Precedence": ${fake.random.number({min: 1, max: 100})}, +${ !legacy && fake.random.number({min: 1, max: 10}) > 2 ? ` + "Meta": { + "external-source": "${fake.helpers.randomize(['kubernetes'])}" + }, +` : `` } + "CreatedAt": "2018-05-21T16:41:27.977155457Z", + "UpdatedAt": "2018-05-21T16:41:27.977157724Z", + "CreateIndex": 11, + "ModifyIndex": 11 +` : ``} + } +`})} diff --git a/ui/packages/consul-ui/mock-api/v1/connect/intentions/check b/ui/packages/consul-ui/mock-api/v1/connect/intentions/check new file mode 100644 index 0000000000..0352d975b0 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/intentions/check @@ -0,0 +1,4 @@ +{ + "Allowed": true +} + diff --git a/ui/packages/consul-ui/mock-api/v1/connect/intentions/exact b/ui/packages/consul-ui/mock-api/v1/connect/intentions/exact new file mode 100644 index 0000000000..0b8d1269c8 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/intentions/exact @@ -0,0 +1,93 @@ +${range(1).map(item => { + const ID = fake.random.uuid(); + const legacy = ID.indexOf('%3A') === -1; + const source = location.search.source.split('/'); + const destination = location.search.destination.split('/'); +return ` + { + "ID": "${legacy ? ID : ''}" +${ http.method !== "PUT" ? ` + ,"Description": "${fake.lorem.sentence()}", + "SourceNS": "${source[0]}", + "SourceName": "${source[1]}", + "DestinationNS": "${destination[0]}", + "DestinationName": "${destination[1]}", + "SourceType": "${fake.helpers.randomize(['consul', 'externaluri'])}", +${legacy ? ` + "Action": "${fake.helpers.randomize(['allow', 'deny'])}", +`:``} +${!legacy ? ` + "Permissions": [ +${range( + env( + 'CONSUL_INTENTION_PERMISSION_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_INTENTION_PERMISSION_MAX', 10) + ) + parseInt(env('CONSUL_INTENTION_PERMISSION_MIN', 1)) + ) + ) +).map((item, i) => { + const headerCount = env( + 'CONSUL_HEADER_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_HEADER_MAX', 3) + ) + parseInt(env('CONSUL_HEADER_MIN', 1)) + ) + ); + const path = fake.helpers.randomize(['PathExact', 'PathPrefix', 'PathRegex', '']); + return ` + { + "Action": "${fake.helpers.randomize(['allow', 'deny'])}", + "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() ? ` + "Methods": [ + ${ + fake.helpers.shuffle( + ["GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "PATCH"] + ).filter(item => fake.random.boolean()).map(item => ` + "${item}" + `) + } + ], +` : ``} + "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": "abc"', + '"Prefix": "abc"', + '"Suffix": "xyz"', + '"Regex": "[abc]"' +])} + } +`)} + ] + } + } +`})} + ], +`:``} + "Precedence": ${fake.random.number({min: 1, max: 100})}, +${ !legacy && fake.random.number({min: 1, max: 10}) > 2 ? ` + "Meta": { + "external-source": "${fake.helpers.randomize(['kubernetes'])}" + }, +` : `` } + "CreatedAt": "2018-05-21T16:41:27.977155457Z", + "UpdatedAt": "2018-05-21T16:41:27.977157724Z", + "CreateIndex": 11, + "ModifyIndex": 11 +` : ``} + } +`})} diff --git a/ui/packages/consul-ui/mock-api/v1/connect/intentions/match b/ui/packages/consul-ui/mock-api/v1/connect/intentions/match new file mode 100644 index 0000000000..cf99720d50 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/connect/intentions/match @@ -0,0 +1,38 @@ +{ + "db": [ + { + "ID": "ed16f6a6-d863-1bec-af45-96bbdcbe02be", + "Description": "", + "SourceNS": "default", + "SourceName": "billing", + "DestinationNS": "default", + "DestinationName": "db", + "SourceType": "consul", + "Action": "deny", + "DefaultAddr": "", + "DefaultPort": 0, + "Meta": {}, + "CreatedAt": "2018-05-21T16:41:33.296693825Z", + "UpdatedAt": "2018-05-21T16:41:33.296694288Z", + "CreateIndex": 12, + "ModifyIndex": 12 + }, + { + "ID": "e9ebc19f-d481-42b1-4871-4d298d3acd5c", + "Description": "", + "SourceNS": "default", + "SourceName": "web", + "DestinationNS": "default", + "DestinationName": "db", + "SourceType": "consul", + "Action": "allow", + "DefaultAddr": "", + "DefaultPort": 0, + "Meta": {}, + "CreatedAt": "2018-05-21T16:41:27.977155457Z", + "UpdatedAt": "2018-05-21T16:41:27.977157724Z", + "CreateIndex": 11, + "ModifyIndex": 11 + } + ] +} diff --git a/ui/packages/consul-ui/mock-api/v1/coordinate/.config b/ui/packages/consul-ui/mock-api/v1/coordinate/.config new file mode 100644 index 0000000000..7c74663cd4 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/coordinate/.config @@ -0,0 +1,10 @@ +--- +"*": + GET: + "*": + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} + index: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } diff --git a/ui/packages/consul-ui/mock-api/v1/coordinate/nodes b/ui/packages/consul-ui/mock-api/v1/coordinate/nodes new file mode 100644 index 0000000000..d79a16b71f --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/coordinate/nodes @@ -0,0 +1,30 @@ +[ + ${ + range( + env( + 'CONSUL_NODE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_NODE_MAX', 10) + ) + parseInt(env('CONSUL_NODE_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + return ` + { + "Node":"node-${i}", + "Segment":"", + "Coord":{ + "Vec":[${range(7).map((item, i) => fake.random.number())}], + "Error":1.5, + "Adjustment":0, + "Height":0.0000${fake.random.number()} + } + } + `; + } + ) + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/discovery-chain/.config b/ui/packages/consul-ui/mock-api/v1/discovery-chain/.config new file mode 100644 index 0000000000..b79f23c963 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/.config @@ -0,0 +1,9 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} + diff --git a/ui/packages/consul-ui/mock-api/v1/discovery-chain/_ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/_ new file mode 100644 index 0000000000..f5f5d0109e --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/_ @@ -0,0 +1,352 @@ +${ + [1].map(() => { + + const namespaces = ['default']; + const ns = location.search.ns || '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}.${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}.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}`, + 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}", + "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}`)}`, + Namespace: `${resolver.Name.replace(`.${ns}.`, `.fail-${ns}.`).replace(`.redirect-${ns}.`, `.fail-${ns}.`)}`, + })[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}`)}`, + Namespace: `${subset}.${resolver.Name.replace(`.${ns}.`, `.fail-${ns}.`)}`, + })[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}", + "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}", + "Datacenter": "${dc}", + "MeshGateway": { + }, + "Subset": { + "Filter": "Service.Meta.value == ${ktem}" + }, + "SNI": "${name}", + "Name": "${name}" + } + `})} +`})} + } + } +} +`})} diff --git a/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-1 b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-1 new file mode 100644 index 0000000000..13177cdd58 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-1 @@ -0,0 +1 @@ +{"Chain":{"ServiceName":"virtual-admin-1","Namespace":"default","Datacenter":"dc-gcp","Protocol":"http","StartNode":"router:virtual-admin-1","Nodes":{"resolver:virtual-admin-1.default.dc-gcp":{"Type":"resolver","Name":"virtual-admin-1.default.dc-gcp","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"virtual-admin-1.default.dc-gcp"}},"resolver:web.default.dc-aws":{"Type":"resolver","Name":"web.default.dc-aws","Resolver":{"ConnectTimeout":"15s","Target":"web.default.dc-aws","Failover":{"Targets":["web.default.dc-gcp"]}}},"resolver:web.default.dc-gcp":{"Type":"resolver","Name":"web.default.dc-gcp","Resolver":{"ConnectTimeout":"15s","Target":"web.default.dc-gcp","Failover":{"Targets":["web.default.dc-aws"]}}},"router:virtual-admin-1":{"Type":"router","Name":"virtual-admin-1","Routes":[{"Definition":{"Match":{"HTTP":{"PathPrefix":"/login"}},"Destination":{"Service":"login","PrefixRewrite":"/"}},"NextNode":"splitter:login.default"},{"Definition":{"Destination":{"Service":"global-admin"}},"NextNode":"splitter:global-admin.default"},{"Definition":{"Match":{"HTTP":{"PathPrefix":"/"}},"Destination":{"Service":"virtual-admin-1"}},"NextNode":"resolver:virtual-admin-1.default.dc-gcp"}]},"splitter:global-admin.default":{"Type":"splitter","Name":"global-admin.default","Splits":[{"Weight":50,"NextNode":"resolver:web.default.dc-aws"},{"Weight":50,"NextNode":"resolver:web.default.dc-gcp"}]},"splitter:login.default":{"Type":"splitter","Name":"login.default","Splits":[{"Weight":50,"NextNode":"resolver:web.default.dc-gcp"},{"Weight":50,"NextNode":"resolver:web.default.dc-aws"}]}},"Targets":{"virtual-admin-1.default.dc-gcp":{"ID":"virtual-admin-1.default.dc-gcp","Service":"virtual-admin-1","Namespace":"default","Datacenter":"dc-gcp","MeshGateway":{},"Subset":{},"SNI":"virtual-admin-1.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul","Name":"virtual-admin-1.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul"},"web.default.dc-aws":{"ID":"web.default.dc-aws","Service":"web","Namespace":"default","Datacenter":"dc-aws","MeshGateway":{"Mode":"local"},"Subset":{},"SNI":"web.default.dc-aws.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul","Name":"web.default.dc-aws.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul"},"web.default.dc-gcp":{"ID":"web.default.dc-gcp","Service":"web","Namespace":"default","Datacenter":"dc-gcp","MeshGateway":{},"Subset":{},"SNI":"web.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul","Name":"web.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul"}}}} diff --git a/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-2 b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-2 new file mode 100644 index 0000000000..221964e5c3 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-2 @@ -0,0 +1 @@ +{"Chain":{"ServiceName":"virtual-admin-2","Namespace":"default","Datacenter":"dc-gcp","Protocol":"http","StartNode":"splitter:virtual-admin-2.default","Nodes":{"resolver:web.default.dc-aws":{"Type":"resolver","Name":"web.default.dc-aws","Resolver":{"ConnectTimeout":"15s","Target":"web.default.dc-aws","Failover":{"Targets":["web.default.dc-gcp"]}}},"resolver:web.default.dc-gcp":{"Type":"resolver","Name":"web.default.dc-gcp","Resolver":{"ConnectTimeout":"15s","Target":"web.default.dc-gcp","Failover":{"Targets":["web.default.dc-aws"]}}},"splitter:virtual-admin-2.default":{"Type":"splitter","Name":"virtual-admin-2.default","Splits":[{"Weight":50,"NextNode":"resolver:web.default.dc-gcp"},{"Weight":50,"NextNode":"resolver:web.default.dc-aws"}]}},"Targets":{"web.default.dc-aws":{"ID":"web.default.dc-aws","Service":"web","Namespace":"default","Datacenter":"dc-aws","MeshGateway":{"Mode":"local"},"Subset":{},"SNI":"web.default.dc-aws.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul","Name":"web.default.dc-aws.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul"},"web.default.dc-gcp":{"ID":"web.default.dc-gcp","Service":"web","Namespace":"default","Datacenter":"dc-gcp","MeshGateway":{},"Subset":{},"SNI":"web.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul","Name":"web.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul"}}}} diff --git a/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-3 b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-3 new file mode 100644 index 0000000000..9f7f32eba4 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-3 @@ -0,0 +1 @@ +{"Chain":{"ServiceName":"virtual-admin-3","Namespace":"default","Datacenter":"dc-gcp","Protocol":"http","StartNode":"splitter:virtual-admin-3.default","Nodes":{"resolver:web.default.dc-aws":{"Type":"resolver","Name":"web.default.dc-aws","Resolver":{"ConnectTimeout":"15s","Target":"web.default.dc-aws"}},"resolver:web.default.dc-gcp":{"Type":"resolver","Name":"web.default.dc-gcp","Resolver":{"ConnectTimeout":"15s","Target":"web.default.dc-gcp"}},"splitter:virtual-admin-3.default":{"Type":"splitter","Name":"virtual-admin-3.default","Splits":[{"Weight":50,"NextNode":"resolver:web.default.dc-gcp"},{"Weight":50,"NextNode":"resolver:web.default.dc-aws"}]}},"Targets":{"web.default.dc-aws":{"ID":"web.default.dc-aws","Service":"web","Namespace":"default","Datacenter":"dc-aws","MeshGateway":{"Mode":"local"},"Subset":{},"SNI":"web.default.dc-aws.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul","Name":"web.default.dc-aws.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul"},"web.default.dc-gcp":{"ID":"web.default.dc-gcp","Service":"web","Namespace":"default","Datacenter":"dc-gcp","MeshGateway":{},"Subset":{},"SNI":"web.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul","Name":"web.default.dc-gcp.internal.ede9daf4-b641-3954-5a52-15f4fd666f6e.consul"}}}} diff --git a/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-4 b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-4 new file mode 100644 index 0000000000..f0bf99482e --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-4 @@ -0,0 +1 @@ +{"Chain":{"ServiceName":"virtual-admin-4","Namespace":"default","Datacenter":"dc1","Protocol":"http","StartNode":"router:virtual-admin-4","Nodes":{"resolver:admin.default.dc1":{"Type":"resolver","Name":"admin.default.dc1","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"admin.default.dc1"}},"resolver:admin.default.dc2":{"Type":"resolver","Name":"admin.default.dc2","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"admin.default.dc2"}},"resolver:login.default.dc1":{"Type":"resolver","Name":"login.default.dc1","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"login.default.dc1"}},"resolver:virtual-admin-4.default.dc1":{"Type":"resolver","Name":"virtual-admin-4.default.dc1","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"virtual-admin-4.default.dc1"}},"router:virtual-admin-4":{"Type":"router","Name":"virtual-admin-4","Routes":[{"Definition":{"Match":{"HTTP":{"PathPrefix":"/login"}},"Destination":{"Service":"login","PrefixRewrite":"/"}},"NextNode":"resolver:login.default.dc1"},{"Definition":{"Destination":{"Service":"global-admin"}},"NextNode":"splitter:global-admin.default"},{"Definition":{"Match":{"HTTP":{"PathPrefix":"/"}},"Destination":{"Service":"virtual-admin-4"}},"NextNode":"resolver:virtual-admin-4.default.dc1"}]},"splitter:global-admin.default":{"Type":"splitter","Name":"global-admin.default","Splits":[{"Weight":50,"NextNode":"resolver:admin.default.dc1"},{"Weight":50,"NextNode":"resolver:admin.default.dc2"}]}},"Targets":{"admin.default.dc1":{"ID":"admin.default.dc1","Service":"admin","Namespace":"default","Datacenter":"dc1","MeshGateway":{},"Subset":{},"SNI":"admin.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"admin.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"},"admin.default.dc2":{"ID":"admin.default.dc2","Service":"admin","Namespace":"default","Datacenter":"dc2","MeshGateway":{"Mode":"local"},"Subset":{},"SNI":"admin.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"admin.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"},"login.default.dc1":{"ID":"login.default.dc1","Service":"login","Namespace":"default","Datacenter":"dc1","MeshGateway":{},"Subset":{},"SNI":"login.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"login.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"},"virtual-admin-4.default.dc1":{"ID":"virtual-admin-4.default.dc1","Service":"virtual-admin-4","Namespace":"default","Datacenter":"dc1","MeshGateway":{},"Subset":{},"SNI":"virtual-admin-4.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"virtual-admin-4.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"}}}} diff --git a/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-5 b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-5 new file mode 100644 index 0000000000..35a216eedd --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/discovery-chain/virtual-admin-5 @@ -0,0 +1 @@ +{"Chain":{"ServiceName":"virtual-admin-5","Namespace":"default","Datacenter":"dc2","Protocol":"http","StartNode":"router:virtual-admin-5","Nodes":{"resolver:admin.default.dc1":{"Type":"resolver","Name":"admin.default.dc1","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"admin.default.dc1"}},"resolver:admin.default.dc2":{"Type":"resolver","Name":"admin.default.dc2","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"admin.default.dc2"}},"resolver:login.default.dc2":{"Type":"resolver","Name":"login.default.dc2","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"login.default.dc2"}},"resolver:virtual-admin-5.default.dc2":{"Type":"resolver","Name":"virtual-admin-5.default.dc2","Resolver":{"ConnectTimeout":"5s","Default":true,"Target":"virtual-admin-5.default.dc2"}},"router:virtual-admin-5":{"Type":"router","Name":"virtual-admin-5","Routes":[{"Definition":{"Match":{"HTTP":{"PathPrefix":"/login"}},"Destination":{"Service":"login","PrefixRewrite":"/"}},"NextNode":"resolver:login.default.dc2"},{"Definition":{"Match":{"HTTP":{"PathPrefix":"/"}},"Destination":{"Service":"global-admin"}},"NextNode":"splitter:global-admin.default"},{"Definition":{"Match":{"HTTP":{"PathPrefix":"/"}},"Destination":{"Service":"virtual-admin-5"}},"NextNode":"resolver:virtual-admin-5.default.dc2"}]},"splitter:global-admin.default":{"Type":"splitter","Name":"global-admin.default","Splits":[{"Weight":50,"NextNode":"resolver:admin.default.dc1"},{"Weight":50,"NextNode":"resolver:admin.default.dc2"}]}},"Targets":{"admin.default.dc1":{"ID":"admin.default.dc1","Service":"admin","Namespace":"default","Datacenter":"dc1","MeshGateway":{"Mode":"local"},"Subset":{},"SNI":"admin.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"admin.default.dc1.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"},"admin.default.dc2":{"ID":"admin.default.dc2","Service":"admin","Namespace":"default","Datacenter":"dc2","MeshGateway":{},"Subset":{},"SNI":"admin.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"admin.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"},"login.default.dc2":{"ID":"login.default.dc2","Service":"login","Namespace":"default","Datacenter":"dc2","MeshGateway":{},"Subset":{},"SNI":"login.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"login.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"},"virtual-admin-5.default.dc2":{"ID":"virtual-admin-5.default.dc2","Service":"virtual-admin-5","Namespace":"default","Datacenter":"dc2","MeshGateway":{},"Subset":{},"SNI":"virtual-admin-5.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul","Name":"virtual-admin-5.default.dc2.internal.6818c189-1048-8114-7d9f-ae248864b349.consul"}}}} diff --git a/ui/packages/consul-ui/mock-api/v1/health/service/.config b/ui/packages/consul-ui/mock-api/v1/health/service/.config new file mode 100644 index 0000000000..b3baa4013a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/health/service/.config @@ -0,0 +1,8 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/health/service/_ b/ui/packages/consul-ui/mock-api/v1/health/service/_ new file mode 100644 index 0000000000..468f9f25da --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/health/service/_ @@ -0,0 +1,160 @@ +[ + ${ + range( + env( + 'CONSUL_NODE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_NODE_MAX', 10) + ) + parseInt(env('CONSUL_NODE_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + const node = `node-${i}`; + const service = location.pathname.slice(4); + const ip = fake.internet.ip(); + const proxy = service.indexOf('-proxy') + const sidecar = service.indexOf('-sidecar-proxy') + const id = (proxy !== -1 ? service.slice(0, -6) + '-with-id-proxy' : service + '-with-id'); + let kind = ''; + switch(true) { + case service.endsWith('-mesh-gateway'): + kind = 'mesh-gateway'; + break; + case service.endsWith('-terminating-gateway'): + kind = 'terminating-gateway'; + break; + case service.endsWith('-ingress-gateway'): + kind = 'ingress-gateway'; + break; + case service.endsWith('-proxy'): + kind = 'connect-proxy'; + break; + } + + return ` + { + "Node":{ + "ID":"7037e928-d9e8-3b58-4712-6f5ded209002", + "Node":"${node}", + "Address":"${ip}", + "Datacenter":"dc1", + "TaggedAddresses":{"lan":"${ip}","wan":"${ip}"}, + "Meta":{"${service}-network-segment":""}, + "CreateIndex":5, + "ModifyIndex":6 + }, + "Service":{ + "ID": "${ i === 0 ? id : fake.helpers.randomize([service, service + '-ID'])}", + "Service":"${service}", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "Tags":[ + ${ + range( + env( + 'CONSUL_TAG_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_TAG_MAX', 10) + ) + parseInt(env('CONSUL_TAG_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + return `"${fake.hacker.noun()}"`; + } + ) + } + ], +${ fake.random.number({min: 1, max: 10}) > 2 ? ` + "Meta": { + "consul-dashboard-url": "${fake.internet.protocol()}://${fake.internet.domainName()}/?id={{Service}}", + "external-source": "${fake.helpers.randomize(['consul', 'nomad', 'terraform', 'kubernetes', 'aws', ''])}" + }, +` : `` } + "Address":"${fake.internet.ip()}", + "Port":${fake.random.number({min: 0, max: 65535})}, +${kind !== '' ? ` + "Kind": "${kind}", +` : `` } + "Proxy": { +${proxy !== -1 && sidecar === -1 ? ` + "DestinationServiceName": "${service.substr(0, proxy)}", +` : ``} +${sidecar !== -1 ? ` + "DestinationServiceName": "${service.substr(0, sidecar)}", + "DestinationServiceID": "${service.substr(0, sidecar)}-ID", + "LocalServiceAddress": "${fake.internet.ip()}", + "LocalServicePort": ${fake.random.number({min: 0, max: 65535})}, +` : ``} +${proxy !== -1 ? ` + "Expose": { + "Checks": true, + "Paths": [ +${range(env('CONSUL_EXPOSED_COUNT', 3)).map((i) => ` + { + "Path": "/${fake.lorem.words(fake.random.number({min: 1, max: 5})).split(' ').join('/')}${fake.random.boolean() ? fake.system.fileName() : ''}", + "Protocol": "${fake.helpers.randomize(['http', 'http2', 'grpc'])}", + "LocalPathPort": ${fake.random.number({min: 0, max: 65535})}, + "ListenerPort": ${fake.random.number({min: 0, max: 65535})} + } +`)} + ] + }, + "Upstreams": [ + ${range(env('CONSUL_UPSTREAM_COUNT', 10)).map((item, j) => ` + { + "Datacenter": "${fake.address.countryCode().toLowerCase()} ${ i % 2 ? "west" : "east"}-${j}", + "DestinationName": "${fake.hacker.noun()}", + "DestinationNamespace": "${fake.hacker.noun()}", + "DestinationType": "${fake.helpers.randomize(['service', 'prepared_query'])}", + "LocalBindAddress": "${fake.internet.ip()}", + "LocalBindPort": ${fake.random.number({min: 0, max: 65535})} + } + `)} + ] +` : ``} + }, + "ProxyDestination": "", + "EnableTagOverride":false, + "CreateIndex":5, + "ModifyIndex":5 + }, + "Checks":[ + ${ + range(env('CONSUL_CHECK_COUNT', 10)).map( + function(item, j) { + const passing = i > 7 || j > fake.random.number(4); + const id = fake.helpers.randomize([service, '']); + return ` + { + "Node":"${node}", + "CheckID":"${fake.hacker.noun()}Health", + "Name":"${fake.hacker.noun()} Status", + "Type": "${j === 0 ? 'ttl' : (j === 1 ? 'http' : fake.helpers.randomize(['script', 'http', 'tcp', 'ttl', 'docker', 'grpc', 'alias']))}", + "Status":"${j < 2 ? 'critical' : (passing ? "passing" : fake.helpers.randomize(['warning', 'critical']))}", + "Notes":"${fake.lorem.paragraph()}", + "Output":"${fake.internet.ipv6()} ${fake.internet.protocol()}://${fake.internet.userName()}:${fake.internet.password()}@${fake.internet.domainName()} ${fake.internet.userAgent()}", + "ServiceID":"${j < 2 ? service : id}", + "ServiceName":"", + "ServiceTags":["Tag"], + "Definition":{}, + "CreateIndex":5, + "ModifyIndex":5 + } + `; + } + ) + } + ] + } + `; + } + ) + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/internal/acl/authorize b/ui/packages/consul-ui/mock-api/v1/internal/acl/authorize new file mode 100644 index 0000000000..9f410abbd0 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/acl/authorize @@ -0,0 +1,34 @@ +[ + { + "Resource": "acl", + "Access": "read", + "Allow": false + }, + { + "Resource": "acl", + "Access": "write", + "Allow": false + }, + { + "Resource": "operator", + "Access": "read", + "Allow": true + }, + { + "Resource": "operator", + "Access": "write", + "Allow": true + }, + { + "Resource": "service", + "Segment": "web", + "Access": "read", + "Allow": true + }, + { + "Resource": "service", + "Segment": "web", + "Access": "write", + "Allow": true + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/.config b/ui/packages/consul-ui/mock-api/v1/internal/ui/.config new file mode 100644 index 0000000000..b3baa4013a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/.config @@ -0,0 +1,8 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/.config b/ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/.config new file mode 100644 index 0000000000..b3baa4013a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/.config @@ -0,0 +1,8 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/_ b/ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/_ new file mode 100644 index 0000000000..9b871e930e --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/gateway-services-nodes/_ @@ -0,0 +1,70 @@ +[ + ${ + range( + env( + 'CONSUL_SERVICE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_SERVICE_MAX', 10) + ) + parseInt(env('CONSUL_SERVICE_MIN', 1)) + ) + ) + ).map((item, i) => ` + { + "Name": "service-${i}", +${i === 1 ? ` + "Namespace": "default", +` : ` + "Namespace": "${fake.hacker.noun()}-ns-${i}", +`} + "Tags": [ + ${ + range(env('CONSUL_TAG_COUNT', fake.random.number(10))).map( + function(item, i) + { + return `"${fake.hacker.noun()}"`; + } + ) + } + ], + "Nodes": [ + ${ + range(env('CONSUL_NODE_COUNT', 100)).map( + function(item, i) + { + return `"node-${i}"`; + } + ) + } + ], + "InstanceCount": ${fake.helpers.randomize([fake.random.number({min: 1, max: 100})])}, + "ChecksPassing":${fake.random.number({min: 1, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksWarning":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksCritical":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, +${ fake.random.number({min: 1, max: 10}) > 2 ? ` + "ExternalSources": [ + ${ + range(fake.random.number({min: 1, max: 1})).map( + function(item, i) + { + return `"${fake.helpers.randomize(['consul', 'nomad', 'terraform', 'kubernetes', 'aws', ''])}"`; + } + ) + } + ], +` : `` } + "GatewayConfig": { + "Addresses": [ + ${ + range(fake.random.number(6)).map( + function(item, i) + { + return `"${fake.random.number({min: 1, max: 10}) > 8 ? `*.`: ``}${fake.internet.domainName()}:${fake.random.number({min: 0, max: 65535})}"`; + } + ) + } + ] + } + } + `)} +] \ No newline at end of file diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/.config b/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/.config new file mode 100644 index 0000000000..dccc951920 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/.config @@ -0,0 +1,5 @@ +--- +"*": + GET: + "*": + latency: ${env('CONSUL_LATENCY', 0)} diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query b/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query new file mode 100644 index 0000000000..d70e09653a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query @@ -0,0 +1,181 @@ +{ + "status": "success", + "data": { + "resultType": "vector", + "result": [ + ${ + [1].map(function(_){ + var type = "service"; + var proto = "tcp"; + + var q = location.search.query; + + // Match the relabel arguments since "downstream" appears in both + // "service" and "upstream" type queries' metric names while + // "upstream" appears in downstream query metric names (confusingly). + if (q.match('"upstream"')) { + type = "upstream"; + } else if (q.match('"downstream"')) { + type = "downstream"; + } + + if (q.match('envoy_http_')) { + proto = "http"; + } + + // NOTE!!! The logic below to pick the upstream/downstream service + // names must exactly match the logic in internal/ui/service-topology/_ + // If you change this, change it there too! + + // Pick a number of down/upstreams to return based on the cookie variable. + // If you change anything about this variable or it's default, you'll need + // to change the topology endpoint to match. + var numResults = 1; + if (type === "upstream") { + numResults = env("CONSUL_UPSTREAM_COUNT", 3); + } + if (type === "downstream") { + numResults = env("CONSUL_DOWNSTREAM_COUNT", 5); + } + + var genFakeServiceNames = function(num) { + // Seed faker by the number of results we want to make it deterministic + // here and in other correlated endpoints. + fake.seed(num); + var serviceNames = []; + for (var i = 0; i < num; i++) { + serviceNames.push(`service-${fake.random.number({min:0, max:99})}`) + } + return serviceNames + }; + + // Figure out the actual name for the target service + var targetService = "invalid-local-cluster"; + var m = q.match(/local_cluster="([^"]*)"/); + if (m && m.length >= 2 && m[1] != "") { + targetService = m[1]; + } + m = q.match(/consul_service="([^"]*)"/); + if (type == "downstream" && m && m.length >= 2 && m[1] != "") { + // downstreams don't have the same selector for the main service + // name. + targetService = m[1]; + } + + var serviceNames = []; + switch(type) { + case "downstream": // fallthrough + case "upstream": + serviceNames = genFakeServiceNames(numResults); + break; + default: + // fallthrough + case "service": + serviceNames = [targetService]; + break; + } + + // little helper to get a deterministic number from the target service + // name string. NOTE: this should be the same as in service-topology + // endpoint so metrics match what is requested. + var hashStr = function(s) { + for(var i = 0, h = 0xdeadbeef; i < s.length; i++) + h = Math.imul(h ^ s.charCodeAt(i), 2654435761); + return (h ^ h >>> 16) >>> 0; + }; + + var serviceProto = "tcp" + // Randomly pick the serviceProtocol which will affect which types of + // stats we return for downstream clusters. But we need it to be + // deterministic for a given service name so that all the downstream + // stats are consistently typed. + fake.seed(hashStr(targetService)) + if (fake.random.number(1) > 0.5) { + serviceProto = "http"; + } + + // For up/downstreams only return HTTP metrics half of the time. + + // For upstreams it's based on the upstream's protocol which might be + // mixed so alternate protocols for upstreams. + if (type == "upstream") { + // Pretend all odd service indexes are tcp and even are http + var wantMod = 0; + if (proto == "tcp") { + wantMod = 1; + } + serviceNames = serviceNames.filter(function(x, i){ return i%2 == wantMod }) + } + // For downstreams it's based on the target's protocol which we + // don't really know but all downstreams should be the same type + // so only return metrics for that protocol. + if (type == "downstream" && proto == "http" && serviceProto != "http") { + serviceNames = []; + } + + // Work out which metric is being queried to make them more realistic. + var range = 100; + switch(proto) { + case "http": + if (q.match('envoy_response_code_class="5"')) { + // It's error rate make it a percentage + range = 30; + } else if (q.match("rq_completed")) { + // Requests per second + range = 1000; + } else if (q.match("quantile\\(0.99")) { + // 99 percentile time in ms make it longer than 50 percentile + range = 5000; + } else if (q.match("quantile\\(0.5")) { + // 50th percentile + range = 500; + } + break; + case "tcp": + if (q.match('cx_total')) { + // New conns per second + range = 100; + } else if (q.match('cx_rx_bytes')) { + // inbound data rate tends to be lower than outbound + range = 0.5 * 1e9; + } else if (q.match('cx_tx_bytes')) { + // inbound data rate + range = 1e9; + } + // no route/connect faile are OK with default 0-100 + break; + } + + var randExp = function(max, lambda) { + return (-Math.log(1-(1-Math.exp(-lambda))*Math.random())/lambda) * max; + } + + // Now generate the data points + return serviceNames.map(function(name, i){ + var metric = `{}`; + switch(type) { + default: + break; + case "upstream": + // TODO: this should really return tcp proxy label for tcp + // metrics but we don't look at that for now. + metric = `{"upstream": "${name}", "envoy_http_conn_manager_prefix": "${name}"}`; + break; + case "downstream": + metric = `{"downstream": "${name}", "local_cluster": "${name}"}`; + break; + } + return `{ + "metric": ${metric}, + "value": [ + ${Date.now()/1000}, + "${randExp(range, 20)}" + ] + }`; + }).join(",") + + })[0] + } + ] + } +} diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query_range b/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query_range new file mode 100644 index 0000000000..6d7ed26083 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/metrics-proxy/api/v1/query_range @@ -0,0 +1,90 @@ +{ + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + ${ + // We need 15 minutes worth of data at 10 second resoution. Currently we + // always query for two series together so loop twice over this. + [0, 1].map(function(i){ + var timePeriodMins = 15; + var resolutionSecs = 10; + var numPoints = (timePeriodMins*60)/resolutionSecs; + var time = (Date.now()/1000) - (timePeriodMins*60); + + var q = location.search.query; + var proto = "tcp"; + var range = 1000; + var riseBias = 10; + var fallBias = 10; + var volatility = 0.2; + var label = ""; + + if (q.match('envoy_listener_http_downstream_rq_xx')) { + proto = "http" + // Switch random value ranges for total vs error rates + switch(i) { + case 0: + range = 1000; // up to 1000 rps for success + label = "Successes"; + break; + case 1: + range = 500; // up to 500 errors per second + fallBias = 1; // fall quicker than we rise + riseBias = 30; // start low generally + volatility = 1; + label = "Errors"; + break; + } + } else { + // Type tcp + switch(i) { + case 0: + range = 0.5 * 1e9; // up to 500 mbps recieved + label = "Inbound"; + break; + case 1: + range = 1e9; // up to 1 gbps + label = "Outbound" + break; + } + } + + var randExp = function(max, lambda) { + return (-Math.log(1-(1-Math.exp(-lambda))*Math.random())/lambda) * max; + } + + // Starting value + var value = randExp(range, riseBias); + if (value > range) { + value = range; + } + + var points = []; + for (var i = 0; i < numPoints; i++) { + points.push(`[${time}, "${value}"]`); + time = time + resolutionSecs; + var rising = (Math.random() > 0.5); + delta = volatility * randExp(range, rising ? riseBias : fallBias); + if (!rising) { + // Make it a negative change + delta = 0-delta; + } + value = value + delta + if (value > range) { + value = range; + } + if (value < 0) { + value = 0; + } + } + return ` + { + "metric": {"label": "${label}"}, + "values": [${points.join(",")}] + }`; + }) + } + ] + } +} \ No newline at end of file diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/node/.config b/ui/packages/consul-ui/mock-api/v1/internal/ui/node/.config new file mode 100644 index 0000000000..b3baa4013a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/node/.config @@ -0,0 +1,8 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/node/_ b/ui/packages/consul-ui/mock-api/v1/internal/ui/node/_ new file mode 100644 index 0000000000..d75f7a47e2 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/node/_ @@ -0,0 +1,105 @@ +${[1].map(() => { + + const services = range( + env( + 'CONSUL_SERVICE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_SERVICE_MAX', 10) + ) + parseInt(env('CONSUL_SERVICE_MIN', 1)) + ) + ) + ).map( + (item, i) => { + const service = `service-${i}`; + return { + "ID": i === 0 ? 'service-0-with-id' : fake.helpers.randomize([service, service + '-ID']), + "Service": service, + }; + } + ); + +return ` +{ + "ID":"${node = location.pathname.get(4)}", + "Node":"${node}", + "Address":"${ip = fake.internet.ip()}", + "TaggedAddresses":{"lan":"${ip}","wan":"${ip}"}, + "Meta":{ + "consul-network-segment":"", + "consul-dashboard-url": "${fake.internet.protocol()}://${fake.internet.domainName()}/?id={{Node}}" + }, + "Services":[ + ${ + services.map( + function(item, i) + { + const service = `service-${i}`; + return ` + { + "ID": "${item.ID}", + "Service":"${item.Service}", + "Tags":[ + ${ + range( + env( + 'CONSUL_TAG_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_TAG_MAX', 10) + ) + parseInt(env('CONSUL_TAG_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + return `"${fake.hacker.noun()}"`; + } + ) + } + ], +${ fake.random.number({min: 1, max: 10}) > 2 ? ` + "Meta": { + "external-source": "${fake.helpers.randomize(['consul', 'nomad', 'terraform', 'kubernetes', ''])}" + }, +` : `` } + "Address":"", + "Port": ${ i === 0 ? '65535' : fake.random.number({min: 0, max: 65534})}, + "EnableTagOverride":false, + "CreateIndex":11, + "ModifyIndex":11 + } + `; + } + ) + } + ], + "Checks":[ + ${ + range(env('CONSUL_CHECK_COUNT', 10)).map( + function(item, i) + { + const service = fake.random.number({min: 0, max: 10}) > 5 ? fake.helpers.randomize(services) : {ID: '', Service: ''}; + return ` + { + "Node":"${location.pathname.get(4)}", + "CheckID":"${fake.hacker.noun()}Health", + "Name":"${fake.hacker.noun()} Status", + "Type": "${fake.helpers.randomize(['script', 'http', 'tcp', 'ttl', 'docker', 'grpc', 'alias'])}", + "Status":"${fake.helpers.randomize(['passing', 'warning', 'critical'])}", + "Notes":"${fake.lorem.paragraph()}", + "Output":"${fake.internet.ipv6()} ${fake.internet.protocol()}://${fake.internet.userName()}:${fake.internet.password()}@${fake.internet.domainName()} ${fake.internet.userAgent()}", + "ServiceID":"${service.ID}", + "ServiceName":"${service.Service}", + "ServiceTags":null, + "Definition":{}, + "CreateIndex":12, + "ModifyIndex":230113 + } + `; + } + ) + } + ] +}` +})} diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/nodes b/ui/packages/consul-ui/mock-api/v1/internal/ui/nodes new file mode 100644 index 0000000000..a867b6db03 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/nodes @@ -0,0 +1,90 @@ +[ + ${ + range( + env( + 'CONSUL_NODE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_NODE_MAX', 10) + ) + parseInt(env('CONSUL_NODE_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + return ` + { + "ID":"${fake.random.uuid()}", + "Node":"node-${i}", + "Address":"${fake.internet.ip()}", + "TaggedAddresses":{ + "lan":"${fake.internet.ip()}", + "wan":"${fake.internet.ip()}" + }, + "Meta": { + "consul-network-segment":"" + }, + "Services":[ + ${ + range(fake.random.number(4) + 1).map( + function(item, i) { + const service = `service-${i}`; + return ` + { + "ID":"${service}", + "Service":"${service}", + "Tags":[ + ${ + range(env('CONSUL_TAG_COUNT', fake.random.number(10))).map( + function(item, i) + { + return `"${fake.hacker.noun()}"`; + } + ) + } + ], + "Address":"", + "Port":${fake.random.number({min: 0, max: 65535})}, + "EnableTagOverride":false, + "CreateIndex":5, + "ModifyIndex":5 + } + `; + } + ) + } + ], + "Checks":[ + ${ + range(env('CONSUL_CHECK_COUNT', fake.random.number(9) + 1)).map( + function(item, j) + { + const passing = i > 7 || j > fake.random.number(4); + return ` + { + "Node":"node-${i}", + "CheckID":"${fake.hacker.noun()}Health", + "Name":"${fake.hacker.noun()} Status", + "Type": "${fake.helpers.randomize(['script', 'http', 'tcp', 'ttl', 'docker', 'grpc', 'alias'])}", + "Status":"${ passing ? "passing" : fake.helpers.randomize(['warning', 'critical'])}", + "Notes":"${fake.lorem.paragraph()}", + "Output":"${fake.internet.ipv6()} ${fake.internet.protocol()}://${fake.internet.userName()}:${fake.internet.password()}@${fake.internet.domainName()} ${fake.internet.userAgent()}", + "ServiceID":"", + "ServiceName":"", + "ServiceTags":["Tag"], + "Definition":{}, + "CreateIndex":5, + "ModifyIndex":5 + } + `; + + } + ) + } + ] + } + `; + } + ) + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/oidc-auth-methods b/ui/packages/consul-ui/mock-api/v1/internal/ui/oidc-auth-methods new file mode 100644 index 0000000000..fe2df04cf9 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/oidc-auth-methods @@ -0,0 +1,23 @@ +[ + ${ + range( + env( + 'CONSUL_OIDC_PROVIDER_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_OIDC_PROVIDER_MAX', 10) + ) + parseInt(env('CONSUL_OIDC_PROVIDER_MIN', 1)) + ) + ) + ).map((item, i) => { + const name = `${fake.company.companyName()}`; +return ` + { + "Name": "${name.split(' ').join('-').toLowerCase()}", + "DisplayName": "${name}", + "Kind": "${fake.helpers.randomize(['no-icon', 'google', 'okta', 'auth0', 'microsoft'])}", + "Namespace": "default" + } +`}) + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/.config b/ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/.config new file mode 100644 index 0000000000..b79f23c963 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/.config @@ -0,0 +1,9 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} + diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/_ b/ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/_ new file mode 100644 index 0000000000..5ee71195d5 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/service-topology/_ @@ -0,0 +1,113 @@ +${ + [1].map(() => { + const dc = location.search.dc; + + // NOTE!!! The logic below to pick the upstream/downstream service + // names must exactly match the logic in internal/ui/metrics-proxy/.../query + // If you change this, change it there too! + + // Pick a number of down/upstreams to return based on the cookie variable. + // If you change anything about this variable or it's default, you'll need + // to change the topology endpoint to match. + var numUp = env("CONSUL_UPSTREAM_COUNT", 3); + var numDown = env("CONSUL_DOWNSTREAM_COUNT", 5); + + var genFakeServiceNames = function(num) { + // Seed faker by the number of results we want to make it deterministic + // here and in other correlated endpoints. + fake.seed(num); + var serviceNames = []; + for (var i = 0; i < num; i++) { + serviceNames.push(`service-${fake.random.number({min:0, max:99})}`) + } + return serviceNames + }; + + var upstreams = genFakeServiceNames(numUp); + var downstreams = genFakeServiceNames(numDown); + + const targetService = location.pathname.toString().replace('/v1/internal/ui/service-topology/', '') + + // little helper to get a deterministic number from the target service + // name string. NOTE: this should be the same as in metrics-proxy/.../query + // endpoint so metrics match what is requested. + var hashStr = function(s) { + for(var i = 0, h = 0xdeadbeef; i < s.length; i++) + h = Math.imul(h ^ s.charCodeAt(i), 2654435761); + return (h ^ h >>> 16) >>> 0; + }; + + var serviceProto = "tcp" + // Randomly pick the serviceProtocol which will affect which types of + // stats we return for downstream clusters. But we need it to be + // deterministic for a given service name so that all the downstream + // stats are consistently typed. + fake.seed(hashStr(targetService)) + if (fake.random.number(1) > 0.5) { + serviceProto = "http"; + } + + return ` +{ + "Protocol": "${serviceProto}", + "FilteredByACLs": ${fake.random.boolean()}, + "Upstreams": + [ + ${ + upstreams.map((item, i) => { + let hasPerms = fake.random.boolean(); + // if hasPerms is true allowed is always false as some restrictions apply + let allowed = hasPerms ? false : fake.random.boolean(); + return ` + { + "Name": "${item}", + "Datacenter": "${dc}", + ${i === 1 ? ` + "Namespace": "default", + ` : ` + "Namespace": "${fake.hacker.noun()}-ns-${i}", + `} + "ChecksPassing":${fake.random.number({min: 1, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksWarning":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksCritical":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "Intention": { + "Allowed": ${allowed}, + "HasPermissions": ${hasPerms}, + "ExternalSource": "${fake.helpers.randomize(['nomad', 'kubernetes', ''])}", + "HasExact": ${fake.random.boolean()} + } + } + `})} + ], + "Downstreams": + [ + ${ + downstreams.map((item, i) => { + let hasPerms = fake.random.boolean(); + // if hasPerms is true allowed is always false as some restrictions apply + let allowed = hasPerms ? false : fake.random.boolean(); + return ` + { + "Name": "${item}", + "Datacenter": "${dc}", + ${i === 1 ? ` + "Namespace": "default", + ` : ` + "Namespace": "${fake.hacker.noun()}-ns-${i}", + `} + "ChecksPassing":${fake.random.number({min: 1, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksWarning":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksCritical":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "Intention": { + "Allowed": ${allowed}, + "HasPermissions": ${hasPerms}, + "ExternalSource": "${fake.helpers.randomize(['nomad', 'kubernetes', ''])}", + "HasExact": ${fake.random.boolean()} + } + } + `})} + ] +}` + + }) +} \ No newline at end of file diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/services b/ui/packages/consul-ui/mock-api/v1/internal/ui/services new file mode 100644 index 0000000000..3fa598cd2c --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/services @@ -0,0 +1,109 @@ +${[0].map( + () => { + let prevKind; + let name; + const gateways = ['mesh-gateway', 'ingress-gateway', 'terminating-gateway']; + return ` +[ + ${ + range( + env( + 'CONSUL_SERVICE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_SERVICE_MAX', 10) + ) + parseInt(env('CONSUL_SERVICE_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + let kind; + switch(i) { + case 0: + kind = ''; + break; + case 1: + kind = 'connect-proxy'; + break; + case 2: + case 3: + case 4: + kind = gateways[i - 2]; + break; + default: + kind = prevKind === '' ? fake.helpers.randomize(['connect-proxy', '']) : fake.helpers.randomize(['', '', '', ''].concat(gateways)); + } + prevKind = kind; + if(kind === 'connect-proxy') { + name = `${name}-proxy`; + } else { + name = `service-${i}${ kind !== '' ? `-${kind.replace('connect-', '')}` : '' }`; + } + return ` + { + "Name":"${name}", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "Tags": [ + ${ + range( + env( + 'CONSUL_TAG_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_TAG_MAX', 10) + ) + parseInt(env('CONSUL_TAG_MIN', 1)) + ) + ) + ).map( + function(item, i) + { + return `"${fake.hacker.noun()}"`; + } + ) + } + ], + "ConnectedWithProxy":${fake.random.boolean()}, + "ConnectedWithGateway":${fake.random.boolean()}, + "GatewayConfig": { + "AssociatedServiceCount": ${fake.random.number({min: 1, max: 4000})} + }, +${kind !== '' ? ` + "Kind": "${kind}", +` : `` } + "InstanceCount": ${fake.helpers.randomize([fake.random.number({min: 1, max: 4000}), fake.random.number({min: 1, max: 90}), fake.random.number({min: 1, max: 10})])}, +${ fake.random.number({min: 1, max: 10}) > 2 ? ` + "ExternalSources": [ + ${ + range(fake.random.number({min: 1, max: 1})).map( + function(item, i) + { + return `"${fake.helpers.randomize(['consul', 'nomad', 'terraform', 'kubernetes', 'aws', ''])}"`; + } + ) + } + + ], +` : `` } + "Nodes":[ + ${ + range(env('CONSUL_NODE_COUNT', 100)).map( + function(item, i) + { + return `"node-${i}"`; + } + ) + } + ], + "ChecksPassing":${fake.random.number({min: 1, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksWarning":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})}, + "ChecksCritical":${fake.random.number({min: 0, max: env('CONSUL_CHECK_COUNT', fake.random.number(10))})} + } + `; + } + ) + } +] +`})} diff --git a/ui/packages/consul-ui/mock-api/v1/kv/.config b/ui/packages/consul-ui/mock-api/v1/kv/.config new file mode 100644 index 0000000000..88427f05cd --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/kv/.config @@ -0,0 +1,12 @@ +--- +"*": + PUT: + "_": + "*": + latency: ${ env('CONSUL_LATENCY', 0)} + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/kv/_ b/ui/packages/consul-ui/mock-api/v1/kv/_ new file mode 100644 index 0000000000..cdb7251e2f --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/kv/_ @@ -0,0 +1,50 @@ +${ + http.method == "GET" ? + typeof location.search.keys !== 'undefined' ? ` +[ + ${ + range( + env( + 'CONSUL_KV_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_KV_MAX', 10) + ) + parseInt(env('CONSUL_KV_MIN', 1)) + ) + ) + ).map( + function(item, i) { + return `"${ + range( + fake.random.number( + {max: env('CONSUL_KV_MAX_DEPTH', 0)} + ) + ).reduce( + function(prev, item, i, arr) { + return `${prev}/${fake.lorem.word()}-${i}` + }, + `${i}-${i === 0 ? 'key-value' : fake.lorem.word()}` + )}"`; + } + ) + } +] + ` : ` +[ + { + "LockIndex":0, + "Key":"${ + location.pathname.slice(3) + }", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "Flags":0, + "Value":"VHVlIEZlYiAgNiAxMzoxOToyMiBVVEMgMjAxOA==", + "CreateIndex":467034, + "ModifyIndex":467499, + "Session": "${fake.random.uuid()}" + } +] +` : "true" +} diff --git a/ui/packages/consul-ui/mock-api/v1/kv/index b/ui/packages/consul-ui/mock-api/v1/kv/index new file mode 100644 index 0000000000..30ea6b3ca5 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/kv/index @@ -0,0 +1,28 @@ +[ + ${ + range( + env( + 'CONSUL_KV_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_KV_MAX', 10) + ) + parseInt(env('CONSUL_KV_MIN', 1)) + ) + ) + ).map( + function(item, i) { + return `"${ + range( + fake.random.number( + {max: env('CONSUL_KV_MAX_DEPTH', 0)} + ) + ).reduce( + function(prev, item, i, arr) { + return `${prev}/${fake.lorem.word()}-${i}` + }, + `${i}-${i === 0 ? 'key-value' : fake.lorem.word()}` + )}"`; + } + ) + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/namespace/_ b/ui/packages/consul-ui/mock-api/v1/namespace/_ new file mode 100644 index 0000000000..63041f00ff --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/namespace/_ @@ -0,0 +1,24 @@ +{ + "Name": "${location.pathname.get(2)}", + "Description": "${fake.lorem.sentence()}", + "ACLs": { + "PolicyDefaults": [ +${range(env('CONSUL_POLICY_COUNT', 3)).map((i) => ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}-policy" + } +`)} + ], + "RoleDefaults": [ +${range(env('CONSUL_ROLE_COUNT', 3)).map((i) => ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}-role" + } +`)} + ] + }, + "CreateIndex": 12, + "ModifyIndex": 16 +} diff --git a/ui/packages/consul-ui/mock-api/v1/namespaces b/ui/packages/consul-ui/mock-api/v1/namespaces new file mode 100644 index 0000000000..3d4eef39d0 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/namespaces @@ -0,0 +1,64 @@ +[ + { + "Name": "default", + "Description": "The default namespace", + "ACLs": { + "PolicyDefaults": [ +${range(env('CONSUL_POLICY_COUNT', 3)).map((i) => ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}-policy" + } +`)} + ], + "RoleDefaults": [ +${range(env('CONSUL_ROLE_COUNT', 3)).map((i) => ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}-role" + } +`)} + ] + } + } +${range( + env( + 'CONSUL_NSPACE_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_NSPACE_MAX', 10) + ) + parseInt(env('CONSUL_NSPACE_MIN', 1)) + ) + ) - 1 +).map(i => ` +${i === 0 ? ` + , +` : ``} + { + "Name": "${fake.hacker.noun()}-ns-${i}", + "ACLs": { + "PolicyDefaults": [ +${range(env('CONSUL_POLICY_COUNT', 3)).map((i) => ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}-policy" + } +`)} + ], + "RoleDefaults": [ +${range(env('CONSUL_ROLE_COUNT', 3)).map((i) => ` + { + "ID": "${fake.random.uuid()}-${i}", + "Name": "${fake.hacker.noun()}-role" + } +`)} + ] + }, +${fake.random.boolean() ? ` + "Description": "${fake.lorem.sentence()}", +` : ``} + "CreateIndex": 12, + "ModifyIndex": 16 + } +`)} +] diff --git a/ui/packages/consul-ui/mock-api/v1/session/destroy/_ b/ui/packages/consul-ui/mock-api/v1/session/destroy/_ new file mode 100644 index 0000000000..27ba77ddaf --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/session/destroy/_ @@ -0,0 +1 @@ +true diff --git a/ui/packages/consul-ui/mock-api/v1/session/info/_ b/ui/packages/consul-ui/mock-api/v1/session/info/_ new file mode 100644 index 0000000000..e70261964c --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/session/info/_ @@ -0,0 +1,17 @@ +[ + { + "ID":"${location.pathname.get(3)}", + "Name":"${fake.hacker.noun()}", + "Namespace": "${ + typeof location.search.ns !== 'undefined' ? location.search.ns : + typeof http.body.Namespace !== 'undefined' ? http.body.Namespace : 'default' + }", + "Node":"node-1", + "Checks":["serfHealth"], + "LockDelay":15000000000, + "Behavior":"${fake.helpers.randomize(['release', 'delete'])}", + "TTL":"", + "CreateIndex":2782, + "ModifyIndex":2782 + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/session/node/.config b/ui/packages/consul-ui/mock-api/v1/session/node/.config new file mode 100644 index 0000000000..b3baa4013a --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/session/node/.config @@ -0,0 +1,8 @@ +--- +"*": + GET: + "*": + latency: ${ location.search.index ? env('CONSUL_LATENCY', 60000) : env('CONSUL_LATENCY', 0) } + headers: + response: + X-Consul-Index: ${ parseInt((location.search.index || 1)) + 1} diff --git a/ui/packages/consul-ui/mock-api/v1/session/node/_ b/ui/packages/consul-ui/mock-api/v1/session/node/_ new file mode 100644 index 0000000000..0346f4f085 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/session/node/_ @@ -0,0 +1,32 @@ +[ + ${ + range( + env( + 'CONSUL_SESSION_COUNT', + Math.floor( + ( + Math.random() * env('CONSUL_SESSION_MAX', 5) + ) + parseInt(env('CONSUL_SESSION_MIN', 1)) + ) + ) + ).map( + function(item, i) { + // TTL = "" | 10:84600 + return `{ + "ID":"${fake.random.uuid()}", + "Name":"${fake.hacker.noun()}", +${typeof location.search.ns !== 'undefined' ? ` + "Namespace": "${location.search.ns}", +` : ``} + "Node":"${location.pathname.get(3)}", + "Checks":["serfHealth"], + "LockDelay":15000000000, + "Behavior":"${fake.helpers.randomize(['release', 'delete'])}", + "TTL":"", + "CreateIndex":2782, + "ModifyIndex":2782 + }`; + } + ) + } +] diff --git a/ui/packages/consul-ui/mock-api/v1/status/leader b/ui/packages/consul-ui/mock-api/v1/status/leader new file mode 100644 index 0000000000..7424e37c91 --- /dev/null +++ b/ui/packages/consul-ui/mock-api/v1/status/leader @@ -0,0 +1 @@ +"211.245.86.75:8500" diff --git a/ui/packages/consul-ui/package.json b/ui/packages/consul-ui/package.json index 35f1687cbf..958e4c1040 100644 --- a/ui/packages/consul-ui/package.json +++ b/ui/packages/consul-ui/package.json @@ -58,7 +58,6 @@ "@ember/render-modifiers": "^1.0.2", "@glimmer/component": "^1.0.0", "@glimmer/tracking": "^1.0.0", - "@hashicorp/consul-api-double": "^6.1.4", "@hashicorp/ember-cli-api-double": "^3.1.0", "@storybook/addon-actions": "^6.0.27", "@storybook/addon-essentials": "^6.0.27",