Skip to content
This repository was archived by the owner on Jun 11, 2025. It is now read-only.

Commit 9bd7ab6

Browse files
committed
Merge branch 'feat/workspace-and-workmachine' of github.com:kloudlite/operator into feat/workspace-and-workmachine
2 parents 42dc061 + 5b8a435 commit 9bd7ab6

12 files changed

Lines changed: 311 additions & 129 deletions

File tree

apis/crds/v1/workmachine_types.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ type AWSMachineConfig struct {
1111
Region string `json:"region" graphql:"noinput"`
1212
AvailabilityZone string `json:"availabilityZone"`
1313

14-
AMI string `json:"ami"`
15-
InstanceType string `json:"instanceType"`
16-
PublicSubnetID string `json:"publicSubnetID"`
14+
AMI string `json:"ami"`
15+
InstanceType string `json:"instanceType"`
16+
// PublicSubnetID string `json:"publicSubnetID"`
1717

1818
//+kubebuilder:default=50
1919
RootVolumeSize int `json:"rootVolumeSize" graphql:"noinput"`
@@ -48,7 +48,7 @@ type WorkMachineSpec struct {
4848
State WorkMachineState `json:"state"`
4949
SSHPublicKeys []string `json:"sshPublicKeys"`
5050

51-
JobParams WorkMachineJobParams `json:"jobParams"`
51+
JobParams WorkMachineJobParams `json:"jobParams,omitempty"`
5252

5353
TargetNamespace string `json:"targetNamespace,omitempty"`
5454

apis/crds/v1/workspace_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type WorkspaceSpec struct {
3131
// +kubebuilder:default=IfNotPresent
3232
ImagePullPolicy string `json:"imagePullPolicy"`
3333

34-
Router RouterSpec `json:"router"`
34+
// Router RouterSpec `json:"router"`
3535
}
3636

3737
// +kubebuilder:object:root=true

apis/crds/v1/zz_generated.deepcopy.go

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/agent-operator/main.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import (
55

66
// helmCharts "github.com/kloudlite/operator/operators/helm-charts/controller"
77
lifecycle "github.com/kloudlite/operator/operators/lifecycle/controller"
8-
workspace "github.com/kloudlite/operator/operators/workspace/register"
98

109
// routers "github.com/kloudlite/operator/operators/routers/controller"
1110

12-
workmachine "github.com/kloudlite/operator/operators/workmachine/register"
11+
workspace "github.com/kloudlite/operator/operators/workspace/register"
1312
)
1413

1514
func main() {
@@ -40,7 +39,7 @@ func main() {
4039

4140
// serviceIntercept.RegisterInto(mgr)
4241
workspace.RegisterInto(mgr)
43-
workmachine.RegisterInto(mgr)
42+
// workmachine.RegisterInto(mgr)
4443

4544
// pluginMongoDB.RegisterInto(mgr)
4645
// pluginHelmChart.RegisterInto(mgr)

config/crd/bases/crds.kloudlite.io_workmachines.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,6 @@ spec:
7070
type: string
7171
instanceType:
7272
type: string
73-
publicSubnetID:
74-
type: string
7573
region:
7674
type: string
7775
rootVolumeSize:
@@ -86,7 +84,6 @@ spec:
8684
- externalVolumeSize
8785
- externalVolumeType
8886
- instanceType
89-
- publicSubnetID
9087
- region
9188
- rootVolumeSize
9289
- rootVolumeType

operators/workmachine/internal/controllers/workmachine/controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ type ClusterParams struct {
149149

150150
AwsVPCName string `json:"aws_vpc_name"`
151151
AwsVPCId string `json:"aws_vpc_id"`
152+
SubnetId string `json:"subnet_id"`
152153

153154
AwsNLBDNSHost string `json:"aws_nlb_dns_host"`
154155

@@ -206,7 +207,7 @@ func (r *Reconciler) parseSpecIntoTFValues(ctx context.Context, obj *crdsv1.Work
206207
"root_volume_size": obj.Spec.AWSMachineConfig.RootVolumeSize,
207208
"root_volume_type": obj.Spec.AWSMachineConfig.RootVolumeType,
208209
"security_group_ids": cp.AwsSecurityGroupIDs,
209-
"subnet_id": obj.Spec.AWSMachineConfig.PublicSubnetID,
210+
"subnet_id": cp.SubnetId,
210211
})
211212
}
212213
default:

operators/workspace/internal/controllers/workspace/controller.go

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,22 @@ import (
1818
corev1 "k8s.io/api/core/v1"
1919
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2020
"k8s.io/apimachinery/pkg/runtime"
21-
"k8s.io/apimachinery/pkg/util/intstr"
2221
ctrl "sigs.k8s.io/controller-runtime"
2322
"sigs.k8s.io/controller-runtime/pkg/client"
2423
"sigs.k8s.io/controller-runtime/pkg/controller"
25-
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
24+
)
25+
26+
var (
27+
PortConfig = templates.PortConfig{
28+
SSHPort: 22,
29+
TTYDPort: 56789,
30+
NotebookPort: 56790,
31+
CodeServerPort: 56791,
32+
}
33+
)
34+
35+
const (
36+
IngressClassName = "nginx"
2637
)
2738

2839
type Reconciler struct {
@@ -44,7 +55,7 @@ func (r *Reconciler) GetName() string {
4455

4556
const (
4657
CreateDeployment string = "create-deployment"
47-
CreateService string = "create-service"
58+
// CreateService string = "create-service"
4859
)
4960

5061
// +kubebuilder:rbac:groups=crds.kloudlite.io,resources=apps,verbs=get;list;watch;create;update;patch;delete
@@ -87,9 +98,9 @@ func (r *Reconciler) Reconcile(ctx context.Context, request ctrl.Request) (ctrl.
8798
return step.ReconcilerResponse()
8899
}
89100

90-
if step := r.createInterceptableService(req); !step.ShouldProceed() {
91-
return step.ReconcilerResponse()
92-
}
101+
// if step := r.createInterceptableService(req); !step.ShouldProceed() {
102+
// return step.ReconcilerResponse()
103+
// }
93104

94105
if step := r.createDeployment(req); !step.ShouldProceed() {
95106
return step.ReconcilerResponse()
@@ -99,28 +110,28 @@ func (r *Reconciler) Reconcile(ctx context.Context, request ctrl.Request) (ctrl.
99110
return ctrl.Result{}, nil
100111
}
101112

102-
func (r *Reconciler) createInterceptableService(req *rApi.Request[*crdsv1.Workspace]) stepResult.Result {
103-
ctx, obj := req.Context(), req.Object
104-
check := rApi.NewRunningCheck(CreateService, req)
105-
106-
svc := &corev1.Service{ObjectMeta: metav1.ObjectMeta{Name: obj.Name, Namespace: obj.Namespace}}
107-
if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, svc, func() error {
108-
svc.Spec.Ports = []corev1.ServicePort{
109-
{
110-
Name: fmt.Sprintf("port-%d", 3000),
111-
Protocol: "TCP",
112-
Port: 3000,
113-
TargetPort: intstr.FromInt(3000),
114-
},
115-
}
116-
return nil
117-
}); err != nil {
118-
return check.Failed(err)
119-
}
120-
121-
// function-body
122-
return check.Completed()
123-
}
113+
// func (r *Reconciler) createInterceptableService(req *rApi.Request[*crdsv1.Workspace]) stepResult.Result {
114+
// ctx, obj := req.Context(), req.Object
115+
// check := rApi.NewRunningCheck(CreateService, req)
116+
117+
// svc := &corev1.Service{ObjectMeta: metav1.ObjectMeta{Name: obj.Name, Namespace: obj.Namespace}}
118+
// if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, svc, func() error {
119+
// svc.Spec.Ports = []corev1.ServicePort{
120+
// {
121+
// Name: fmt.Sprintf("port-%d", 3000),
122+
// Protocol: "TCP",
123+
// Port: 3000,
124+
// TargetPort: intstr.FromInt(3000),
125+
// },
126+
// }
127+
// return nil
128+
// }); err != nil {
129+
// return check.Failed(err)
130+
// }
131+
132+
// // function-body
133+
// return check.Completed()
134+
// }
124135

125136
func (r *Reconciler) createDeployment(req *rApi.Request[*crdsv1.Workspace]) stepResult.Result {
126137
ctx, obj := req.Context(), req.Object
@@ -132,13 +143,14 @@ func (r *Reconciler) createDeployment(req *rApi.Request[*crdsv1.Workspace]) step
132143
Namespace: obj.Namespace,
133144
OwnerReferences: []metav1.OwnerReference{fn.AsOwner(obj, true)},
134145
},
146+
KloudliteDomain: "test.khost.dev",
135147
WorkMachineName: obj.Spec.WorkMachine,
136148
ServiceAccountName: obj.Spec.ServiceAccountName,
137149
ImageInitContainer: r.Env.WorkspaceImageInitContainer,
138150
ImageSSH: r.Env.WorkspaceImageSSH,
139-
140-
EnableTTYD: obj.Spec.EnableTTYD,
141-
ImageTTYD: r.Env.WorkspaceImageTTYD,
151+
IsOn: obj.Spec.State == crdsv1.WorkspaceStateOn,
152+
EnableTTYD: obj.Spec.EnableTTYD,
153+
ImageTTYD: r.Env.WorkspaceImageTTYD,
142154

143155
EnableJupyterNotebook: obj.Spec.EnableJupyterNotebook,
144156
ImageJupyterNotebook: r.Env.WorkspaceImageJupyterNotebook,
@@ -150,14 +162,14 @@ func (r *Reconciler) createDeployment(req *rApi.Request[*crdsv1.Workspace]) step
150162
ImageVscodeServer: r.Env.WorkspcaeImageVscodeServer,
151163

152164
ImagePullPolicy: obj.Spec.ImagePullPolicy,
153-
KloudliteDeviceFQDN: fmt.Sprintf("%s.%s.svc.cluster.local", obj.Name, obj.Namespace),
154-
155-
RouterSpec: obj.Spec.Router,
165+
KloudliteDeviceFQDN: fmt.Sprintf("%s-headless.%s.svc.cluster.local", obj.Name, obj.Namespace),
156166
})
157167
if err != nil {
158168
return check.Failed(err)
159169
}
160170

171+
fmt.Println(string(b))
172+
161173
rr, err := r.YAMLClient.ApplyYAML(ctx, b)
162174
if err != nil {
163175
return check.Failed(err)
@@ -195,7 +207,7 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
195207
r.recorder = mgr.GetEventRecorderFor(r.GetName())
196208

197209
var err error
198-
r.workspaceDeploymentTemplate, err = templates.Read(templates.WorkspaceTemplate)
210+
r.workspaceDeploymentTemplate, err = templates.Read(templates.WorkspaceIngressTemplate, templates.WorkspaceSTSTemplate, templates.WorkspaceServiceTemplate)
199211
if err != nil {
200212
return err
201213
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
---
2+
{{- with . }}
3+
apiVersion: networking.k8s.io/v1
4+
kind: Ingress
5+
metadata:
6+
name: code-server-{{.Metadata.Name}}
7+
namespace: {{.Metadata.Namespace}}
8+
labels: {{.Metadata.Labels | toJson }}
9+
annotations:
10+
nginx.ingress.kubernetes.io/rewrite-target: /
11+
nginx.ingress.kubernetes.io/ssl-redirect: "true"
12+
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
13+
spec:
14+
{{- if and .IngressClassName (ne .IngressClassName "") }}
15+
ingressClassName: {{.IngressClassName}}
16+
{{- end }}
17+
rules:
18+
- host: code-server.{{.Metadata.Name}}.{{.WorkMachineName}}.{{.KloudliteDomain}}
19+
http:
20+
paths:
21+
- path: /
22+
pathType: Prefix
23+
backend:
24+
service:
25+
name: {{.Metadata.Name}}
26+
port:
27+
number: {{.PortConfig.CodeServerPort}}
28+
29+
30+
---
31+
32+
33+
apiVersion: networking.k8s.io/v1
34+
kind: Ingress
35+
metadata:
36+
name: nb-{{.Metadata.Name}}
37+
namespace: {{.Metadata.Namespace}}
38+
labels: {{.Metadata.Labels | toJson }}
39+
annotations:
40+
nginx.ingress.kubernetes.io/rewrite-target: /
41+
nginx.ingress.kubernetes.io/ssl-redirect: "true"
42+
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
43+
spec:
44+
{{- if and .IngressClassName (ne .IngressClassName "") }}
45+
ingressClassName: {{.IngressClassName}}
46+
{{- end }}
47+
rules:
48+
- host: notebook.{{.Metadata.Name}}.{{.WorkMachineName}}.{{.KloudliteDomain}}
49+
http:
50+
paths:
51+
- path: /
52+
pathType: Prefix
53+
backend:
54+
service:
55+
name: {{.Metadata.Name}}
56+
port:
57+
number: {{.PortConfig.NotebookPort}}
58+
59+
60+
---
61+
62+
apiVersion: networking.k8s.io/v1
63+
kind: Ingress
64+
metadata:
65+
name: ttyd-{{.Metadata.Name}}
66+
namespace: {{.Metadata.Namespace}}
67+
labels: {{.Metadata.Labels | toJson }}
68+
annotations:
69+
nginx.ingress.kubernetes.io/rewrite-target: /
70+
nginx.ingress.kubernetes.io/ssl-redirect: "true"
71+
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
72+
spec:
73+
{{- if and .IngressClassName (ne .IngressClassName "") }}
74+
ingressClassName: {{.IngressClassName}}
75+
{{- end }}
76+
rules:
77+
- host: ttyd.{{.Metadata.Name}}.{{.WorkMachineName}}.{{.KloudliteDomain}}
78+
http:
79+
paths:
80+
- path: /
81+
pathType: Prefix
82+
backend:
83+
service:
84+
name: {{.Metadata.Name}}
85+
port:
86+
number: {{.PortConfig.TTYDPort}}
87+
88+
{{- end }}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
{{- with . }}
3+
apiVersion: v1
4+
kind: Service
5+
metadata: {{.Metadata | toJson }}
6+
spec:
7+
selector:
8+
app: {{.Metadata.Name | squote}}
9+
ports:
10+
- name: "ssh"
11+
protocol: "TCP"
12+
port: {{.PortConfig.SSHPort}}
13+
targetPort: {{.PortConfig.SSHPort}}
14+
15+
{{ if .EnableTTYD }}
16+
- name: "ttyd-server"
17+
protocol: "TCP"
18+
port: {{.PortConfig.TTYDPort}}
19+
targetPort: {{.PortConfig.TTYDPort}}
20+
{{ end }}
21+
22+
{{ if .EnableJupyterNotebook }}
23+
- name: "jupyter-server"
24+
protocol: "TCP"
25+
port: {{.PortConfig.NotebookPort}}
26+
targetPort: {{.PortConfig.NotebookPort}}
27+
{{ end }}
28+
29+
{{ if .EnableCodeServer }}
30+
- name: "code-server"
31+
protocol: "TCP"
32+
port: {{.PortConfig.CodeServerPort}}
33+
targetPort: {{.PortConfig.CodeServerPort}}
34+
{{ end }}
35+
36+
37+
---
38+
apiVersion: v1
39+
kind: Service
40+
metadata:
41+
name: {{.Metadata.Name}}-headless
42+
namespace: {{.Metadata.Namespace}}
43+
labels: {{.Metadata.Labels | toJson }}
44+
annotations: {{.Metadata.Annotations | toJson }}
45+
ownerReferences: {{.Metadata.OwnerReferences | toJson }}
46+
spec:
47+
clusterIP: None
48+
selector:
49+
app: {{.Metadata.Name | squote}}
50+
51+
{{- end }}

0 commit comments

Comments
 (0)