Skip to content

Commit b72655c

Browse files
committed
feat: add support for managed workspaces and new module source types
Workspace enhancements: - Add workspace type selection (kubernetes/managed) - Add namespace prefix configuration for module deployments - Add auto-create namespace option - Add connection secret key field support - Update CreateWorkspaceModal with new form fields Module enhancements: - Add configMap source type support - Add existingHelmRelease source type with chart sources - Add support for repository, git, and configMap chart sources - Update TypeScript interfaces for all new source types All changes align with api-server v0.1.5 OpenAPI specification.
1 parent cdfaf07 commit b72655c

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

src/components/CreateWorkspaceModal.tsx

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const CreateWorkspaceModal: React.FC<CreateWorkspaceModalProps> = ({
1919
const [formData, setFormData] = useState<CreateWorkspaceRequest>({
2020
name: '',
2121
namespace: '',
22+
type: 'kubernetes',
2223
connection: {
2324
type: 'in-cluster',
2425
},
@@ -57,6 +58,7 @@ export const CreateWorkspaceModal: React.FC<CreateWorkspaceModalProps> = ({
5758
setFormData({
5859
name: '',
5960
namespace: '',
61+
type: 'kubernetes',
6062
connection: { type: 'in-cluster' },
6163
hibernated: false,
6264
});
@@ -81,6 +83,20 @@ export const CreateWorkspaceModal: React.FC<CreateWorkspaceModalProps> = ({
8183
requestData.namespace = formData.namespace.trim();
8284
}
8385

86+
// Include workspace type
87+
if (formData.type) {
88+
requestData.type = formData.type;
89+
}
90+
91+
// Include namespace prefix if provided
92+
if (formData.namespacePrefix && formData.namespacePrefix.trim()) {
93+
requestData.namespacePrefix = formData.namespacePrefix.trim();
94+
// Only include createNamespace if namespacePrefix is set
95+
if (formData.createNamespace !== undefined) {
96+
requestData.createNamespace = formData.createNamespace;
97+
}
98+
}
99+
84100
// Add 'from' field if creating from existing workspace
85101
if (createFromExisting && selectedExistingWorkspace) {
86102
const [namespace, name] = selectedExistingWorkspace.split('/');
@@ -96,6 +112,7 @@ export const CreateWorkspaceModal: React.FC<CreateWorkspaceModalProps> = ({
96112
setFormData({
97113
name: '',
98114
namespace: '',
115+
type: 'kubernetes',
99116
connection: { type: 'in-cluster' },
100117
hibernated: false,
101118
});
@@ -185,6 +202,23 @@ export const CreateWorkspaceModal: React.FC<CreateWorkspaceModalProps> = ({
185202
/>
186203
</div>
187204

205+
<div className="form-group">
206+
<label className="form-label">
207+
Workspace Type
208+
</label>
209+
<select
210+
className="form-select"
211+
value={formData.type}
212+
onChange={(e) => setFormData({
213+
...formData,
214+
type: e.target.value as 'kubernetes' | 'managed'
215+
})}
216+
>
217+
<option value="kubernetes">Kubernetes (Connect to existing cluster)</option>
218+
<option value="managed">Managed (vCluster - isolated virtual cluster)</option>
219+
</select>
220+
</div>
221+
188222
<div className="form-group">
189223
<label className="form-label">
190224
Connection Type {createFromExisting && selectedExistingWorkspace && '(inherited)'}
@@ -203,6 +237,31 @@ export const CreateWorkspaceModal: React.FC<CreateWorkspaceModalProps> = ({
203237
</select>
204238
</div>
205239

240+
<div className="form-group">
241+
<label className="form-label">Namespace Prefix</label>
242+
<input
243+
type="text"
244+
className="form-input"
245+
placeholder="e.g., dev- (optional)"
246+
value={formData.namespacePrefix || ''}
247+
onChange={(e) => setFormData({ ...formData, namespacePrefix: e.target.value || undefined })}
248+
/>
249+
<small style={{ color: '#666', fontSize: '12px', marginTop: '4px', display: 'block' }}>
250+
Prefix for all module deployment namespaces. Example: "dev-" creates "dev-default", "dev-database"
251+
</small>
252+
</div>
253+
254+
{formData.namespacePrefix && (
255+
<div className="form-group">
256+
<CustomCheckbox
257+
id="createNamespace"
258+
checked={formData.createNamespace || false}
259+
onChange={(checked) => setFormData({ ...formData, createNamespace: checked })}
260+
label="Auto-create prefixed namespaces"
261+
/>
262+
</div>
263+
)}
264+
206265
<div className="form-group">
207266
<CustomCheckbox
208267
id="hibernated"

src/types/module.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,42 @@ export interface ModuleWorkspaceReference {
2222
namespace: string;
2323
}
2424

25+
export interface ModuleSourceConfigMapRef {
26+
name: string;
27+
namespace: string;
28+
key?: string;
29+
}
30+
31+
export interface ModuleSourceChartRepository {
32+
url: string;
33+
chart: string;
34+
version?: string;
35+
}
36+
37+
export interface ModuleSourceChartGit {
38+
repo: string;
39+
path: string;
40+
revision: string;
41+
}
42+
43+
export interface ModuleSourceChartRef {
44+
configMap?: ModuleSourceConfigMapRef;
45+
repository?: ModuleSourceChartRepository;
46+
git?: ModuleSourceChartGit;
47+
}
48+
49+
export interface ModuleSourceExistingHelmReleaseRef {
50+
name: string;
51+
namespace: string;
52+
chartSource: ModuleSourceChartRef;
53+
values?: Record<string, any>;
54+
}
55+
2556
export interface ModuleSource {
2657
raw?: string;
2758
httpURL?: string;
59+
configMap?: ModuleSourceConfigMapRef;
60+
existingHelmRelease?: ModuleSourceExistingHelmReleaseRef;
2861
}
2962

3063
export interface CreateModuleRequest {

src/types/workspace.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ export interface Workspace {
1111
export interface CreateWorkspaceRequest {
1212
name: string;
1313
namespace?: string;
14+
type?: 'kubernetes' | 'managed';
1415
connection: {
1516
type: 'in-cluster' | 'kubeconfig';
1617
secret?: {
1718
name: string;
1819
namespace: string;
1920
};
21+
key?: string;
2022
};
2123
hibernated: boolean;
2224
from?: {
@@ -28,6 +30,8 @@ export interface CreateWorkspaceRequest {
2830
schedule: string;
2931
wakeSchedule?: string;
3032
};
33+
namespacePrefix?: string;
34+
createNamespace?: boolean;
3135
}
3236

3337
export interface DeleteWorkspaceRequest {
@@ -49,6 +53,8 @@ export interface UpdateWorkspaceRequest {
4953
schedule: string;
5054
wakeSchedule?: string;
5155
};
56+
namespacePrefix?: string;
57+
createNamespace?: boolean;
5258
}
5359

5460
export interface ApiResponse<T> {

0 commit comments

Comments
 (0)