mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-25 00:07:47 +01:00
Fix/enable standard environments (#1134)
This commit is contained in:
parent
5829ec7b3d
commit
eb8265922d
@ -72,7 +72,11 @@ Object {
|
|||||||
"db": true,
|
"db": true,
|
||||||
"ttlHours": 48,
|
"ttlHours": 48,
|
||||||
},
|
},
|
||||||
"ui": Object {},
|
"ui": Object {
|
||||||
|
"flags": Object {
|
||||||
|
"E": true,
|
||||||
|
},
|
||||||
|
},
|
||||||
"versionCheck": Object {
|
"versionCheck": Object {
|
||||||
"enable": true,
|
"enable": true,
|
||||||
"url": "https://version.unleash.run",
|
"url": "https://version.unleash.run",
|
||||||
|
@ -17,50 +17,3 @@ test('should create default config', async () => {
|
|||||||
|
|
||||||
expect(config).toMatchSnapshot();
|
expect(config).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should enabled metricsV2 via options', async () => {
|
|
||||||
const config = createConfig({
|
|
||||||
experimental: {
|
|
||||||
metricsV2: { enabled: true },
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('should enabled metricsV2 via env variable', async () => {
|
|
||||||
process.env.EXP_METRICS_V2 = 'true';
|
|
||||||
const config = createConfig({});
|
|
||||||
|
|
||||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
|
||||||
delete process.env.EXP_METRICS_V2;
|
|
||||||
});
|
|
||||||
|
|
||||||
test('should enabled metricsV2 when environments is enabled via env variable', async () => {
|
|
||||||
process.env.EXP_ENVIRONMENTS = 'true';
|
|
||||||
const config = createConfig({});
|
|
||||||
|
|
||||||
expect(config.experimental.environments.enabled).toBe(true);
|
|
||||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
|
||||||
delete process.env.EXP_ENVIRONMENTS;
|
|
||||||
});
|
|
||||||
|
|
||||||
test('should enabled metricsV2 when environments is enabled via options', async () => {
|
|
||||||
const config = createConfig({
|
|
||||||
experimental: {
|
|
||||||
environments: { enabled: true },
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(config.experimental.environments.enabled).toBe(true);
|
|
||||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('should set UI flag when environments is enabled', async () => {
|
|
||||||
process.env.EXP_ENVIRONMENTS = 'true';
|
|
||||||
const config = createConfig({});
|
|
||||||
|
|
||||||
expect(config.experimental.environments.enabled).toBe(true);
|
|
||||||
expect(config.ui.flags?.E).toBe(true);
|
|
||||||
delete process.env.EXP_ENVIRONMENTS;
|
|
||||||
});
|
|
||||||
|
@ -56,30 +56,16 @@ function mergeAll<T>(objects: Partial<T>[]): T {
|
|||||||
function loadExperimental(options: IUnleashOptions): any {
|
function loadExperimental(options: IUnleashOptions): any {
|
||||||
const experimental = options.experimental || {};
|
const experimental = options.experimental || {};
|
||||||
|
|
||||||
if (safeBoolean(process.env.EXP_ENVIRONMENTS, false)) {
|
|
||||||
experimental.environments = { enabled: true };
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
safeBoolean(process.env.EXP_METRICS_V2, false) ||
|
|
||||||
//@ts-ignore
|
|
||||||
experimental.environments?.enabled
|
|
||||||
) {
|
|
||||||
experimental.metricsV2 = { enabled: true };
|
|
||||||
}
|
|
||||||
|
|
||||||
return experimental;
|
return experimental;
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadUI(options: IUnleashOptions, experimental: any = {}): IUIConfig {
|
function loadUI(options: IUnleashOptions): IUIConfig {
|
||||||
const uiO = options.ui || {};
|
const uiO = options.ui || {};
|
||||||
const ui: IUIConfig = {};
|
const ui: IUIConfig = {};
|
||||||
|
|
||||||
if (experimental.environments?.enabled) {
|
ui.flags = {
|
||||||
ui.flags = {
|
E: true,
|
||||||
E: true,
|
};
|
||||||
};
|
|
||||||
}
|
|
||||||
return mergeAll([uiO, ui]);
|
return mergeAll([uiO, ui]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +240,7 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig {
|
|||||||
|
|
||||||
const experimental = loadExperimental(options);
|
const experimental = loadExperimental(options);
|
||||||
|
|
||||||
const ui = loadUI(options, experimental);
|
const ui = loadUI(options);
|
||||||
|
|
||||||
const email: IEmailOption = mergeAll([defaultEmail, options.email]);
|
const email: IEmailOption = mergeAll([defaultEmail, options.email]);
|
||||||
|
|
||||||
|
@ -18,8 +18,6 @@ export default class ClientMetricsController extends Controller {
|
|||||||
|
|
||||||
metricsV2: ClientMetricsServiceV2;
|
metricsV2: ClientMetricsServiceV2;
|
||||||
|
|
||||||
newServiceEnabled: boolean = false;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
{
|
{
|
||||||
clientMetricsService,
|
clientMetricsService,
|
||||||
@ -31,11 +29,7 @@ export default class ClientMetricsController extends Controller {
|
|||||||
config: IUnleashConfig,
|
config: IUnleashConfig,
|
||||||
) {
|
) {
|
||||||
super(config);
|
super(config);
|
||||||
const { experimental, getLogger } = config;
|
const { getLogger } = config;
|
||||||
if (experimental && experimental.metricsV2) {
|
|
||||||
//@ts-ignore
|
|
||||||
this.newServiceEnabled = experimental.metricsV2.enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.logger = getLogger('/api/client/metrics');
|
this.logger = getLogger('/api/client/metrics');
|
||||||
this.metrics = clientMetricsService;
|
this.metrics = clientMetricsService;
|
||||||
@ -60,12 +54,8 @@ export default class ClientMetricsController extends Controller {
|
|||||||
data.environment = this.resolveEnvironment(user, data);
|
data.environment = this.resolveEnvironment(user, data);
|
||||||
await this.metrics.registerClientMetrics(data, clientIp);
|
await this.metrics.registerClientMetrics(data, clientIp);
|
||||||
|
|
||||||
if (this.newServiceEnabled) {
|
await this.metricsV2.registerClientMetrics(data, clientIp);
|
||||||
await this.metricsV2.registerClientMetrics(data, clientIp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.status(202).end();
|
return res.status(202).end();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = ClientMetricsController;
|
|
||||||
|
@ -60,8 +60,6 @@ export default class ProjectService {
|
|||||||
|
|
||||||
private featureToggleService: FeatureToggleService;
|
private featureToggleService: FeatureToggleService;
|
||||||
|
|
||||||
private environmentsEnabled: boolean = false;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
{
|
{
|
||||||
projectStore,
|
projectStore,
|
||||||
@ -92,8 +90,6 @@ export default class ProjectService {
|
|||||||
this.featureTypeStore = featureTypeStore;
|
this.featureTypeStore = featureTypeStore;
|
||||||
this.featureToggleService = featureToggleService;
|
this.featureToggleService = featureToggleService;
|
||||||
this.logger = config.getLogger('services/project-service.js');
|
this.logger = config.getLogger('services/project-service.js');
|
||||||
this.environmentsEnabled =
|
|
||||||
config.experimental.environments?.enabled || false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async getProjects(query?: IProjectQuery): Promise<IProjectWithCount[]> {
|
async getProjects(query?: IProjectQuery): Promise<IProjectWithCount[]> {
|
||||||
@ -127,26 +123,19 @@ export default class ProjectService {
|
|||||||
|
|
||||||
await this.store.create(data);
|
await this.store.create(data);
|
||||||
|
|
||||||
if (this.environmentsEnabled) {
|
const enabledEnvironments = await this.environmentStore.getAll({
|
||||||
const enabledEnvironments = await this.environmentStore.getAll({
|
enabled: true,
|
||||||
enabled: true,
|
});
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: Only if enabled!
|
// TODO: Only if enabled!
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
enabledEnvironments.map(async (e) => {
|
enabledEnvironments.map(async (e) => {
|
||||||
await this.featureEnvironmentStore.connectProject(
|
await this.featureEnvironmentStore.connectProject(
|
||||||
e.name,
|
e.name,
|
||||||
data.id,
|
data.id,
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
await this.featureEnvironmentStore.connectProject(
|
|
||||||
'default',
|
|
||||||
data.id,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.accessService.createDefaultProjectRoles(user, data.id);
|
await this.accessService.createDefaultProjectRoles(user, data.id);
|
||||||
|
|
||||||
|
27
src/migrations/20211126112551-disable-default-environment.js
Normal file
27
src/migrations/20211126112551-disable-default-environment.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
exports.up = function (db, cb) {
|
||||||
|
db.runSql(
|
||||||
|
`
|
||||||
|
UPDATE environments
|
||||||
|
SET enabled = false
|
||||||
|
WHERE name = 'default'
|
||||||
|
AND NOT EXISTS (select * from features);
|
||||||
|
|
||||||
|
DELETE FROM project_environments
|
||||||
|
WHERE environment_name = 'default'
|
||||||
|
AND NOT EXISTS (select * from features);
|
||||||
|
|
||||||
|
INSERT INTO project_environments(project_id, environment_name)
|
||||||
|
SELECT 'default', 'development'
|
||||||
|
WHERE NOT EXISTS (select * from features);
|
||||||
|
|
||||||
|
INSERT INTO project_environments(project_id, environment_name)
|
||||||
|
SELECT 'default', 'production'
|
||||||
|
WHERE NOT EXISTS (select * from features);
|
||||||
|
`,
|
||||||
|
cb,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.down = function (db, cb) {
|
||||||
|
db.runSql('', cb);
|
||||||
|
};
|
@ -548,40 +548,3 @@ test('A newly created project only gets connected to enabled environments', asyn
|
|||||||
expect(connectedEnvs.some((e) => e === enabledEnv)).toBeTruthy();
|
expect(connectedEnvs.some((e) => e === enabledEnv)).toBeTruthy();
|
||||||
expect(connectedEnvs.some((e) => e === disabledEnv)).toBeFalsy();
|
expect(connectedEnvs.some((e) => e === disabledEnv)).toBeFalsy();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('A newly created project only gets connected to default environment if experimental flag is disabled', async () => {
|
|
||||||
const config = createTestConfig({
|
|
||||||
getLogger,
|
|
||||||
// @ts-ignore
|
|
||||||
experimental: { environments: { enabled: false } },
|
|
||||||
});
|
|
||||||
projectService = new ProjectService(
|
|
||||||
stores,
|
|
||||||
//@ts-ignore
|
|
||||||
config,
|
|
||||||
accessService,
|
|
||||||
featureToggleService,
|
|
||||||
);
|
|
||||||
const project = {
|
|
||||||
id: 'environment-test-default',
|
|
||||||
name: 'New environment project',
|
|
||||||
description: 'Blah',
|
|
||||||
};
|
|
||||||
const enabledEnv = 'connection_test';
|
|
||||||
await db.stores.environmentStore.create({
|
|
||||||
name: enabledEnv,
|
|
||||||
type: 'test',
|
|
||||||
});
|
|
||||||
const disabledEnv = 'do_not_connect';
|
|
||||||
await db.stores.environmentStore.create({
|
|
||||||
name: disabledEnv,
|
|
||||||
type: 'test',
|
|
||||||
enabled: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
await projectService.createProject(project, user);
|
|
||||||
const connectedEnvs =
|
|
||||||
await db.stores.projectStore.getEnvironmentsForProject(project.id);
|
|
||||||
expect(connectedEnvs).toHaveLength(1); // default, connection_test
|
|
||||||
expect(connectedEnvs[0]).toBe('default');
|
|
||||||
});
|
|
||||||
|
Loading…
Reference in New Issue
Block a user