Skip to content

Commit 7482ca5

Browse files
Add Kubernetes Monitor and Live Status API endpoints (#227)
* Add Kubernetes Monitor API endpoints * Update src/features/observability/liveStatus.ts Co-authored-by: cal <[email protected]> * Fix Manifest summary definition --------- Co-authored-by: cal <[email protected]>
1 parent f3128d9 commit 7482ca5

File tree

11 files changed

+387
-0
lines changed

11 files changed

+387
-0
lines changed

src/features/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ export * from "./extensionSettingsValues";
1919
export * from "./overwriteMode";
2020
export * from "./permission";
2121
export * from "./spaceScopedBasicRepository";
22+
export * from "./observability";
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type { MonitorErrorResource } from "./monitorErrorResource";
2+
3+
export interface GetContainerLogsRequest {
4+
SessionId: string;
5+
}
6+
7+
export interface GetContainerLogsResponse {
8+
Logs: ContainerLogLineResource[];
9+
IsSessionCompleted: boolean;
10+
Error: MonitorErrorResource | null;
11+
}
12+
13+
export interface ContainerLogLineResource {
14+
Timestamp: Date;
15+
LogLevel: string;
16+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export interface BeginContainerLogsSessionCommand {
2+
ProjectId: string;
3+
EnvironmentId: string;
4+
MachineId: string;
5+
PodName: string;
6+
ContainerName: string;
7+
DesiredOrKubernetesMonitoredResourceId: string;
8+
ShowPreviousContainer: boolean;
9+
}
10+
11+
export interface BeginContainerLogsSessionResponse {
12+
SessionId: string;
13+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export * from "./containerLogs";
2+
export * from "./liveStatus";
3+
export * from "./monitorErrorResource";
4+
export * from "./resource";
5+
export * from "./resourceEvents";
6+
export * from "./resourceEventsSession";
7+
export * from "./observabilityRepository";
8+
export * from "./kubernetesMonitorRepository";
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { resolveSpaceId, SpaceScopedBasicRepository, spaceScopedRoutePrefix, type Client, type ListArgs } from "../..";
2+
3+
export interface RegisterKubernetesMonitorResponse {
4+
Resource: KubernetesMonitor;
5+
}
6+
export interface GetKubernetesMonitorResponse {
7+
Resource: KubernetesMonitor;
8+
}
9+
10+
export interface KubernetesMonitor {
11+
Id: string;
12+
InstallationId: string;
13+
MachineId: string;
14+
SpaceId: string;
15+
}
16+
17+
export interface NewKubernetesMonitor {
18+
InstallationId: string;
19+
MachineId: string;
20+
}
21+
22+
export class KubernetesMonitorRepository {
23+
private client: Client;
24+
private spaceName: string;
25+
26+
constructor(client: Client, spaceName: string) {
27+
this.client = client;
28+
this.spaceName = spaceName;
29+
}
30+
31+
async registerKubernetesMonitor(installationId: string, machineId: string): Promise<RegisterKubernetesMonitorResponse> {
32+
return this.client.post<RegisterKubernetesMonitorResponse>(
33+
"~/api/spaces/{spaceId}/observability/kubernetes-monitors",
34+
{
35+
installationId: installationId,
36+
machineId: machineId,
37+
},
38+
{ spaceId: await resolveSpaceId(this.client, this.spaceName) }
39+
);
40+
}
41+
42+
async getById(id: string): Promise<GetKubernetesMonitorResponse> {
43+
return this.client.get<GetKubernetesMonitorResponse>("~/api/spaces/{spaceId}/observability/kubernetes-monitors/{id}", {
44+
spaceId: await resolveSpaceId(this.client, this.spaceName),
45+
id: id,
46+
});
47+
}
48+
49+
async deleteById(id: string): Promise<unknown> {
50+
return this.client.del("~/api/spaces/{spaceId}/observability/kubernetes-monitors/{id}", {
51+
spaceId: await resolveSpaceId(this.client, this.spaceName),
52+
id: id,
53+
});
54+
}
55+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
export interface GetLiveStatusRequest {
2+
ProjectId: string;
3+
EnvironmentId: string;
4+
TenantId?: string;
5+
SummaryOnly?: boolean;
6+
}
7+
8+
export interface GetLiveStatusResponse {
9+
MachineStatuses: KubernetesMachineLiveStatusResource[];
10+
Summary: LiveStatusSummaryResource;
11+
}
12+
13+
export interface KubernetesMachineLiveStatusResource {
14+
MachineId: string;
15+
Status: string;
16+
Resources: KubernetesLiveStatusResource[];
17+
}
18+
19+
export interface LiveStatusSummaryResource {
20+
Status: string;
21+
LastUpdated: Date;
22+
}
23+
24+
export interface KubernetesLiveStatusResource {
25+
Name: string;
26+
Namespace?: string;
27+
Kind: string;
28+
HealthStatus: string;
29+
SyncStatus?: string;
30+
MachineId: string;
31+
Children: KubernetesLiveStatusResource[];
32+
DesiredResourceId?: string;
33+
ResourceId?: string;
34+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface MonitorErrorResource {
2+
Code: string;
3+
Message: string;
4+
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import type {
2+
BeginResourceEventsSessionResponse,
3+
GetContainerLogsResponse,
4+
GetLiveStatusResponse,
5+
GetResourceEventsResponse,
6+
GetResourceManifestResponse,
7+
GetResourceResponse,
8+
} from ".";
9+
import { Client, resolveSpaceId } from "../..";
10+
import type { BeginContainerLogsSessionResponse } from "./containerLogsSession";
11+
12+
export class ObservabilityRepository {
13+
private client: Client;
14+
private spaceName: string;
15+
16+
constructor(client: Client, spaceName: string) {
17+
this.client = client;
18+
this.spaceName = spaceName;
19+
}
20+
21+
async getLiveStatus(projectId: string, environmentId: string, tenantId?: string, summaryOnly: boolean = false): Promise<GetLiveStatusResponse> {
22+
const queryParams = summaryOnly ? "?summaryOnly=true" : "";
23+
24+
if (tenantId === undefined) {
25+
return this.client.get<GetLiveStatusResponse>(
26+
`~/api/spaces/{spaceId}/projects/{projectId}/environments/{environmentId}/untenanted/livestatus${queryParams}`,
27+
{ spaceId: await resolveSpaceId(this.client, this.spaceName), projectId: projectId, environmentId: environmentId }
28+
);
29+
}
30+
31+
return this.client.get<GetLiveStatusResponse>(
32+
`~/api/spaces/{spaceId}/projects/{projectId}/environments/{environmentId}/tenants/{tenantId}/livestatus${queryParams}`,
33+
{
34+
projectId: projectId,
35+
environmentId: environmentId,
36+
tenantId: tenantId,
37+
}
38+
);
39+
}
40+
41+
async getResource(
42+
projectId: string,
43+
environmentId: string,
44+
tenantId: string | undefined,
45+
machineId: string,
46+
resourceId: string
47+
): Promise<GetResourceResponse> {
48+
if (tenantId === undefined) {
49+
return this.client.get<GetResourceResponse>(
50+
"~/api/spaces/{spaceId}/projects/{projectId}/environments/{environmentId}/untenanted/machines/{machineId}/resources/{desiredOrKubernetesMonitoredResourceId}",
51+
{
52+
spaceId: await resolveSpaceId(this.client, this.spaceName),
53+
projectId: projectId,
54+
environmentId: environmentId,
55+
machineId: machineId,
56+
desiredOrKubernetesMonitoredResourceId: resourceId,
57+
}
58+
);
59+
}
60+
61+
return this.client.get<GetResourceResponse>(
62+
"~/api/spaces/{spaceId}/projects/{projectId}/environments/{environmentId}/tenants/{tenantId}/machines/{machineId}/resources/{desiredOrKubernetesMonitoredResourceId}",
63+
{
64+
spaceId: await resolveSpaceId(this.client, this.spaceName),
65+
projectId: projectId,
66+
environmentId: environmentId,
67+
tenantId: tenantId,
68+
machineId: machineId,
69+
desiredOrKubernetesMonitoredResourceId: resourceId,
70+
}
71+
);
72+
}
73+
74+
async getResourceManifest(
75+
projectId: string,
76+
environmentId: string,
77+
tenantId: string | undefined,
78+
machineId: string,
79+
resourceId: string
80+
): Promise<GetResourceManifestResponse> {
81+
if (tenantId === undefined) {
82+
return this.client.get<GetResourceManifestResponse>(
83+
"~/api/spaces/{spaceId}/projects/{projectId}/environments/{environmentId}/untenanted/machines/{machineId}/resources/{desiredOrKubernetesMonitoredResourceId}/manifest",
84+
{
85+
spaceId: await resolveSpaceId(this.client, this.spaceName),
86+
projectId: projectId,
87+
environmentId: environmentId,
88+
machineId: machineId,
89+
desiredOrKubernetesMonitoredResourceId: resourceId,
90+
}
91+
);
92+
}
93+
94+
return this.client.get<GetResourceManifestResponse>(
95+
"~/api/spaces/{spaceId}/projects/{projectId}/environments/{environmentId}/tenants/{tenantId}/machines/{machineId}/resources/{desiredOrKubernetesMonitoredResourceId}/manifest",
96+
{
97+
spaceId: await resolveSpaceId(this.client, this.spaceName),
98+
projectId: projectId,
99+
environmentId: environmentId,
100+
tenantId: tenantId,
101+
machineId: machineId,
102+
desiredOrKubernetesMonitoredResourceId: resourceId,
103+
}
104+
);
105+
}
106+
107+
async beginContainerLogsSession(
108+
projectId: string,
109+
environmentId: string,
110+
tenantId: string | undefined,
111+
machineId: string,
112+
resourceId: string,
113+
podName: string,
114+
containerName: string,
115+
showPreviousContainer: boolean
116+
): Promise<BeginContainerLogsSessionResponse> {
117+
return this.client.post<BeginContainerLogsSessionResponse>(
118+
"~/api/spaces/{spaceId}/observability/logs/sessions",
119+
{
120+
projectId: projectId,
121+
environmentId: environmentId,
122+
tenantId: tenantId,
123+
machineId: machineId,
124+
podName: podName,
125+
containerName: containerName,
126+
showPreviousContainer: showPreviousContainer,
127+
desiredOrKubernetesMonitoredResourceId: resourceId,
128+
},
129+
{ spaceId: await resolveSpaceId(this.client, this.spaceName) }
130+
);
131+
}
132+
133+
async getContainerLogs(sessionId: string): Promise<GetContainerLogsResponse> {
134+
return this.client.get<GetContainerLogsResponse>("~/api/spaces/{spaceId}/observability/logs/sessions/{sessionId}", {
135+
spaceId: await resolveSpaceId(this.client, this.spaceName),
136+
sessionId,
137+
});
138+
}
139+
140+
async beginResourceEventsSession(
141+
projectId: string,
142+
environmentId: string,
143+
tenantId: string | undefined,
144+
machineId: string,
145+
resourceId: string
146+
): Promise<BeginResourceEventsSessionResponse> {
147+
return this.client.post<BeginResourceEventsSessionResponse>(
148+
"~/api/spaces/{spaceId}/observability/events/sessions",
149+
{
150+
projectId: projectId,
151+
environmentId: environmentId,
152+
tenantId: tenantId,
153+
machineId: machineId,
154+
desiredOrKubernetesMonitoredResourceId: resourceId,
155+
},
156+
{ spaceId: await resolveSpaceId(this.client, this.spaceName) }
157+
);
158+
}
159+
160+
async getResourceEvents(sessionId: string): Promise<GetResourceEventsResponse> {
161+
return this.client.get<GetResourceEventsResponse>("~/api/spaces/{spaceId}/observability/events/sessions/{sessionId}", {
162+
spaceId: await resolveSpaceId(this.client, this.spaceName),
163+
sessionId,
164+
});
165+
}
166+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
export interface GetResourceRequest {
2+
ProjectId: string;
3+
EnvironmentId: string;
4+
MachineId: string;
5+
DesiredOrKubernetesMonitoredResourceId: string;
6+
TenantId?: string;
7+
}
8+
9+
export interface GetResourceResponse {
10+
Resource: KubernetesLiveStatusDetailedResource;
11+
}
12+
13+
export interface GetResourceManifestRequest {
14+
ProjectId: string;
15+
EnvironmentId: string;
16+
MachineId: string;
17+
DesiredOrKubernetesMonitoredResourceId: string;
18+
TenantId?: string;
19+
}
20+
21+
export interface GetResourceManifestResponse {
22+
LiveManifest: string;
23+
DesiredManifest?: string;
24+
Diff?: LiveResourceDiff;
25+
}
26+
27+
export interface LiveResourceDiff {
28+
Left: string;
29+
Right: string;
30+
Diff: string;
31+
}
32+
33+
export interface KubernetesLiveStatusDetailedResource {
34+
Name: string;
35+
Namespace?: string;
36+
Kind: string;
37+
HealthStatus: string;
38+
SyncStatus?: string;
39+
MachineId: string;
40+
LastUpdated: Date;
41+
ManifestSummary?: ManifestSummaryResource;
42+
Children: KubernetesLiveStatusDetailedResource[];
43+
DesiredResourceId?: string;
44+
ResourceId?: string;
45+
}
46+
47+
export interface ManifestSummaryResource {
48+
Labels: { [key: string]: string };
49+
Annotations: { [key: string]: string };
50+
CreationTimestamp: Date;
51+
}
52+
53+
export interface PodManifestSummaryResource extends ManifestSummaryResource {
54+
Containers: string[];
55+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type { MonitorErrorResource } from "./monitorErrorResource";
2+
3+
export interface GetResourceEventsRequest {
4+
SessionId: string;
5+
}
6+
7+
export interface GetResourceEventsResponse {
8+
Events: KubernetesEventResource[];
9+
IsSessionCompleted: boolean;
10+
Error: MonitorErrorResource | null;
11+
}
12+
13+
export interface KubernetesEventResource {
14+
firstObservedTime: Date;
15+
lastObservedTime: Date;
16+
count: number;
17+
action: string;
18+
reason: string;
19+
note: string;
20+
reportingController: string;
21+
reportingInstance: string;
22+
type: string;
23+
manifest: string;
24+
}

0 commit comments

Comments
 (0)