Skip to content

Commit b779177

Browse files
committed
feat: switch to LSC app backend using magic configmap
Signed-off-by: Haoyu Sun <[email protected]>
1 parent 5fd0b39 commit b779177

File tree

8 files changed

+486
-1
lines changed

8 files changed

+486
-1
lines changed

internal/controller/constants.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ const (
2828
/*** application server configuration file ***/
2929
// OLSConfigName is the name of the OLSConfig configmap
3030
OLSConfigCmName = "olsconfig"
31+
// AppServerConfigCmName is the name of the app server configmap
32+
AppServerConfigCmName = "olsconfig"
3133
// OLSCAConfigMap is the name of the OLS TLS ca certificate configmap
3234
OLSCAConfigMap = "openshift-service-ca.crt"
3335
// OLSNamespaceDefault is the default namespace for OLS
@@ -285,4 +287,6 @@ ssl_ca_file = '/etc/certs/cm-olspostgresca/service-ca.crt'
285287
MCPHeadersMountRoot = "/etc/mcp/headers"
286288
// Header Secret Data Path
287289
MCPSECRETDATAPATH = "header"
290+
// LSCAppServerActivatorCmName is the name of the LSC app server activator configmap
291+
LSCAppServerActivatorCmName = "lsc-app-server-activator"
288292
)

internal/controller/errors.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const (
6868
ErrGetConsolePluginDeployment = "failed to get Console Plugin deployment"
6969
ErrGetConsolePluginNetworkPolicy = "failed to get Console Plugin network policy"
7070
ErrGetConsolePluginService = "failed to get Console Plugin service"
71+
ErrGetLSCActivatorConfigmap = "failed to get LSC backend activator configmap"
7172
ErrGetLLMSecret = "failed to get LLM provider secret" // #nosec G101
7273
ErrGetOperatorNetworkPolicy = "failed to get operator network policy"
7374
ErrGetPostgresNetworkPolicy = "failed to get OLS Postgres network policy"
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package controller
2+
3+
import (
4+
"context"
5+
6+
appsv1 "k8s.io/api/apps/v1"
7+
corev1 "k8s.io/api/core/v1"
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
10+
olsv1alpha1 "github.com/openshift/lightspeed-operator/api/v1alpha1"
11+
)
12+
13+
// todo: implement LSC config map generation
14+
//
15+
//nolint:unused // Ignore unused lint error before implementation of reconciliation functions
16+
func (r *OLSConfigReconciler) generateLSCConfigMap(ctx context.Context, cr *olsv1alpha1.OLSConfig) (*corev1.ConfigMap, error) { //lint:ignore U1000 Ignore unused lint error before implementation of reconciliation functions
17+
configMap := &corev1.ConfigMap{
18+
ObjectMeta: metav1.ObjectMeta{
19+
Name: AppServerConfigCmName,
20+
Namespace: r.Options.Namespace,
21+
},
22+
}
23+
return configMap, nil
24+
}
25+
26+
// todo: implement LSC deployment generation
27+
//
28+
//nolint:unused // Ignore unused lint error before implementation of reconciliation functions
29+
func (r *OLSConfigReconciler) generateLSCDeployment(ctx context.Context, cr *olsv1alpha1.OLSConfig) (*appsv1.Deployment, error) { //lint:ignore U1000 Ignore unused lint error before implementation of reconciliation functions
30+
deployment := &appsv1.Deployment{
31+
ObjectMeta: metav1.ObjectMeta{
32+
Name: OLSAppServerDeploymentName,
33+
Namespace: r.Options.Namespace,
34+
},
35+
Spec: appsv1.DeploymentSpec{
36+
Replicas: cr.Spec.OLSConfig.DeploymentConfig.Replicas,
37+
Selector: &metav1.LabelSelector{
38+
MatchLabels: generateAppServerSelectorLabels(),
39+
},
40+
Template: corev1.PodTemplateSpec{
41+
ObjectMeta: metav1.ObjectMeta{
42+
Labels: generateAppServerSelectorLabels(),
43+
},
44+
Spec: corev1.PodSpec{
45+
Containers: []corev1.Container{
46+
{
47+
Name: "lsc-app-server",
48+
Image: r.Options.LightspeedServiceImage,
49+
},
50+
},
51+
},
52+
},
53+
},
54+
}
55+
return deployment, nil
56+
}
57+
58+
// todo: implement LSC deployment update
59+
//
60+
//nolint:unused // Ignore unused lint error before implementation of reconciliation functions
61+
func (r *OLSConfigReconciler) updateLSCDeployment(ctx context.Context, existingDeployment, desiredDeployment *appsv1.Deployment) error {
62+
63+
return nil
64+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package controller
2+
3+
import (
4+
"context"
5+
6+
. "github.com/onsi/ginkgo/v2"
7+
. "github.com/onsi/gomega"
8+
appsv1 "k8s.io/api/apps/v1"
9+
logf "sigs.k8s.io/controller-runtime/pkg/log"
10+
11+
olsv1alpha1 "github.com/openshift/lightspeed-operator/api/v1alpha1"
12+
)
13+
14+
var _ = Describe("LSC App server assets", Label("LSCBackend"), Ordered, func() {
15+
var cr *olsv1alpha1.OLSConfig
16+
var r *OLSConfigReconciler
17+
var rOptions *OLSConfigReconcilerOptions
18+
var ctx context.Context
19+
20+
Context("LSC asset generation", func() {
21+
BeforeEach(func() {
22+
ctx = context.Background()
23+
rOptions = &OLSConfigReconcilerOptions{
24+
OpenShiftMajor: "123",
25+
OpenshiftMinor: "456",
26+
LightspeedServiceImage: "lightspeed-service:latest",
27+
OpenShiftMCPServerImage: "openshift-mcp-server:latest",
28+
Namespace: OLSNamespaceDefault,
29+
}
30+
cr = getDefaultOLSConfigCR()
31+
r = &OLSConfigReconciler{
32+
Options: *rOptions,
33+
logger: logf.Log.WithName("olsconfig.reconciler"),
34+
Client: k8sClient,
35+
Scheme: k8sClient.Scheme(),
36+
stateCache: make(map[string]string),
37+
}
38+
})
39+
40+
Describe("generateLSCConfigMap", func() {
41+
It("should generate a valid configmap", func() {
42+
cm, err := r.generateLSCConfigMap(ctx, cr)
43+
Expect(err).NotTo(HaveOccurred())
44+
Expect(cm).NotTo(BeNil())
45+
})
46+
47+
// TODO: Add more tests cases for once implementation is complete
48+
})
49+
50+
Describe("generateLSCDeployment", func() {
51+
It("should generate a valid deployment", func() {
52+
deployment, err := r.generateLSCDeployment(ctx, cr)
53+
Expect(err).NotTo(HaveOccurred())
54+
Expect(deployment).NotTo(BeNil())
55+
})
56+
57+
// TODO: Add more tests cases for once implementation is complete
58+
})
59+
60+
Describe("updateLSCDeployment", func() {
61+
var existingDeployment *appsv1.Deployment
62+
var desiredDeployment *appsv1.Deployment
63+
64+
BeforeEach(func() {
65+
existingDeployment, _ = r.generateLSCDeployment(ctx, cr)
66+
})
67+
68+
It("should successfully update deployment", func() {
69+
desiredDeployment, _ = r.generateLSCDeployment(ctx, cr)
70+
err := r.updateLSCDeployment(ctx, existingDeployment, desiredDeployment)
71+
Expect(err).NotTo(HaveOccurred())
72+
})
73+
74+
// TODO: Add more tests cases for once implementation is complete
75+
})
76+
})
77+
78+
})
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package controller
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
olsv1alpha1 "github.com/openshift/lightspeed-operator/api/v1alpha1"
8+
)
9+
10+
func (r *OLSConfigReconciler) reconcileAppServerLSC(ctx context.Context, olsconfig *olsv1alpha1.OLSConfig) error {
11+
r.logger.Info("reconcileAppServerLSC starts")
12+
tasks := []ReconcileTask{
13+
{
14+
Name: "reconcile ServiceAccount",
15+
Task: r.reconcileServiceAccount,
16+
},
17+
{
18+
Name: "reconcile SARRole",
19+
Task: r.reconcileSARRole,
20+
},
21+
{
22+
Name: "reconcile SARRoleBinding",
23+
Task: r.reconcileSARRoleBinding,
24+
},
25+
// todo: LSC config map generation
26+
// todo: Llama Stack configmap generation
27+
{
28+
Name: "reconcile OLSConfigMap",
29+
Task: r.reconcileLSCConfigMap,
30+
},
31+
{
32+
Name: "reconcile Additional CA ConfigMap",
33+
Task: r.reconcileOLSAdditionalCAConfigMap,
34+
},
35+
{
36+
Name: "reconcile App Service",
37+
Task: r.reconcileService,
38+
},
39+
{
40+
Name: "reconcile App TLS Certs",
41+
Task: r.reconcileTLSSecret,
42+
},
43+
// todo: LSC deployment generation
44+
{
45+
Name: "reconcile App Deployment",
46+
Task: r.reconcileLSCDeployment,
47+
},
48+
{
49+
Name: "reconcile Metrics Reader Secret",
50+
Task: r.reconcileMetricsReaderSecret,
51+
},
52+
{
53+
Name: "reconcile App ServiceMonitor",
54+
Task: r.reconcileServiceMonitor,
55+
},
56+
{
57+
Name: "reconcile App PrometheusRule",
58+
Task: r.reconcilePrometheusRule,
59+
},
60+
{
61+
Name: "reconcile App NetworkPolicy",
62+
Task: r.reconcileAppServerNetworkPolicy,
63+
},
64+
{
65+
Name: "reconcile Proxy CA ConfigMap",
66+
Task: r.reconcileProxyCAConfigMap,
67+
},
68+
}
69+
70+
for _, task := range tasks {
71+
err := task.Task(ctx, olsconfig)
72+
if err != nil {
73+
r.logger.Error(err, "reconcileAppServer error", "task", task.Name)
74+
return fmt.Errorf("failed to %s: %w", task.Name, err)
75+
}
76+
}
77+
78+
r.logger.Info("reconcileAppServer completes")
79+
80+
return nil
81+
}
82+
83+
func (r *OLSConfigReconciler) reconcileLSCConfigMap(ctx context.Context, cr *olsv1alpha1.OLSConfig) error {
84+
85+
return r.reconcileOLSConfigMap(ctx, cr)
86+
// TODO: implement LSC configmap reconciliation
87+
}
88+
89+
func (r *OLSConfigReconciler) reconcileLSCDeployment(ctx context.Context, cr *olsv1alpha1.OLSConfig) error {
90+
91+
return r.reconcileDeployment(ctx, cr)
92+
93+
// TODO: implement LSC deployment reconciliation
94+
}

0 commit comments

Comments
 (0)