Skip to content

Commit

Permalink
Merge pull request #671 from pennlabs/landing-api
Browse files Browse the repository at this point in the history
Landing-api
  • Loading branch information
esinx committed Sep 1, 2024
2 parents b099ee6 + 916d907 commit daeb020
Show file tree
Hide file tree
Showing 4 changed files with 207 additions and 168 deletions.
253 changes: 143 additions & 110 deletions k8s/main.ts
Original file line number Diff line number Diff line change
@@ -1,114 +1,147 @@
import { Construct } from 'constructs';
import { App } from 'cdk8s';
import { CronJob, DjangoApplication, PennLabsChart, ReactApplication, RedisApplication } from '@pennlabs/kittyhawk';

const cronTime = require('cron-time-generator');
import { Construct } from 'constructs'
import { App } from 'cdk8s'
import {
CronJob,
DjangoApplication,
PennLabsChart,
ReactApplication,
RedisApplication,
} from '@pennlabs/kittyhawk'

const cronTime = require('cron-time-generator')

export class MyChart extends PennLabsChart {
constructor(scope: Construct) {
super(scope);

const backendImage = 'pennlabs/penn-courses-backend';
const secret = 'penn-courses';
const ingressProps = {
annotations: {
['ingress.kubernetes.io/content-security-policy']: "frame-ancestors 'none';",
["ingress.kubernetes.io/protocol"]: "https",
["traefik.ingress.kubernetes.io/router.middlewares"]: "default-redirect-http@kubernetescrd"
}
}

new RedisApplication(this, 'redis', {
persistData: true,
});

new DjangoApplication(this, 'celery', {
deployment: {
image: backendImage,
secret,
cmd: ['celery', '-A', 'PennCourses', 'worker', '-Q', 'alerts,celery', '-linfo'],
},
djangoSettingsModule: 'PennCourses.settings.production',
});

new DjangoApplication(this, 'backend', {
deployment: {
image: backendImage,
secret,
replicas: 5,
},
djangoSettingsModule: 'PennCourses.settings.production',
ingressProps,
domains: [{ host: 'penncourseplan.com', paths: ["/api", "/admin", "/accounts", "/assets"] },
{ host: 'penncoursealert.com', paths: ["/api", "/admin", "/accounts", "/assets", "/webhook"] },
{ host: 'penncoursereview.com', paths: ["/api", "/admin", "/accounts", "/assets"] },
{ host: 'penndegreeplan.com', paths: ["/api", "/admin", "/accounts", "/assets"] }]
});

new DjangoApplication(this, 'backend-asgi', {
deployment: {
image: backendImage,
cmd: ['/usr/local/bin/asgi-run'],
secret,
replicas: 1,
},
djangoSettingsModule: 'PennCourses.settings.production',
ingressProps,
domains: [{ host: 'penncoursereview.com', paths: ["/api/ws"] }],
});

new ReactApplication(this, 'landing', {
deployment: {
image: 'pennlabs/pcx-landing',
},
domain: { host: 'penncourses.org', paths: ['/'] },
});

new ReactApplication(this, 'plan', {
deployment: {
image: 'pennlabs/pcp-frontend',
},
domain: { host: 'penncourseplan.com', paths: ['/'] },
});

new ReactApplication(this, 'alert', {
deployment: {
image: 'pennlabs/pca-frontend',
},
domain: { host: 'penncoursealert.com', paths: ['/'] },
});

new ReactApplication(this, 'review', {
deployment: {
image: 'pennlabs/pcr-frontend',
},
domain: { host: 'penncoursereview.com', paths: ['/'] },
});

new ReactApplication(this, 'degree', {
deployment: {
image: 'pennlabs/pdp-frontend',
},
domain: { host: 'penndegreeplan.com', paths: ['/'] },
});

new CronJob(this, 'load-courses', {
schedule: cronTime.everyDayAt(3),
image: backendImage,
secret,
cmd: ['python', 'manage.py', 'registrarimport'],
});

new CronJob(this, 'report-stats', {
schedule: cronTime.everyDayAt(20),
image: backendImage,
secret,
cmd: ['python', 'manage.py', 'alertstats', '1', '--slack'],
});

}
constructor(scope: Construct) {
super(scope)

const backendImage = 'pennlabs/penn-courses-backend'
const secret = 'penn-courses'
const ingressProps = {
annotations: {
['ingress.kubernetes.io/content-security-policy']:
"frame-ancestors 'none';",
['ingress.kubernetes.io/protocol']: 'https',
['traefik.ingress.kubernetes.io/router.middlewares']:
'default-redirect-http@kubernetescrd',
},
}

new RedisApplication(this, 'redis', {
persistData: true,
})

new DjangoApplication(this, 'celery', {
deployment: {
image: backendImage,
secret,
cmd: [
'celery',
'worker',
'-A',
'PennCourses',
'-Q',
'alerts,celery',
'-linfo',
],
},
djangoSettingsModule: 'PennCourses.settings.production',
})

new DjangoApplication(this, 'backend', {
deployment: {
image: backendImage,
secret,
replicas: 5,
},
djangoSettingsModule: 'PennCourses.settings.production',
ingressProps,
domains: [
{
host: 'penncourseplan.com',
paths: ['/api', '/admin', '/accounts', '/assets'],
},
{
host: 'penncoursealert.com',
paths: ['/api', '/admin', '/accounts', '/assets', '/webhook'],
},
{
host: 'penncoursereview.com',
paths: ['/api', '/admin', '/accounts', '/assets'],
},
{
host: 'penndegreeplan.com',
paths: ['/api', '/admin', '/accounts', '/assets'],
},
{
host: 'penncourses.org',
paths: ['/api', '/admin', '/accounts', '/assets'],
},
],
})

new DjangoApplication(this, 'backend-asgi', {
deployment: {
image: backendImage,
cmd: ['/usr/local/bin/asgi-run'],
secret,
replicas: 1,
},
djangoSettingsModule: 'PennCourses.settings.production',
ingressProps,
domains: [{ host: 'penncoursereview.com', paths: ['/api/ws'] }],
})

new ReactApplication(this, 'landing', {
deployment: {
image: 'pennlabs/pcx-landing',
},
domain: { host: 'penncourses.org', paths: ['/'] },
})

new ReactApplication(this, 'plan', {
deployment: {
image: 'pennlabs/pcp-frontend',
},
domain: { host: 'penncourseplan.com', paths: ['/'] },
})

new ReactApplication(this, 'alert', {
deployment: {
image: 'pennlabs/pca-frontend',
},
domain: { host: 'penncoursealert.com', paths: ['/'] },
})

new ReactApplication(this, 'review', {
deployment: {
image: 'pennlabs/pcr-frontend',
},
domain: { host: 'penncoursereview.com', paths: ['/'] },
})

new ReactApplication(this, 'degree', {
deployment: {
image: 'pennlabs/pdp-frontend',
},
domain: { host: 'penndegreeplan.com', paths: ['/'] },
})

new CronJob(this, 'load-courses', {
schedule: cronTime.everyDayAt(3),
image: backendImage,
secret,
cmd: ['python', 'manage.py', 'registrarimport'],
})

new CronJob(this, 'report-stats', {
schedule: cronTime.everyDayAt(20),
image: backendImage,
secret,
cmd: ['python', 'manage.py', 'alertstats', '1', '--slack'],
})
}
}

const app = new App();
new MyChart(app);
app.synth();
const app = new App()
new MyChart(app)
app.synth()
57 changes: 30 additions & 27 deletions k8s/package.json
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
{
"name": "k8s",
"version": "1.0.0",
"main": "main.js",
"types": "main.ts",
"license": "Apache-2.0",
"private": true,
"scripts": {
"import": "cdk8s import",
"synth": "cdk8s synth",
"compile": "tsc",
"watch": "tsc -w",
"build": "npm run compile && npm run synth",
"upgrade": "npm i cdk8s@latest cdk8s-cli@latest",
"upgrade:next": "npm i cdk8s@next cdk8s-cli@next"
},
"dependencies": {
"@pennlabs/kittyhawk": "^1.1.9",
"cdk8s": "^2.2.63",
"constructs": "^10.0.119"
},
"devDependencies": {
"@types/jest": "^26.0.24",
"@types/node": "^14.18.12",
"jest": "^26.6.3",
"ts-jest": "^26.5.6",
"typescript": "^4.6.3"
}
"name": "k8s",
"version": "1.0.0",
"main": "main.js",
"types": "main.ts",
"license": "Apache-2.0",
"private": true,
"prettier": "@esinx/prettier-config",
"scripts": {
"import": "cdk8s import",
"synth": "cdk8s synth",
"compile": "tsc",
"watch": "tsc -w",
"build": "npm run compile && npm run synth",
"upgrade": "npm i cdk8s@latest cdk8s-cli@latest",
"upgrade:next": "npm i cdk8s@next cdk8s-cli@next"
},
"dependencies": {
"@pennlabs/kittyhawk": "^1.1.9",
"cdk8s": "^2.2.63",
"constructs": "^10.0.119"
},
"devDependencies": {
"@esinx/prettier-config": "^1.0.0-3",
"@types/jest": "^26.0.24",
"@types/node": "^14.18.12",
"jest": "^26.6.3",
"prettier": "^3.3.3",
"ts-jest": "^26.5.6",
"typescript": "^4.6.3"
}
}
55 changes: 24 additions & 31 deletions k8s/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,33 +1,26 @@
{
"compilerOptions": {
"alwaysStrict": true,
"charset": "utf8",
"declaration": true,
"experimentalDecorators": true,
"inlineSourceMap": true,
"inlineSources": true,
"lib": [
"es2016"
],
"module": "CommonJS",
"noEmitOnError": true,
"noFallthroughCasesInSwitch": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"resolveJsonModule": true,
"strict": true,
"strictNullChecks": true,
"strictPropertyInitialization": true,
"stripInternal": true,
"target": "ES2017"
},
"include": [
"**/*.ts"
],
"exclude": [
"node_modules"
]
"compilerOptions": {
"alwaysStrict": true,
"declaration": true,
"experimentalDecorators": true,
"inlineSourceMap": true,
"inlineSources": true,
"lib": ["es2016"],
"module": "CommonJS",
"noEmitOnError": true,
"noFallthroughCasesInSwitch": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"resolveJsonModule": true,
"strict": true,
"strictNullChecks": true,
"strictPropertyInitialization": true,
"stripInternal": true,
"target": "ES2017"
},
"include": ["**/*.ts"],
"exclude": ["node_modules"]
}
10 changes: 10 additions & 0 deletions k8s/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,11 @@
exec-sh "^0.3.2"
minimist "^1.2.0"

"@esinx/prettier-config@^1.0.0-3":
version "1.0.0-3"
resolved "https://registry.yarnpkg.com/@esinx/prettier-config/-/prettier-config-1.0.0-3.tgz#985bf542b3a914cba6e57d4907d6520b1423ae4d"
integrity sha512-Y/cI8Qia6piZca5DCRclsrjRXjIYNZ6GUBySRgvLlN5WliAPe0oiDFmaJJDdSoXtPQYijkPBstIUJR5gylU+wg==

"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
Expand Down Expand Up @@ -3577,6 +3582,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=

prettier@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"
integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==

pretty-format@^26.0.0, pretty-format@^26.6.2:
version "26.6.2"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
Expand Down

0 comments on commit daeb020

Please sign in to comment.