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

Commit 51f2913

Browse files
authored
Introduces Workspace and WorkMachine resource and controllers
1 parent 4d91d0b commit 51f2913

73 files changed

Lines changed: 3193 additions & 546 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.vscode/launch.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"configurations": [
3+
{
4+
"name": "Run Agent Operator",
5+
"type": "go",
6+
"request": "launch",
7+
"mode": "debug",
8+
"envFile": "${workspaceFolder}/cmd/agent-operator/.secrets/env",
9+
"program": "${workspaceFolder}/cmd/agent-operator/main.go",
10+
"args": [
11+
"--dev","--serverHost", "localhost:8080"
12+
]
13+
}
14+
]
15+
}

PROJECT

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# More info: https://book.kubebuilder.io/reference/project-config.html
55
domain: kloudlite.io
66
layout:
7-
- go.kubebuilder.io/v3
7+
- go.kubebuilder.io/v4
88
multigroup: true
99
plugins:
1010
manifests.sdk.operatorframework.io/v2: {}
@@ -515,8 +515,28 @@ resources:
515515
domain: kloudlite.io
516516
group: crds
517517
kind: ServiceIntercept
518+
version: ""
519+
- api:
520+
crdVersion: v1
521+
namespaced: true
518522
group: mongodb.msvc
519523
kind: Backup
520524
path: github.com/kloudlite/operator/apis/mongodb.msvc/v1
521525
version: v1
526+
- api:
527+
crdVersion: v1
528+
namespaced: true
529+
domain: kloudlite.io
530+
group: crds
531+
kind: Workspace
532+
path: github.com/kloudlite/operator/api/crds/v1
533+
version: v1
534+
- api:
535+
crdVersion: v1
536+
namespaced: true
537+
domain: kloudlite.io
538+
group: crds
539+
kind: WorkMachine
540+
path: github.com/kloudlite/operator/api/crds/v1
541+
version: v1
522542
version: "3"

apis/common-types/types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,12 @@ type MinMaxInt struct {
117117
// +kubebuilder:validation:Enum=aws;do;azure;gcp
118118
type CloudProvider string
119119

120+
func (c CloudProvider) String() string {
121+
return string(c)
122+
}
123+
120124
const (
125+
CloudProviderUnknown CloudProvider = "unknown"
121126
CloudProviderAWS CloudProvider = "aws"
122127
CloudProviderDigitalOcean CloudProvider = "digitalocean"
123128
CloudProviderAzure CloudProvider = "azure"

apis/crds/v1/app_webhook.go

Lines changed: 0 additions & 60 deletions
This file was deleted.

apis/crds/v1/router_types.go

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
package v1
22

33
import (
4-
"strings"
5-
64
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
75

8-
"github.com/kloudlite/operator/pkg/constants"
96
"github.com/kloudlite/operator/toolkit/reconciler"
107
)
118

129
type Route struct {
13-
App string `json:"app"`
14-
// Lambda string `json:"lambda,omitempty"`
15-
Path string `json:"path"`
16-
Port uint16 `json:"port"`
10+
Host string `json:"host"`
11+
Service string `json:"service"`
12+
Path string `json:"path"`
13+
Port uint16 `json:"port"`
14+
1715
// +kubebuilder:default=false
1816
Rewrite bool `json:"rewrite,omitempty"`
1917
}
@@ -50,14 +48,18 @@ type RouterSpec struct {
5048
IngressClass string `json:"ingressClass,omitempty"`
5149
BackendProtocol *string `json:"backendProtocol,omitempty"`
5250
Https *Https `json:"https,omitempty"`
53-
// +kubebuilder:validation:Optional
5451

5552
RateLimit *RateLimit `json:"rateLimit,omitempty"`
5653
MaxBodySizeInMB *int `json:"maxBodySizeInMB,omitempty"`
57-
Domains []string `json:"domains"`
58-
Routes []Route `json:"routes,omitempty"`
59-
BasicAuth *BasicAuth `json:"basicAuth,omitempty"`
60-
Cors *Cors `json:"cors,omitempty"`
54+
55+
BasicAuth *BasicAuth `json:"basicAuth,omitempty"`
56+
Cors *Cors `json:"cors,omitempty"`
57+
58+
// NginxIngressAnnotations is additional list of annotations on ingress resource
59+
// INFO: must be used when router does not have direct support for it
60+
NginxIngressAnnotations map[string]string `json:"nginxIngressAnnotations,omitempty"`
61+
62+
Routes []Route `json:"routes,omitempty"`
6163
}
6264

6365
// +kubebuilder:object:root=true
@@ -91,16 +93,11 @@ func (r *Router) GetStatus() *reconciler.Status {
9193
}
9294

9395
func (r *Router) GetEnsuredLabels() map[string]string {
94-
return map[string]string{
95-
constants.RouterNameKey: r.Name,
96-
}
96+
return map[string]string{}
9797
}
9898

9999
func (m *Router) GetEnsuredAnnotations() map[string]string {
100-
return map[string]string{
101-
"kloudlite.io/router.domains": strings.Join(m.Spec.Domains, ","),
102-
"kloudlite.io/router.ingress-class": m.Spec.IngressClass,
103-
}
100+
return map[string]string{}
104101
}
105102

106103
// +kubebuilder:object:root=true

apis/crds/v1/workmachine_types.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package v1
2+
3+
import (
4+
ct "github.com/kloudlite/operator/apis/common-types"
5+
rApi "github.com/kloudlite/operator/toolkit/reconciler"
6+
corev1 "k8s.io/api/core/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
type AWSMachineConfig struct {
11+
// Region string `json:"region" graphql:"noinput"`
12+
// AvailabilityZone string `json:"availabilityZone"`
13+
14+
AMI string `json:"ami"`
15+
InstanceType string `json:"instanceType"`
16+
// PublicSubnetID string `json:"publicSubnetID"`
17+
18+
//+kubebuilder:default=50
19+
RootVolumeSize int `json:"rootVolumeSize" graphql:"noinput"`
20+
21+
//+kubebuilder:default=gp3
22+
RootVolumeType string `json:"rootVolumeType" graphql:"noinput"`
23+
24+
ExternalVolumeSize int `json:"externalVolumeSize"`
25+
26+
//+kubebuilder:default=gp3
27+
ExternalVolumeType string `json:"externalVolumeType" graphql:"noinput"`
28+
29+
IAMInstanceProfileRole *string `json:"iamInstanceProfileRole,omitempty" graphql:"noinput"`
30+
}
31+
32+
// +kubebuilder:validation:Enum=ON;OFF;
33+
// +kubebuilder:default=ON
34+
type WorkMachineState string
35+
36+
const (
37+
WorkMachineStateOn WorkMachineState = "ON"
38+
WorkMachineStateOff WorkMachineState = "OFF"
39+
)
40+
41+
type WorkMachineJobParams struct {
42+
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
43+
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
44+
}
45+
46+
// WorkMachineSpec defines the desired state of WorkMachine
47+
type WorkMachineSpec struct {
48+
State WorkMachineState `json:"state"`
49+
SSHPublicKeys []string `json:"sshPublicKeys"`
50+
51+
JobParams WorkMachineJobParams `json:"jobParams,omitempty"`
52+
53+
TargetNamespace string `json:"targetNamespace,omitempty"`
54+
55+
AWSMachineConfig *AWSMachineConfig `json:"aws"`
56+
}
57+
58+
func (wms *WorkMachineSpec) GetCloudProvider() ct.CloudProvider {
59+
if wms.AWSMachineConfig != nil {
60+
return ct.CloudProviderAWS
61+
}
62+
63+
return ct.CloudProviderUnknown
64+
}
65+
66+
type WorkMachineStatus struct {
67+
rApi.Status `json:"status,omitempty"`
68+
MachinePublicSSHKey string `json:"machineSSHKey,omitempty"`
69+
}
70+
71+
// +kubebuilder:object:root=true
72+
// +kubebuilder:subresource:status
73+
// +kubebuilder:resource:scope=Cluster
74+
// +kubebuilder:printcolumn:JSONPath=".spec.targetNamespace",name=TargetNamespace,type=string
75+
// +kubebuilder:printcolumn:JSONPath=".status.status.lastReconcileTime",name=Seen,type=date
76+
// +kubebuilder:printcolumn:JSONPath=".metadata.annotations.kloudlite\\.io\\/operator\\.checks",name=Checks,type=string
77+
// +kubebuilder:printcolumn:JSONPath=".metadata.annotations.kloudlite\\.io\\/operator\\.resource\\.ready",name=Ready,type=string
78+
// +kubebuilder:printcolumn:JSONPath=".metadata.creationTimestamp",name=Age,type=date
79+
80+
// WorkMachine is the Schema for the workmachines API
81+
type WorkMachine struct {
82+
metav1.TypeMeta `json:",inline"`
83+
metav1.ObjectMeta `json:"metadata,omitempty"`
84+
85+
Spec WorkMachineSpec `json:"spec,omitempty"`
86+
Status WorkMachineStatus `json:"status,omitempty"`
87+
}
88+
89+
func (r *WorkMachine) EnsureGVK() {
90+
if r != nil {
91+
r.SetGroupVersionKind(GroupVersion.WithKind("WorkMachine"))
92+
}
93+
}
94+
95+
func (w *WorkMachine) GetStatus() *rApi.Status {
96+
return &w.Status.Status
97+
}
98+
99+
func (w *WorkMachine) GetEnsuredLabels() map[string]string {
100+
return map[string]string{
101+
"kloudlite.io/workmachine.name": w.Name,
102+
}
103+
}
104+
105+
func (w *WorkMachine) GetEnsuredAnnotations() map[string]string {
106+
return map[string]string{}
107+
}
108+
109+
// +kubebuilder:object:root=true
110+
111+
// WorkMachineList contains a list of WorkMachine
112+
type WorkMachineList struct {
113+
metav1.TypeMeta `json:",inline"`
114+
metav1.ListMeta `json:"metadata,omitempty"`
115+
Items []WorkMachine `json:"items"`
116+
}
117+
118+
func init() {
119+
SchemeBuilder.Register(&WorkMachine{}, &WorkMachineList{})
120+
}

0 commit comments

Comments
 (0)