ui: Add support for prefixing the API path (#14342)
This commit is contained in:
parent
9d555e538e
commit
9780aba54a
|
@ -203,12 +203,13 @@ export default class HttpService extends Service {
|
||||||
// also see adapters/kv content-types in requestForCreate/UpdateRecord
|
// also see adapters/kv content-types in requestForCreate/UpdateRecord
|
||||||
// also see https://github.com/hashicorp/consul/issues/3804
|
// also see https://github.com/hashicorp/consul/issues/3804
|
||||||
params.headers[CONTENT_TYPE] = 'application/json; charset=utf-8';
|
params.headers[CONTENT_TYPE] = 'application/json; charset=utf-8';
|
||||||
|
params.url = `${this.env.var('CONSUL_API_PREFIX')}${params.url}`;
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchWithToken(path, params) {
|
fetchWithToken(path, params) {
|
||||||
return this.settings.findBySlug('token').then(token => {
|
return this.settings.findBySlug('token').then(token => {
|
||||||
return fetch(`${path}`, {
|
return fetch(`${this.env.var('CONSUL_API_PREFIX')}${path}`, {
|
||||||
...params,
|
...params,
|
||||||
credentials: 'include',
|
credentials: 'include',
|
||||||
headers: {
|
headers: {
|
||||||
|
|
|
@ -132,6 +132,12 @@ export default function(config = {}, win = window, doc = document) {
|
||||||
return operatorConfig.LocalDatacenter;
|
return operatorConfig.LocalDatacenter;
|
||||||
case 'CONSUL_DATACENTER_PRIMARY':
|
case 'CONSUL_DATACENTER_PRIMARY':
|
||||||
return operatorConfig.PrimaryDatacenter;
|
return operatorConfig.PrimaryDatacenter;
|
||||||
|
case 'CONSUL_API_PREFIX':
|
||||||
|
// we want API prefix to look like an env var for if we ever change
|
||||||
|
// operator config to be an API request, we need this variable before we
|
||||||
|
// make and API request so this specific variable should never be be
|
||||||
|
// retrived via an API request
|
||||||
|
return operatorConfig.APIPrefix;
|
||||||
case 'CONSUL_UI_CONFIG':
|
case 'CONSUL_UI_CONFIG':
|
||||||
dashboards = {
|
dashboards = {
|
||||||
service: undefined,
|
service: undefined,
|
||||||
|
@ -246,6 +252,7 @@ export default function(config = {}, win = window, doc = document) {
|
||||||
case 'CONSUL_UI_CONFIG':
|
case 'CONSUL_UI_CONFIG':
|
||||||
case 'CONSUL_DATACENTER_LOCAL':
|
case 'CONSUL_DATACENTER_LOCAL':
|
||||||
case 'CONSUL_DATACENTER_PRIMARY':
|
case 'CONSUL_DATACENTER_PRIMARY':
|
||||||
|
case 'CONSUL_API_PREFIX':
|
||||||
case 'CONSUL_ACLS_ENABLED':
|
case 'CONSUL_ACLS_ENABLED':
|
||||||
case 'CONSUL_NSPACES_ENABLED':
|
case 'CONSUL_NSPACES_ENABLED':
|
||||||
case 'CONSUL_PEERINGS_ENABLED':
|
case 'CONSUL_PEERINGS_ENABLED':
|
||||||
|
|
|
@ -86,6 +86,7 @@ module.exports = function(environment, $ = process.env) {
|
||||||
PartitionsEnabled: false,
|
PartitionsEnabled: false,
|
||||||
LocalDatacenter: env('CONSUL_DATACENTER_LOCAL', 'dc1'),
|
LocalDatacenter: env('CONSUL_DATACENTER_LOCAL', 'dc1'),
|
||||||
PrimaryDatacenter: env('CONSUL_DATACENTER_PRIMARY', 'dc1'),
|
PrimaryDatacenter: env('CONSUL_DATACENTER_PRIMARY', 'dc1'),
|
||||||
|
APIPrefix: env('CONSUL_API_PREFIX', '')
|
||||||
},
|
},
|
||||||
|
|
||||||
// Static variables used in multiple places throughout the UI
|
// Static variables used in multiple places throughout the UI
|
||||||
|
@ -111,6 +112,7 @@ module.exports = function(environment, $ = process.env) {
|
||||||
PartitionsEnabled: env('CONSUL_PARTITIONS_ENABLED', false),
|
PartitionsEnabled: env('CONSUL_PARTITIONS_ENABLED', false),
|
||||||
LocalDatacenter: env('CONSUL_DATACENTER_LOCAL', 'dc1'),
|
LocalDatacenter: env('CONSUL_DATACENTER_LOCAL', 'dc1'),
|
||||||
PrimaryDatacenter: env('CONSUL_DATACENTER_PRIMARY', 'dc1'),
|
PrimaryDatacenter: env('CONSUL_DATACENTER_PRIMARY', 'dc1'),
|
||||||
|
APIPrefix: env('CONSUL_API_PREFIX', '')
|
||||||
},
|
},
|
||||||
|
|
||||||
'@hashicorp/ember-cli-api-double': {
|
'@hashicorp/ember-cli-api-double': {
|
||||||
|
@ -118,6 +120,7 @@ module.exports = function(environment, $ = process.env) {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
endpoints: {
|
endpoints: {
|
||||||
'/v1': '/mock-api/v1',
|
'/v1': '/mock-api/v1',
|
||||||
|
'/prefixed-api': '/mock-api/prefixed-api',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
APP: Object.assign({}, ENV.APP, {
|
APP: Object.assign({}, ENV.APP, {
|
||||||
|
@ -162,6 +165,7 @@ module.exports = function(environment, $ = process.env) {
|
||||||
PartitionsEnabled: env('CONSUL_PARTITIONS_ENABLED', true),
|
PartitionsEnabled: env('CONSUL_PARTITIONS_ENABLED', true),
|
||||||
LocalDatacenter: env('CONSUL_DATACENTER_LOCAL', 'dc1'),
|
LocalDatacenter: env('CONSUL_DATACENTER_LOCAL', 'dc1'),
|
||||||
PrimaryDatacenter: env('CONSUL_DATACENTER_PRIMARY', 'dc1'),
|
PrimaryDatacenter: env('CONSUL_DATACENTER_PRIMARY', 'dc1'),
|
||||||
|
APIPrefix: env('CONSUL_API_PREFIX', '')
|
||||||
},
|
},
|
||||||
|
|
||||||
'@hashicorp/ember-cli-api-double': {
|
'@hashicorp/ember-cli-api-double': {
|
||||||
|
@ -176,7 +180,9 @@ module.exports = function(environment, $ = process.env) {
|
||||||
ENV = Object.assign({}, ENV, {
|
ENV = Object.assign({}, ENV, {
|
||||||
// in production operatorConfig is populated at consul runtime from
|
// in production operatorConfig is populated at consul runtime from
|
||||||
// operator configuration
|
// operator configuration
|
||||||
operatorConfig: {},
|
operatorConfig: {
|
||||||
|
APIPrefix: ''
|
||||||
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
"*":
|
||||||
|
GET:
|
||||||
|
"*":
|
||||||
|
headers:
|
||||||
|
response:
|
||||||
|
X-Consul-Default-Acl-Policy: ${env('CONSUL_ACL_POLICY', fake.helpers.randomize(['allow', 'deny']))}
|
|
@ -0,0 +1,13 @@
|
||||||
|
[
|
||||||
|
${
|
||||||
|
range(env('CONSUL_DATACENTER_COUNT', 10)).map((item, i) => {
|
||||||
|
if(i === 0) {
|
||||||
|
return `"${env('CONSUL_DATACENTER_LOCAL', 'dc1')}"`;
|
||||||
|
}
|
||||||
|
return `
|
||||||
|
"${fake.address.countryCode().toLowerCase()}_${ i % 2 ? "west" : "east"}-${i}"
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,14 @@
|
||||||
|
[
|
||||||
|
${
|
||||||
|
http.body.map(item => {
|
||||||
|
return JSON.stringify(
|
||||||
|
Object.assign(
|
||||||
|
item,
|
||||||
|
{
|
||||||
|
Allow: !!JSON.parse(env(`CONSUL_RESOURCE_${item.Resource.toUpperCase()}_${item.Access.toUpperCase()}`, 'true'))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,22 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"Name": "consul",
|
||||||
|
"Datacenter": "dc1",
|
||||||
|
"Tags": null,
|
||||||
|
"Nodes": [
|
||||||
|
"node"
|
||||||
|
],
|
||||||
|
"ExternalSources": null,
|
||||||
|
"InstanceCount": 1,
|
||||||
|
"ChecksPassing": 1,
|
||||||
|
"ChecksWarning": 0,
|
||||||
|
"ChecksCritical": 0,
|
||||||
|
"GatewayConfig": {},
|
||||||
|
"TransparentProxy": false,
|
||||||
|
"ConnectNative": false,
|
||||||
|
"Partition": "default",
|
||||||
|
"Namespace": "default",
|
||||||
|
"ConnectedWithProxy": false,
|
||||||
|
"ConnectedWithGateway": false
|
||||||
|
}
|
||||||
|
]
|
|
@ -11,7 +11,9 @@ test(
|
||||||
{
|
{
|
||||||
environment: 'production',
|
environment: 'production',
|
||||||
CONSUL_BINARY_TYPE: 'oss',
|
CONSUL_BINARY_TYPE: 'oss',
|
||||||
operatorConfig: {}
|
operatorConfig: {
|
||||||
|
APIPrefix: '',
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
environment: 'test',
|
environment: 'test',
|
||||||
|
@ -24,6 +26,7 @@ test(
|
||||||
PeeringEnabled: true,
|
PeeringEnabled: true,
|
||||||
LocalDatacenter: 'dc1',
|
LocalDatacenter: 'dc1',
|
||||||
PrimaryDatacenter: 'dc1',
|
PrimaryDatacenter: 'dc1',
|
||||||
|
APIPrefix: '',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -40,6 +43,7 @@ test(
|
||||||
PeeringEnabled: true,
|
PeeringEnabled: true,
|
||||||
LocalDatacenter: 'dc1',
|
LocalDatacenter: 'dc1',
|
||||||
PrimaryDatacenter: 'dc1',
|
PrimaryDatacenter: 'dc1',
|
||||||
|
APIPrefix: '',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -56,6 +60,7 @@ test(
|
||||||
PeeringEnabled: true,
|
PeeringEnabled: true,
|
||||||
LocalDatacenter: 'dc1',
|
LocalDatacenter: 'dc1',
|
||||||
PrimaryDatacenter: 'dc1',
|
PrimaryDatacenter: 'dc1',
|
||||||
|
APIPrefix: '',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -69,6 +74,7 @@ test(
|
||||||
PeeringEnabled: true,
|
PeeringEnabled: true,
|
||||||
LocalDatacenter: 'dc1',
|
LocalDatacenter: 'dc1',
|
||||||
PrimaryDatacenter: 'dc1',
|
PrimaryDatacenter: 'dc1',
|
||||||
|
APIPrefix: '',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
].forEach(
|
].forEach(
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
Feature: api-prefix
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "dc1"
|
||||||
|
And an API prefix of "/prefixed-api"
|
||||||
|
When I visit the index page
|
||||||
|
Then a GET request was made to "/prefixed-api/v1/catalog/datacenters"
|
|
@ -0,0 +1,11 @@
|
||||||
|
import steps from './steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert)
|
||||||
|
.then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -87,6 +87,7 @@ export default function({
|
||||||
api.server.respondWith(url.split('?')[0], data);
|
api.server.respondWith(url.split('?')[0], data);
|
||||||
};
|
};
|
||||||
const setCookie = function(key, value) {
|
const setCookie = function(key, value) {
|
||||||
|
document.cookie = `${key}=${value}`;
|
||||||
api.server.setCookie(key, value);
|
api.server.setCookie(key, value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -17,5 +17,8 @@ export default function(scenario, respondWith, set, oidc) {
|
||||||
})
|
})
|
||||||
.given('a network latency of $number', function(number) {
|
.given('a network latency of $number', function(number) {
|
||||||
set('CONSUL_LATENCY', number);
|
set('CONSUL_LATENCY', number);
|
||||||
|
})
|
||||||
|
.given('an API prefix of "$prefix"', function(prefix) {
|
||||||
|
set('CONSUL_API_PREFIX', prefix);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue