@oneuptime/common 10.0.34 → 10.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +640 -0
- package/Server/API/IPWhitelistAPI.ts +31 -0
- package/Server/API/Index.ts +2 -0
- package/Server/EnvironmentConfig.ts +2 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1773761409952-MigrationName.ts +137 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1774000000000-MigrationName.ts +80 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Services/KubernetesClusterService.ts +109 -0
- package/Server/Services/UserService.ts +6 -0
- package/Server/Services/UserSessionService.ts +23 -0
- package/Server/Utils/Express.ts +0 -6
- package/Server/Utils/StartServer.ts +7 -3
- package/Server/Utils/VM/VMRunner.ts +3 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/Permission.ts +42 -0
- package/UI/Components/Icon/Icon.tsx +51 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +2 -0
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +25 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +85 -53
- package/UI/Components/Navbar/NavBarMenu.tsx +2 -2
- package/Utils/Traces/CriticalPath.ts +348 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +661 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -0
- package/build/dist/Server/API/IPWhitelistAPI.js +24 -0
- package/build/dist/Server/API/IPWhitelistAPI.js.map +1 -0
- package/build/dist/Server/API/Index.js +2 -0
- package/build/dist/Server/API/Index.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773761409952-MigrationName.js +52 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773761409952-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1774000000000-MigrationName.js +35 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1774000000000-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +117 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +5 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserSessionService.js +20 -0
- package/build/dist/Server/Services/UserSessionService.js.map +1 -1
- package/build/dist/Server/Utils/Express.js +1 -42
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +4 -3
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +3 -0
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Permission.js +36 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +27 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +4 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +50 -43
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenu.js +2 -2
- package/build/dist/Utils/Traces/CriticalPath.js +240 -0
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import AcmeCertificate from "./AcmeCertificate";
|
|
2
2
|
import AcmeChallenge from "./AcmeChallenge";
|
|
3
|
+
import KubernetesCluster from "./KubernetesCluster";
|
|
3
4
|
// API Keys
|
|
4
5
|
import ApiKey from "./ApiKey";
|
|
5
6
|
import ApiKeyPermission from "./ApiKeyPermission";
|
|
@@ -499,6 +500,8 @@ const AllModelTypes: Array<{
|
|
|
499
500
|
ProjectSCIM,
|
|
500
501
|
ProjectSCIMLog,
|
|
501
502
|
StatusPageSCIMLog,
|
|
503
|
+
|
|
504
|
+
KubernetesCluster,
|
|
502
505
|
];
|
|
503
506
|
|
|
504
507
|
const modelTypeMap: { [key: string]: { new (): BaseModel } } = {};
|
|
@@ -0,0 +1,640 @@
|
|
|
1
|
+
import Label from "./Label";
|
|
2
|
+
import Project from "./Project";
|
|
3
|
+
import User from "./User";
|
|
4
|
+
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
|
5
|
+
import Route from "../../Types/API/Route";
|
|
6
|
+
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
|
7
|
+
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
|
8
|
+
import AccessControlColumn from "../../Types/Database/AccessControlColumn";
|
|
9
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
10
|
+
import ColumnType from "../../Types/Database/ColumnType";
|
|
11
|
+
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
|
12
|
+
import EnableDocumentation from "../../Types/Database/EnableDocumentation";
|
|
13
|
+
import EnableWorkflow from "../../Types/Database/EnableWorkflow";
|
|
14
|
+
import SlugifyColumn from "../../Types/Database/SlugifyColumn";
|
|
15
|
+
import TableColumn from "../../Types/Database/TableColumn";
|
|
16
|
+
import TableColumnType from "../../Types/Database/TableColumnType";
|
|
17
|
+
import TableMetadata from "../../Types/Database/TableMetadata";
|
|
18
|
+
import TenantColumn from "../../Types/Database/TenantColumn";
|
|
19
|
+
import UniqueColumnBy from "../../Types/Database/UniqueColumnBy";
|
|
20
|
+
import IconProp from "../../Types/Icon/IconProp";
|
|
21
|
+
import ObjectID from "../../Types/ObjectID";
|
|
22
|
+
import Permission from "../../Types/Permission";
|
|
23
|
+
import {
|
|
24
|
+
Column,
|
|
25
|
+
Entity,
|
|
26
|
+
Index,
|
|
27
|
+
JoinColumn,
|
|
28
|
+
JoinTable,
|
|
29
|
+
ManyToMany,
|
|
30
|
+
ManyToOne,
|
|
31
|
+
} from "typeorm";
|
|
32
|
+
|
|
33
|
+
@AccessControlColumn("labels")
|
|
34
|
+
@EnableDocumentation()
|
|
35
|
+
@TenantColumn("projectId")
|
|
36
|
+
@TableAccessControl({
|
|
37
|
+
create: [
|
|
38
|
+
Permission.ProjectOwner,
|
|
39
|
+
Permission.ProjectAdmin,
|
|
40
|
+
Permission.ProjectMember,
|
|
41
|
+
Permission.CreateKubernetesCluster,
|
|
42
|
+
],
|
|
43
|
+
read: [
|
|
44
|
+
Permission.ProjectOwner,
|
|
45
|
+
Permission.ProjectAdmin,
|
|
46
|
+
Permission.ProjectMember,
|
|
47
|
+
Permission.ReadKubernetesCluster,
|
|
48
|
+
Permission.ReadAllProjectResources,
|
|
49
|
+
],
|
|
50
|
+
delete: [
|
|
51
|
+
Permission.ProjectOwner,
|
|
52
|
+
Permission.ProjectAdmin,
|
|
53
|
+
Permission.ProjectMember,
|
|
54
|
+
Permission.DeleteKubernetesCluster,
|
|
55
|
+
],
|
|
56
|
+
update: [
|
|
57
|
+
Permission.ProjectOwner,
|
|
58
|
+
Permission.ProjectAdmin,
|
|
59
|
+
Permission.ProjectMember,
|
|
60
|
+
Permission.EditKubernetesCluster,
|
|
61
|
+
],
|
|
62
|
+
})
|
|
63
|
+
@EnableWorkflow({
|
|
64
|
+
create: true,
|
|
65
|
+
delete: true,
|
|
66
|
+
update: true,
|
|
67
|
+
read: true,
|
|
68
|
+
})
|
|
69
|
+
@CrudApiEndpoint(new Route("/kubernetes-cluster"))
|
|
70
|
+
@SlugifyColumn("name", "slug")
|
|
71
|
+
@TableMetadata({
|
|
72
|
+
tableName: "KubernetesCluster",
|
|
73
|
+
singularName: "Kubernetes Cluster",
|
|
74
|
+
pluralName: "Kubernetes Clusters",
|
|
75
|
+
icon: IconProp.Cube,
|
|
76
|
+
tableDescription:
|
|
77
|
+
"Kubernetes Clusters that are being monitored in this project. Each cluster is auto-discovered when the OneUptime kubernetes-agent sends metrics, or can be manually registered.",
|
|
78
|
+
})
|
|
79
|
+
@Entity({
|
|
80
|
+
name: "KubernetesCluster",
|
|
81
|
+
})
|
|
82
|
+
export default class KubernetesCluster extends BaseModel {
|
|
83
|
+
@ColumnAccessControl({
|
|
84
|
+
create: [
|
|
85
|
+
Permission.ProjectOwner,
|
|
86
|
+
Permission.ProjectAdmin,
|
|
87
|
+
Permission.ProjectMember,
|
|
88
|
+
Permission.CreateKubernetesCluster,
|
|
89
|
+
],
|
|
90
|
+
read: [
|
|
91
|
+
Permission.ProjectOwner,
|
|
92
|
+
Permission.ProjectAdmin,
|
|
93
|
+
Permission.ProjectMember,
|
|
94
|
+
Permission.ReadKubernetesCluster,
|
|
95
|
+
Permission.ReadAllProjectResources,
|
|
96
|
+
],
|
|
97
|
+
update: [],
|
|
98
|
+
})
|
|
99
|
+
@TableColumn({
|
|
100
|
+
manyToOneRelationColumn: "projectId",
|
|
101
|
+
type: TableColumnType.Entity,
|
|
102
|
+
modelType: Project,
|
|
103
|
+
title: "Project",
|
|
104
|
+
description: "Relation to Project Resource in which this object belongs",
|
|
105
|
+
})
|
|
106
|
+
@ManyToOne(
|
|
107
|
+
() => {
|
|
108
|
+
return Project;
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
eager: false,
|
|
112
|
+
nullable: true,
|
|
113
|
+
onDelete: "CASCADE",
|
|
114
|
+
orphanedRowAction: "nullify",
|
|
115
|
+
},
|
|
116
|
+
)
|
|
117
|
+
@JoinColumn({ name: "projectId" })
|
|
118
|
+
public project?: Project = undefined;
|
|
119
|
+
|
|
120
|
+
@ColumnAccessControl({
|
|
121
|
+
create: [
|
|
122
|
+
Permission.ProjectOwner,
|
|
123
|
+
Permission.ProjectAdmin,
|
|
124
|
+
Permission.ProjectMember,
|
|
125
|
+
Permission.CreateKubernetesCluster,
|
|
126
|
+
],
|
|
127
|
+
read: [
|
|
128
|
+
Permission.ProjectOwner,
|
|
129
|
+
Permission.ProjectAdmin,
|
|
130
|
+
Permission.ProjectMember,
|
|
131
|
+
Permission.ReadKubernetesCluster,
|
|
132
|
+
Permission.ReadAllProjectResources,
|
|
133
|
+
],
|
|
134
|
+
update: [],
|
|
135
|
+
})
|
|
136
|
+
@Index()
|
|
137
|
+
@TableColumn({
|
|
138
|
+
type: TableColumnType.ObjectID,
|
|
139
|
+
required: true,
|
|
140
|
+
canReadOnRelationQuery: true,
|
|
141
|
+
title: "Project ID",
|
|
142
|
+
description: "ID of your OneUptime Project in which this object belongs",
|
|
143
|
+
})
|
|
144
|
+
@Column({
|
|
145
|
+
type: ColumnType.ObjectID,
|
|
146
|
+
nullable: false,
|
|
147
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
148
|
+
})
|
|
149
|
+
public projectId?: ObjectID = undefined;
|
|
150
|
+
|
|
151
|
+
@ColumnAccessControl({
|
|
152
|
+
create: [
|
|
153
|
+
Permission.ProjectOwner,
|
|
154
|
+
Permission.ProjectAdmin,
|
|
155
|
+
Permission.ProjectMember,
|
|
156
|
+
Permission.CreateKubernetesCluster,
|
|
157
|
+
],
|
|
158
|
+
read: [
|
|
159
|
+
Permission.ProjectOwner,
|
|
160
|
+
Permission.ProjectAdmin,
|
|
161
|
+
Permission.ProjectMember,
|
|
162
|
+
Permission.ReadKubernetesCluster,
|
|
163
|
+
Permission.ReadAllProjectResources,
|
|
164
|
+
],
|
|
165
|
+
update: [
|
|
166
|
+
Permission.ProjectOwner,
|
|
167
|
+
Permission.ProjectAdmin,
|
|
168
|
+
Permission.ProjectMember,
|
|
169
|
+
Permission.EditKubernetesCluster,
|
|
170
|
+
],
|
|
171
|
+
})
|
|
172
|
+
@TableColumn({
|
|
173
|
+
required: true,
|
|
174
|
+
type: TableColumnType.ShortText,
|
|
175
|
+
canReadOnRelationQuery: true,
|
|
176
|
+
title: "Name",
|
|
177
|
+
description: "Friendly name for this Kubernetes cluster",
|
|
178
|
+
example: "production-us-east",
|
|
179
|
+
})
|
|
180
|
+
@Column({
|
|
181
|
+
nullable: false,
|
|
182
|
+
type: ColumnType.ShortText,
|
|
183
|
+
length: ColumnLength.ShortText,
|
|
184
|
+
})
|
|
185
|
+
@UniqueColumnBy("projectId")
|
|
186
|
+
public name?: string = undefined;
|
|
187
|
+
|
|
188
|
+
@ColumnAccessControl({
|
|
189
|
+
create: [],
|
|
190
|
+
read: [
|
|
191
|
+
Permission.ProjectOwner,
|
|
192
|
+
Permission.ProjectAdmin,
|
|
193
|
+
Permission.ProjectMember,
|
|
194
|
+
Permission.ReadKubernetesCluster,
|
|
195
|
+
Permission.ReadAllProjectResources,
|
|
196
|
+
],
|
|
197
|
+
update: [],
|
|
198
|
+
})
|
|
199
|
+
@TableColumn({
|
|
200
|
+
required: true,
|
|
201
|
+
unique: true,
|
|
202
|
+
type: TableColumnType.Slug,
|
|
203
|
+
computed: true,
|
|
204
|
+
title: "Slug",
|
|
205
|
+
description: "Friendly globally unique name for your object",
|
|
206
|
+
})
|
|
207
|
+
@Column({
|
|
208
|
+
nullable: false,
|
|
209
|
+
type: ColumnType.Slug,
|
|
210
|
+
length: ColumnLength.Slug,
|
|
211
|
+
})
|
|
212
|
+
public slug?: string = undefined;
|
|
213
|
+
|
|
214
|
+
@ColumnAccessControl({
|
|
215
|
+
create: [
|
|
216
|
+
Permission.ProjectOwner,
|
|
217
|
+
Permission.ProjectAdmin,
|
|
218
|
+
Permission.ProjectMember,
|
|
219
|
+
Permission.CreateKubernetesCluster,
|
|
220
|
+
],
|
|
221
|
+
read: [
|
|
222
|
+
Permission.ProjectOwner,
|
|
223
|
+
Permission.ProjectAdmin,
|
|
224
|
+
Permission.ProjectMember,
|
|
225
|
+
Permission.ReadKubernetesCluster,
|
|
226
|
+
Permission.ReadAllProjectResources,
|
|
227
|
+
],
|
|
228
|
+
update: [
|
|
229
|
+
Permission.ProjectOwner,
|
|
230
|
+
Permission.ProjectAdmin,
|
|
231
|
+
Permission.ProjectMember,
|
|
232
|
+
Permission.EditKubernetesCluster,
|
|
233
|
+
],
|
|
234
|
+
})
|
|
235
|
+
@TableColumn({
|
|
236
|
+
required: false,
|
|
237
|
+
type: TableColumnType.LongText,
|
|
238
|
+
canReadOnRelationQuery: true,
|
|
239
|
+
title: "Description",
|
|
240
|
+
description: "Friendly description for this Kubernetes cluster",
|
|
241
|
+
example: "Production cluster running in US East region on EKS",
|
|
242
|
+
})
|
|
243
|
+
@Column({
|
|
244
|
+
nullable: true,
|
|
245
|
+
type: ColumnType.LongText,
|
|
246
|
+
length: ColumnLength.LongText,
|
|
247
|
+
})
|
|
248
|
+
public description?: string = undefined;
|
|
249
|
+
|
|
250
|
+
@ColumnAccessControl({
|
|
251
|
+
create: [
|
|
252
|
+
Permission.ProjectOwner,
|
|
253
|
+
Permission.ProjectAdmin,
|
|
254
|
+
Permission.ProjectMember,
|
|
255
|
+
Permission.CreateKubernetesCluster,
|
|
256
|
+
],
|
|
257
|
+
read: [
|
|
258
|
+
Permission.ProjectOwner,
|
|
259
|
+
Permission.ProjectAdmin,
|
|
260
|
+
Permission.ProjectMember,
|
|
261
|
+
Permission.ReadKubernetesCluster,
|
|
262
|
+
Permission.ReadAllProjectResources,
|
|
263
|
+
],
|
|
264
|
+
update: [
|
|
265
|
+
Permission.ProjectOwner,
|
|
266
|
+
Permission.ProjectAdmin,
|
|
267
|
+
Permission.ProjectMember,
|
|
268
|
+
Permission.EditKubernetesCluster,
|
|
269
|
+
],
|
|
270
|
+
})
|
|
271
|
+
@Index()
|
|
272
|
+
@TableColumn({
|
|
273
|
+
required: true,
|
|
274
|
+
type: TableColumnType.ShortText,
|
|
275
|
+
canReadOnRelationQuery: true,
|
|
276
|
+
title: "Cluster Identifier",
|
|
277
|
+
description:
|
|
278
|
+
"Unique identifier for this cluster, sourced from the k8s.cluster.name OTel resource attribute",
|
|
279
|
+
example: "production-us-east-1",
|
|
280
|
+
})
|
|
281
|
+
@Column({
|
|
282
|
+
nullable: false,
|
|
283
|
+
type: ColumnType.ShortText,
|
|
284
|
+
length: ColumnLength.ShortText,
|
|
285
|
+
})
|
|
286
|
+
@UniqueColumnBy("projectId")
|
|
287
|
+
public clusterIdentifier?: string = undefined;
|
|
288
|
+
|
|
289
|
+
@ColumnAccessControl({
|
|
290
|
+
create: [
|
|
291
|
+
Permission.ProjectOwner,
|
|
292
|
+
Permission.ProjectAdmin,
|
|
293
|
+
Permission.ProjectMember,
|
|
294
|
+
Permission.CreateKubernetesCluster,
|
|
295
|
+
],
|
|
296
|
+
read: [
|
|
297
|
+
Permission.ProjectOwner,
|
|
298
|
+
Permission.ProjectAdmin,
|
|
299
|
+
Permission.ProjectMember,
|
|
300
|
+
Permission.ReadKubernetesCluster,
|
|
301
|
+
Permission.ReadAllProjectResources,
|
|
302
|
+
],
|
|
303
|
+
update: [
|
|
304
|
+
Permission.ProjectOwner,
|
|
305
|
+
Permission.ProjectAdmin,
|
|
306
|
+
Permission.ProjectMember,
|
|
307
|
+
Permission.EditKubernetesCluster,
|
|
308
|
+
],
|
|
309
|
+
})
|
|
310
|
+
@TableColumn({
|
|
311
|
+
required: false,
|
|
312
|
+
type: TableColumnType.ShortText,
|
|
313
|
+
canReadOnRelationQuery: true,
|
|
314
|
+
title: "Provider",
|
|
315
|
+
description:
|
|
316
|
+
"Cloud provider or platform running this cluster (EKS, GKE, AKS, self-managed, unknown)",
|
|
317
|
+
example: "EKS",
|
|
318
|
+
})
|
|
319
|
+
@Column({
|
|
320
|
+
nullable: true,
|
|
321
|
+
type: ColumnType.ShortText,
|
|
322
|
+
length: ColumnLength.ShortText,
|
|
323
|
+
default: "unknown",
|
|
324
|
+
})
|
|
325
|
+
public provider?: string = undefined;
|
|
326
|
+
|
|
327
|
+
@ColumnAccessControl({
|
|
328
|
+
create: [],
|
|
329
|
+
read: [
|
|
330
|
+
Permission.ProjectOwner,
|
|
331
|
+
Permission.ProjectAdmin,
|
|
332
|
+
Permission.ProjectMember,
|
|
333
|
+
Permission.ReadKubernetesCluster,
|
|
334
|
+
Permission.ReadAllProjectResources,
|
|
335
|
+
],
|
|
336
|
+
update: [
|
|
337
|
+
Permission.ProjectOwner,
|
|
338
|
+
Permission.ProjectAdmin,
|
|
339
|
+
Permission.EditKubernetesCluster,
|
|
340
|
+
],
|
|
341
|
+
})
|
|
342
|
+
@TableColumn({
|
|
343
|
+
required: false,
|
|
344
|
+
type: TableColumnType.ShortText,
|
|
345
|
+
canReadOnRelationQuery: true,
|
|
346
|
+
title: "OTel Collector Status",
|
|
347
|
+
description:
|
|
348
|
+
"Connection status of the OTel Collector agent (connected or disconnected)",
|
|
349
|
+
example: "connected",
|
|
350
|
+
})
|
|
351
|
+
@Column({
|
|
352
|
+
nullable: true,
|
|
353
|
+
type: ColumnType.ShortText,
|
|
354
|
+
length: ColumnLength.ShortText,
|
|
355
|
+
default: "disconnected",
|
|
356
|
+
})
|
|
357
|
+
public otelCollectorStatus?: string = undefined;
|
|
358
|
+
|
|
359
|
+
@ColumnAccessControl({
|
|
360
|
+
create: [],
|
|
361
|
+
read: [
|
|
362
|
+
Permission.ProjectOwner,
|
|
363
|
+
Permission.ProjectAdmin,
|
|
364
|
+
Permission.ProjectMember,
|
|
365
|
+
Permission.ReadKubernetesCluster,
|
|
366
|
+
Permission.ReadAllProjectResources,
|
|
367
|
+
],
|
|
368
|
+
update: [
|
|
369
|
+
Permission.ProjectOwner,
|
|
370
|
+
Permission.ProjectAdmin,
|
|
371
|
+
Permission.EditKubernetesCluster,
|
|
372
|
+
],
|
|
373
|
+
})
|
|
374
|
+
@TableColumn({
|
|
375
|
+
required: false,
|
|
376
|
+
type: TableColumnType.Date,
|
|
377
|
+
canReadOnRelationQuery: true,
|
|
378
|
+
title: "Last Seen At",
|
|
379
|
+
description: "When metrics were last received from this cluster",
|
|
380
|
+
})
|
|
381
|
+
@Column({
|
|
382
|
+
nullable: true,
|
|
383
|
+
type: ColumnType.Date,
|
|
384
|
+
})
|
|
385
|
+
public lastSeenAt?: Date = undefined;
|
|
386
|
+
|
|
387
|
+
@ColumnAccessControl({
|
|
388
|
+
create: [],
|
|
389
|
+
read: [
|
|
390
|
+
Permission.ProjectOwner,
|
|
391
|
+
Permission.ProjectAdmin,
|
|
392
|
+
Permission.ProjectMember,
|
|
393
|
+
Permission.ReadKubernetesCluster,
|
|
394
|
+
Permission.ReadAllProjectResources,
|
|
395
|
+
],
|
|
396
|
+
update: [
|
|
397
|
+
Permission.ProjectOwner,
|
|
398
|
+
Permission.ProjectAdmin,
|
|
399
|
+
Permission.EditKubernetesCluster,
|
|
400
|
+
],
|
|
401
|
+
})
|
|
402
|
+
@TableColumn({
|
|
403
|
+
type: TableColumnType.Number,
|
|
404
|
+
title: "Node Count",
|
|
405
|
+
description: "Cached count of nodes in this cluster",
|
|
406
|
+
})
|
|
407
|
+
@Column({
|
|
408
|
+
type: ColumnType.Number,
|
|
409
|
+
nullable: true,
|
|
410
|
+
default: 0,
|
|
411
|
+
})
|
|
412
|
+
public nodeCount?: number = undefined;
|
|
413
|
+
|
|
414
|
+
@ColumnAccessControl({
|
|
415
|
+
create: [],
|
|
416
|
+
read: [
|
|
417
|
+
Permission.ProjectOwner,
|
|
418
|
+
Permission.ProjectAdmin,
|
|
419
|
+
Permission.ProjectMember,
|
|
420
|
+
Permission.ReadKubernetesCluster,
|
|
421
|
+
Permission.ReadAllProjectResources,
|
|
422
|
+
],
|
|
423
|
+
update: [
|
|
424
|
+
Permission.ProjectOwner,
|
|
425
|
+
Permission.ProjectAdmin,
|
|
426
|
+
Permission.EditKubernetesCluster,
|
|
427
|
+
],
|
|
428
|
+
})
|
|
429
|
+
@TableColumn({
|
|
430
|
+
type: TableColumnType.Number,
|
|
431
|
+
title: "Pod Count",
|
|
432
|
+
description: "Cached count of pods in this cluster",
|
|
433
|
+
})
|
|
434
|
+
@Column({
|
|
435
|
+
type: ColumnType.Number,
|
|
436
|
+
nullable: true,
|
|
437
|
+
default: 0,
|
|
438
|
+
})
|
|
439
|
+
public podCount?: number = undefined;
|
|
440
|
+
|
|
441
|
+
@ColumnAccessControl({
|
|
442
|
+
create: [],
|
|
443
|
+
read: [
|
|
444
|
+
Permission.ProjectOwner,
|
|
445
|
+
Permission.ProjectAdmin,
|
|
446
|
+
Permission.ProjectMember,
|
|
447
|
+
Permission.ReadKubernetesCluster,
|
|
448
|
+
Permission.ReadAllProjectResources,
|
|
449
|
+
],
|
|
450
|
+
update: [
|
|
451
|
+
Permission.ProjectOwner,
|
|
452
|
+
Permission.ProjectAdmin,
|
|
453
|
+
Permission.EditKubernetesCluster,
|
|
454
|
+
],
|
|
455
|
+
})
|
|
456
|
+
@TableColumn({
|
|
457
|
+
type: TableColumnType.Number,
|
|
458
|
+
title: "Namespace Count",
|
|
459
|
+
description: "Cached count of namespaces in this cluster",
|
|
460
|
+
})
|
|
461
|
+
@Column({
|
|
462
|
+
type: ColumnType.Number,
|
|
463
|
+
nullable: true,
|
|
464
|
+
default: 0,
|
|
465
|
+
})
|
|
466
|
+
public namespaceCount?: number = undefined;
|
|
467
|
+
|
|
468
|
+
@ColumnAccessControl({
|
|
469
|
+
create: [
|
|
470
|
+
Permission.ProjectOwner,
|
|
471
|
+
Permission.ProjectAdmin,
|
|
472
|
+
Permission.ProjectMember,
|
|
473
|
+
Permission.CreateKubernetesCluster,
|
|
474
|
+
],
|
|
475
|
+
read: [
|
|
476
|
+
Permission.ProjectOwner,
|
|
477
|
+
Permission.ProjectAdmin,
|
|
478
|
+
Permission.ProjectMember,
|
|
479
|
+
Permission.ReadKubernetesCluster,
|
|
480
|
+
Permission.ReadAllProjectResources,
|
|
481
|
+
],
|
|
482
|
+
update: [],
|
|
483
|
+
})
|
|
484
|
+
@TableColumn({
|
|
485
|
+
manyToOneRelationColumn: "createdByUserId",
|
|
486
|
+
type: TableColumnType.Entity,
|
|
487
|
+
modelType: User,
|
|
488
|
+
title: "Created by User",
|
|
489
|
+
description:
|
|
490
|
+
"Relation to User who created this object (if this object was created by a User)",
|
|
491
|
+
})
|
|
492
|
+
@ManyToOne(
|
|
493
|
+
() => {
|
|
494
|
+
return User;
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
eager: false,
|
|
498
|
+
nullable: true,
|
|
499
|
+
onDelete: "SET NULL",
|
|
500
|
+
orphanedRowAction: "nullify",
|
|
501
|
+
},
|
|
502
|
+
)
|
|
503
|
+
@JoinColumn({ name: "createdByUserId" })
|
|
504
|
+
public createdByUser?: User = undefined;
|
|
505
|
+
|
|
506
|
+
@ColumnAccessControl({
|
|
507
|
+
create: [
|
|
508
|
+
Permission.ProjectOwner,
|
|
509
|
+
Permission.ProjectAdmin,
|
|
510
|
+
Permission.ProjectMember,
|
|
511
|
+
Permission.CreateKubernetesCluster,
|
|
512
|
+
],
|
|
513
|
+
read: [
|
|
514
|
+
Permission.ProjectOwner,
|
|
515
|
+
Permission.ProjectAdmin,
|
|
516
|
+
Permission.ProjectMember,
|
|
517
|
+
Permission.ReadKubernetesCluster,
|
|
518
|
+
Permission.ReadAllProjectResources,
|
|
519
|
+
],
|
|
520
|
+
update: [],
|
|
521
|
+
})
|
|
522
|
+
@TableColumn({
|
|
523
|
+
type: TableColumnType.ObjectID,
|
|
524
|
+
title: "Created by User ID",
|
|
525
|
+
description:
|
|
526
|
+
"User ID who created this object (if this object was created by a User)",
|
|
527
|
+
})
|
|
528
|
+
@Column({
|
|
529
|
+
type: ColumnType.ObjectID,
|
|
530
|
+
nullable: true,
|
|
531
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
532
|
+
})
|
|
533
|
+
public createdByUserId?: ObjectID = undefined;
|
|
534
|
+
|
|
535
|
+
@ColumnAccessControl({
|
|
536
|
+
create: [],
|
|
537
|
+
read: [
|
|
538
|
+
Permission.ProjectOwner,
|
|
539
|
+
Permission.ProjectAdmin,
|
|
540
|
+
Permission.ProjectMember,
|
|
541
|
+
Permission.ReadKubernetesCluster,
|
|
542
|
+
Permission.ReadAllProjectResources,
|
|
543
|
+
],
|
|
544
|
+
update: [],
|
|
545
|
+
})
|
|
546
|
+
@TableColumn({
|
|
547
|
+
manyToOneRelationColumn: "deletedByUserId",
|
|
548
|
+
type: TableColumnType.Entity,
|
|
549
|
+
title: "Deleted by User",
|
|
550
|
+
modelType: User,
|
|
551
|
+
description:
|
|
552
|
+
"Relation to User who deleted this object (if this object was deleted by a User)",
|
|
553
|
+
})
|
|
554
|
+
@ManyToOne(
|
|
555
|
+
() => {
|
|
556
|
+
return User;
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
cascade: false,
|
|
560
|
+
eager: false,
|
|
561
|
+
nullable: true,
|
|
562
|
+
onDelete: "SET NULL",
|
|
563
|
+
orphanedRowAction: "nullify",
|
|
564
|
+
},
|
|
565
|
+
)
|
|
566
|
+
@JoinColumn({ name: "deletedByUserId" })
|
|
567
|
+
public deletedByUser?: User = undefined;
|
|
568
|
+
|
|
569
|
+
@ColumnAccessControl({
|
|
570
|
+
create: [],
|
|
571
|
+
read: [
|
|
572
|
+
Permission.ProjectOwner,
|
|
573
|
+
Permission.ProjectAdmin,
|
|
574
|
+
Permission.ProjectMember,
|
|
575
|
+
Permission.ReadKubernetesCluster,
|
|
576
|
+
Permission.ReadAllProjectResources,
|
|
577
|
+
],
|
|
578
|
+
update: [],
|
|
579
|
+
})
|
|
580
|
+
@TableColumn({
|
|
581
|
+
type: TableColumnType.ObjectID,
|
|
582
|
+
title: "Deleted by User ID",
|
|
583
|
+
description:
|
|
584
|
+
"User ID who deleted this object (if this object was deleted by a User)",
|
|
585
|
+
})
|
|
586
|
+
@Column({
|
|
587
|
+
type: ColumnType.ObjectID,
|
|
588
|
+
nullable: true,
|
|
589
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
590
|
+
})
|
|
591
|
+
public deletedByUserId?: ObjectID = undefined;
|
|
592
|
+
|
|
593
|
+
@ColumnAccessControl({
|
|
594
|
+
create: [
|
|
595
|
+
Permission.ProjectOwner,
|
|
596
|
+
Permission.ProjectAdmin,
|
|
597
|
+
Permission.ProjectMember,
|
|
598
|
+
Permission.CreateKubernetesCluster,
|
|
599
|
+
],
|
|
600
|
+
read: [
|
|
601
|
+
Permission.ProjectOwner,
|
|
602
|
+
Permission.ProjectAdmin,
|
|
603
|
+
Permission.ProjectMember,
|
|
604
|
+
Permission.ReadKubernetesCluster,
|
|
605
|
+
Permission.ReadAllProjectResources,
|
|
606
|
+
],
|
|
607
|
+
update: [
|
|
608
|
+
Permission.ProjectOwner,
|
|
609
|
+
Permission.ProjectAdmin,
|
|
610
|
+
Permission.ProjectMember,
|
|
611
|
+
Permission.EditKubernetesCluster,
|
|
612
|
+
],
|
|
613
|
+
})
|
|
614
|
+
@TableColumn({
|
|
615
|
+
required: false,
|
|
616
|
+
type: TableColumnType.EntityArray,
|
|
617
|
+
modelType: Label,
|
|
618
|
+
title: "Labels",
|
|
619
|
+
description:
|
|
620
|
+
"Relation to Labels Array where this object is categorized in.",
|
|
621
|
+
})
|
|
622
|
+
@ManyToMany(
|
|
623
|
+
() => {
|
|
624
|
+
return Label;
|
|
625
|
+
},
|
|
626
|
+
{ eager: false },
|
|
627
|
+
)
|
|
628
|
+
@JoinTable({
|
|
629
|
+
name: "KubernetesClusterLabel",
|
|
630
|
+
inverseJoinColumn: {
|
|
631
|
+
name: "labelId",
|
|
632
|
+
referencedColumnName: "_id",
|
|
633
|
+
},
|
|
634
|
+
joinColumn: {
|
|
635
|
+
name: "kubernetesClusterId",
|
|
636
|
+
referencedColumnName: "_id",
|
|
637
|
+
},
|
|
638
|
+
})
|
|
639
|
+
public labels?: Array<Label> = undefined;
|
|
640
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Express, {
|
|
2
|
+
ExpressRequest,
|
|
3
|
+
ExpressResponse,
|
|
4
|
+
ExpressRouter,
|
|
5
|
+
} from "../Utils/Express";
|
|
6
|
+
import Response from "../Utils/Response";
|
|
7
|
+
import { IpWhitelist } from "../EnvironmentConfig";
|
|
8
|
+
|
|
9
|
+
export default class IPWhitelistAPI {
|
|
10
|
+
public static init(): ExpressRouter {
|
|
11
|
+
const router: ExpressRouter = Express.getRouter();
|
|
12
|
+
|
|
13
|
+
router.get("/ip-whitelist", (req: ExpressRequest, res: ExpressResponse) => {
|
|
14
|
+
const ipList: Array<string> = IpWhitelist
|
|
15
|
+
? IpWhitelist.split(",")
|
|
16
|
+
.map((ip: string) => {
|
|
17
|
+
return ip.trim();
|
|
18
|
+
})
|
|
19
|
+
.filter((ip: string) => {
|
|
20
|
+
return ip.length > 0;
|
|
21
|
+
})
|
|
22
|
+
: [];
|
|
23
|
+
|
|
24
|
+
Response.sendJsonObjectResponse(req, res, {
|
|
25
|
+
ipWhitelist: ipList,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return router;
|
|
30
|
+
}
|
|
31
|
+
}
|
package/Server/API/Index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Express, { ExpressApplication } from "../Utils/Express";
|
|
2
2
|
import StatusAPI, { StatusAPIOptions } from "./StatusAPI";
|
|
3
|
+
import IPWhitelistAPI from "./IPWhitelistAPI";
|
|
3
4
|
import version from "./VersionAPI";
|
|
4
5
|
|
|
5
6
|
const app: ExpressApplication = Express.getExpressApp();
|
|
@@ -14,6 +15,7 @@ type InitFunction = (data: InitOptions) => void;
|
|
|
14
15
|
const init: InitFunction = (data: InitOptions): void => {
|
|
15
16
|
app.use([`/${data.appName}`, "/"], version);
|
|
16
17
|
app.use([`/${data.appName}`, "/"], StatusAPI.init(data.statusOptions));
|
|
18
|
+
app.use([`/${data.appName}`, "/"], IPWhitelistAPI.init());
|
|
17
19
|
};
|
|
18
20
|
|
|
19
21
|
export default init;
|
|
@@ -397,6 +397,8 @@ export const DocsClientUrl: URL = new URL(
|
|
|
397
397
|
new Route(DocsRoute.toString()),
|
|
398
398
|
);
|
|
399
399
|
|
|
400
|
+
export const IpWhitelist: string = process.env["IP_WHITELIST"] || "";
|
|
401
|
+
|
|
400
402
|
export const DisableTelemetry: boolean =
|
|
401
403
|
process.env["DISABLE_TELEMETRY"] === "true";
|
|
402
404
|
|