Skip to content

Commit d555448

Browse files
committed
feat(refactor): dedicated autogenrated route configuration resolvers
1 parent f99220c commit d555448

File tree

14 files changed

+549
-240
lines changed

14 files changed

+549
-240
lines changed

node-packages/commons/src/api.ts

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,25 @@ export interface Project {
4444
storageCalc: number;
4545
subfolder: string;
4646
apiRoutes: any[];
47-
autogeneratedRoutes: boolean;
48-
autogeneratedRoutesPullrequests: boolean;
49-
autogeneratedRoutePrefixes: string[]
50-
autogeneratedPathRoutes: any[]
47+
autogeneratedRouteConfig: AutogeneratedRouteConfig;
48+
}
49+
50+
export interface AutogeneratedRouteConfig {
51+
updated: string;
52+
pathRoutes: AutogeneratedPathRoutes[];
5153
disableRequestVerification: boolean;
54+
enabled?: boolean;
55+
allowPullRequests?: boolean;
56+
insecure?: string;
57+
prefixes?: string[];
58+
tlsAcme?: boolean;
59+
// ingressClass?: string;
60+
}
61+
62+
export interface AutogeneratedPathRoutes {
63+
toService: string;
64+
fromService: string;
65+
path: string;
5266
}
5367

5468
export interface Kubernetes {
@@ -715,6 +729,23 @@ fragment on Route {
715729
}
716730
`);
717731

732+
const autogeneratedRouteConfigFragment = graphqlapi.createFragment(`
733+
fragment on AutogeneratedRouteConfig {
734+
updated
735+
enabled
736+
allowPullRequests
737+
prefixes
738+
tlsAcme
739+
insecure
740+
pathRoutes {
741+
toService
742+
fromService
743+
path
744+
}
745+
disableRequestVerification
746+
}
747+
`);
748+
718749
export async function getEnvironmentByName(
719750
name: string,
720751
projectId: number,
@@ -745,13 +776,9 @@ export async function getEnvironmentByName(
745776
apiRoutes(source: API){
746777
...${apiRouteFragment}
747778
}
748-
autogeneratedRoutes
749-
autogeneratedPathRoutes {
750-
toService
751-
fromService
752-
path
779+
autogeneratedRouteConfig {
780+
...${autogeneratedRouteConfigFragment}
753781
}
754-
disableRequestVerification
755782
}
756783
}
757784
`);
@@ -788,13 +815,9 @@ export async function getEnvironmentByIdWithVariables(
788815
apiRoutes(source: API){
789816
...${apiRouteFragment}
790817
}
791-
autogeneratedRoutes
792-
autogeneratedPathRoutes {
793-
toService
794-
fromService
795-
path
818+
autogeneratedRouteConfig {
819+
...${autogeneratedRouteConfigFragment}
796820
}
797-
disableRequestVerification
798821
}
799822
}
800823
`);
@@ -909,11 +932,7 @@ interface GetOpenshiftInfoForProjectResult {
909932
| 'storageCalc'
910933
| 'subfolder'
911934
| 'apiRoutes'
912-
| 'autogeneratedRoutes'
913-
| 'autogeneratedRoutesPullrequests'
914-
| 'autogeneratedRoutePrefixes'
915-
| 'autogeneratedPathRoutes'
916-
| 'disableRequestVerification'
935+
| 'autogeneratedRouteConfig'
917936
> & {
918937
openshift: Pick<Kubernetes, keyof DeployTargetMinimalFragment>;
919938
envVariables: Pick<EnvKeyValue, 'name' | 'scope' | 'value'>[];
@@ -956,15 +975,9 @@ export const getOpenShiftInfoForProject = (project: string): Promise<GetOpenshif
956975
apiRoutes{
957976
domain
958977
}
959-
autogeneratedRoutes
960-
autogeneratedRoutesPullrequests
961-
autogeneratedRoutePrefixes
962-
autogeneratedPathRoutes {
963-
toService
964-
fromService
965-
path
978+
autogeneratedRouteConfig {
979+
...${autogeneratedRouteConfigFragment}
966980
}
967-
disableRequestVerification
968981
}
969982
}
970983
`);

node-packages/commons/src/tasks.ts

Lines changed: 10 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
addDeployment,
2121
getOrganizationByIdWithEnvs,
2222
getOrganizationById,
23+
AutogeneratedRouteConfig,
2324
} from './api';
2425
import {
2526
deployTargetBranches,
@@ -53,30 +54,6 @@ interface DeathHandler {
5354
(msg: ConsumeMessage, error: Error): void;
5455
}
5556

56-
interface AutogeneratedRouteConfiguration {
57-
autogenerate?: {
58-
enabled?: boolean;
59-
allowPullRequests?: boolean;
60-
insecure?: string;
61-
prefixes?: string[];
62-
'tls-acme'?: boolean;
63-
ingressClass?: string;
64-
disableRequestVerification?: boolean;
65-
pathRoutes?: AutogeneratePathRoute[];
66-
};
67-
environment?: {
68-
autogenerateRoutes?: boolean
69-
autogeneratePathRoutes?: AutogeneratePathRoute[];
70-
disableRequestVerification?: boolean;
71-
}
72-
}
73-
74-
interface AutogeneratePathRoute {
75-
toService: string;
76-
path: string;
77-
fromService: string;
78-
}
79-
8057
export let sendToLagoonTasks = function(
8158
task: string,
8259
payload?: any
@@ -653,22 +630,16 @@ export const getEnvironmentsRouterPatternAndVariables = async function(
653630
'routerPattern' |
654631
'sharedBaasBucket' |
655632
'organization' |
656-
'autogeneratedRoutes' |
657-
'autogeneratedRoutesPullrequests' |
658-
'autogeneratedRoutePrefixes' |
659-
'autogeneratedPathRoutes' |
660-
'disableRequestVerification' |
661-
'apiRoutes'
633+
'apiRoutes' |
634+
'autogeneratedRouteConfig'
662635
> & {
663636
openshift: Pick<Kubernetes, 'routerPattern'>;
664637
envVariables: Pick<EnvKeyValue, 'name' | 'value' | 'scope'>[];
665638
},
666639
environment: {
667640
envVariables: Pick<EnvKeyValue, 'name' | 'value' | 'scope'>[]
668641
apiRoutes,
669-
autogeneratedRoutes
670-
autogeneratedPathRoutes
671-
disableRequestVerification
642+
autogeneratedRouteConfig,
672643
},
673644
deployTarget: Pick<Kubernetes, 'name' | 'routerPattern' | 'sharedBaasBucketName'>,
674645
bulkId: string | null,
@@ -718,37 +689,13 @@ export const getEnvironmentsRouterPatternAndVariables = async function(
718689
on the project or environment are set, this then gets setup in the required format
719690
and base64 encoded before being sent to the build, it is decoded there
720691
*/
721-
let agPayload: AutogeneratedRouteConfiguration = {
722-
autogenerate: {},
723-
environment: {},
724-
}
725-
if (project.autogeneratedRoutes !== null) {
726-
agPayload.autogenerate.enabled = project.autogeneratedRoutes
692+
let agPayload = {}
693+
if (project.autogeneratedRouteConfig !== null) {
694+
agPayload = project.autogeneratedRouteConfig
727695
}
728-
if (project.autogeneratedRoutesPullrequests !== null) {
729-
agPayload.autogenerate.allowPullRequests = project.autogeneratedRoutesPullrequests
696+
if (environment.autogeneratedRouteConfig !== null) {
697+
agPayload = environment.autogeneratedRouteConfig
730698
}
731-
if (project.autogeneratedRoutePrefixes) {
732-
agPayload.autogenerate.prefixes = project.autogeneratedRoutePrefixes
733-
}
734-
if (project.autogeneratedPathRoutes.length > 0) {
735-
agPayload.autogenerate.pathRoutes = project.autogeneratedPathRoutes
736-
}
737-
if (project.disableRequestVerification !== null) {
738-
agPayload.autogenerate.disableRequestVerification = project.disableRequestVerification
739-
}
740-
if (environment.autogeneratedRoutes !== null) {
741-
agPayload.environment.autogenerateRoutes = environment.autogeneratedRoutes
742-
}
743-
if (environment.autogeneratedPathRoutes.length > 0) {
744-
agPayload.environment.autogeneratePathRoutes = environment.autogeneratedPathRoutes
745-
}
746-
if (environment.disableRequestVerification !== null) {
747-
// environment doesn't have a direct override for request validation disable, but as this is applied to a build
748-
// we can just set the one that would apply normally to the project
749-
agPayload.autogenerate.disableRequestVerification = environment.disableRequestVerification
750-
}
751-
752699
// Single list of env vars that apply to an environment. Env vars from multiple
753700
// sources (organization, project, enviornment, build vars, etc) are
754701
// consolidated based on precedence.
@@ -835,7 +782,7 @@ export const getEnvironmentsRouterPatternAndVariables = async function(
835782
scope: InternalEnvVariableScope.INTERNAL_SYSTEM
836783
});
837784
}
838-
if (Object.keys(agPayload.autogenerate).length || Object.keys(agPayload.environment).length) {
785+
if (Object.keys(agPayload).length) {
839786
// if there is any autogenerated route configuration to send
840787
// set that here
841788
// @TODO: need to figure out a better way to handle the default autogenerate insecure handling

services/api/database/migrations/20250925000000_routes.js renamed to services/api/database/migrations/20251030000000_routes.js

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,24 @@ exports.up = async function(knex) {
4242
})
4343
.createTable('routes_annotations', function (table) {
4444
table.increments('id').notNullable().primary();
45-
table.integer('route_id'); //route id
45+
table.integer('route_id');
4646
table.string('key', 63).notNullable();
4747
table.text('value');
4848
table.unique(['key', 'route_id'], {indexName: 'alternate_domain_route'});
4949
})
50-
.alterTable('environment', (table) => {
51-
table.boolean('autogenerated_routes'); // default to null to effectively retain lagoon.yml as the source, would override lagoon.yml if defined
52-
table.text('autogenerated_path_routes') // would be JSON equivalent of what is in lagoon.yml, would override lagoon.yml if defined
53-
table.boolean('disable_request_verification'); // default to null to retain lagoon.yml as the source, would override lagoon.yml if defined
54-
})
55-
.alterTable('project', (table) => {
56-
table.boolean('autogenerated_routes'); // default to null to retain lagoon.yml as the source, would override lagoon.yml if defined
57-
table.boolean('autogenerated_routes_pullrequests'); // default to null to retain lagoon.yml as the source, would override lagoon.yml if defined
58-
table.text('autogenerated_route_prefixes') // would be comma separated list of prefixes representing what is in the .lagoon.yml, would override lagoon.yml if defined
59-
table.text('autogenerated_path_routes') // would be JSON equivalent of what is in lagoon.yml, would override lagoon.yml if defined
60-
table.boolean('disable_request_verification'); // default to null to retain lagoon.yml as the source, would override lagoon.yml if defined
50+
.createTable('routes_autogenerated_configuration', (table) => {
51+
table.increments('id').notNullable().primary();
52+
table.enu('type', ['project', 'environment']);
53+
table.integer('type_id');
54+
table.timestamp('updated').notNullable().defaultTo(knex.fn.now());
55+
table.boolean('enabled').notNullable().defaultTo(1); // default to true
56+
table.boolean('allow_pull_requests').notNullable().defaultTo(1); // default to true
57+
table.boolean('tls_acme').notNullable().defaultTo(1); // default to true
58+
table.enu('insecure', ['Allow', 'Redirect', 'None']).notNullable().defaultTo('Redirect');
59+
table.text('prefixes') // would be comma separated list of prefixes representing what is in the .lagoon.yml, would override lagoon.yml if defined
60+
table.text('path_routes') // would be JSON equivalent of what is in lagoon.yml, would override lagoon.yml if defined
61+
table.boolean('disable_request_verification').notNullable().defaultTo(0); // default to false
62+
table.unique(['type', 'type_id'], {indexName: 'autogenerated_route_config_type'});
6163
})
6264
.alterTable('organization', function (table) {
6365
table.boolean('feature_api_routes').defaultTo(0); // disable api routes feature by default, future release of lagoon will remove this when routes api becomes generally available
@@ -77,18 +79,7 @@ exports.down = async function(knex) {
7779
.dropTable('routes')
7880
.dropTable('routes_alternate_domain')
7981
.dropTable('routes_annotations')
80-
.alterTable('environment', (table) => {
81-
table.dropColumn('autogenerated_routes');
82-
table.dropColumn('autogenerated_path_routes');
83-
table.dropColumn('disable_request_verification');
84-
});
85-
.alterTable('project', (table) => {
86-
table.dropColumn('autogenerated_routes');
87-
table.dropColumn('autogenerated_routes_pullrequests');
88-
table.dropColumn('autogenerated_route_prefixes');
89-
table.dropColumn('autogenerated_path_routes');
90-
table.dropColumn('disable_request_verification');
91-
});
82+
.dropTable('routes_autogenerated_configuration')
9283
.alterTable('organization', (table) => {
9384
table.dropColumn('feature_api_routes');
9485
});

services/api/src/resolvers.js

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ const {
127127
getEnvironmentByServiceId,
128128
getServiceContainersByServiceId,
129129
deleteEnvironmentService,
130-
getAutogeneratedPathRoutes
131130
} = require('./resources/environment/resolvers');
132131

133132
const {
@@ -196,7 +195,6 @@ const {
196195
removeProjectMetadataByKey,
197196
getPrivateKey,
198197
getProjectDeployKey,
199-
getAutogeneratedRoutePrefixes,
200198
getFeatureApiRoutes
201199
} = require('./resources/project/resolvers');
202200

@@ -335,6 +333,14 @@ const {
335333
activeStandbyRouteMove,
336334
removeRouteFromEnvironment,
337335
updateRouteOnProject,
336+
getAutogeneratedRouteConfigByProjectId,
337+
getAutogeneratedRouteConfigByEnvironmentId,
338+
getAutogeneratedRoutePrefixes,
339+
getAutogeneratedPathRoutes,
340+
updateAutogeneratedRouteConfigOnProject,
341+
updateAutogeneratedRouteConfigOnEnvironment,
342+
removeAutogeneratedRouteConfigFromProject,
343+
removeAutogeneratedRouteConfigFromEnvironment,
338344
} = require('./resources/routes/resolvers');
339345

340346
async function getResolvers() {
@@ -523,10 +529,13 @@ async function getResolvers() {
523529
organizationDetails: getOrganizationByProject,
524530
retentionPolicies: getRetentionPoliciesByProjectId,
525531
apiRoutes: getRoutesByProjectId,
526-
autogeneratedRoutePrefixes: getAutogeneratedRoutePrefixes,
527-
autogeneratedPathRoutes: getAutogeneratedPathRoutes,
532+
autogeneratedRouteConfig: getAutogeneratedRouteConfigByProjectId,
528533
featureApiRoutes: getFeatureApiRoutes,
529534
},
535+
AutogeneratedRouteConfig: {
536+
prefixes: getAutogeneratedRoutePrefixes,
537+
pathRoutes: getAutogeneratedPathRoutes,
538+
},
530539
GroupInterface: {
531540
__resolveType(group) {
532541
return 'Group';
@@ -570,7 +579,7 @@ async function getResolvers() {
570579
kubernetes: getOpenshiftByEnvironmentId,
571580
pendingChanges: getPendingChangesByEnvironmentId,
572581
apiRoutes: getRoutesByEnvironmentId,
573-
autogeneratedPathRoutes: getAutogeneratedPathRoutes,
582+
autogeneratedRouteConfig: getAutogeneratedRouteConfigByEnvironmentId,
574583
},
575584
Route: {
576585
alternativeNames: getAlternateRoutesByRouteId,
@@ -880,6 +889,10 @@ async function getResolvers() {
880889
removeRouteAnnotation,
881890
addPathRoutesToRoute,
882891
removePathRouteFromRoute,
892+
updateAutogeneratedRouteConfigOnProject,
893+
updateAutogeneratedRouteConfigOnEnvironment,
894+
removeAutogeneratedRouteConfigFromProject,
895+
removeAutogeneratedRouteConfigFromEnvironment,
883896
},
884897
Subscription: {
885898
backupChanged: backupSubscriber,

services/api/src/resources/environment/helpers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ export const Helpers = (sqlClientPool: Pool) => {
100100
await routeHelpers(sqlClientPool).deleteLagoonYAMLRoutesForEnvironment(eid)
101101
// but leave the routes in the api attached to the project
102102
await routeHelpers(sqlClientPool).removeAllRoutesFromEnvironment(eid)
103+
// delete any autogenerated route configuration for this environment
104+
await routeHelpers(sqlClientPool).deleteAutogeneratedRouteConfigForEnvironment(eid);
103105

104106
// delete the environment backups rows
105107
// logger.debug(`deleting environment ${name}/id:${eid}/project:${pid} environment backups`)

0 commit comments

Comments
 (0)