Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit e5be8af

Browse files
author
Craig Furman
authored
feat(appliance): local developer mode (#63417)
**feat(appliance): local developer mode** - Expose a toggle in the web UI to enable dev mode - dev mode is currently defined as: no container resource requests/limits **fix(appliance): fix misconfigurations to 2 services** Gitserver: the configured probe timeouts were too aggressive. Indexed-search: the image name was wrong Both of these were drift from Helm that we didn't catch. Luckily the appliance is still pre-release! --- Closes https://linear.app/sourcegraph/issue/REL-199/populate-accurate-list-of-versions-to-install
1 parent 345a06a commit e5be8af

File tree

19 files changed

+698
-33
lines changed

19 files changed

+698
-33
lines changed

internal/appliance/appliance.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type Appliance struct {
2121
client client.Client
2222
namespace string
2323
status Status
24-
sourcegraph config.Sourcegraph
24+
sourcegraph *config.Sourcegraph
2525
releaseRegistryClient *releaseregistry.Client
2626
latestSupportedVersion string
2727
logger log.Logger
@@ -58,7 +58,7 @@ func NewAppliance(
5858
latestSupportedVersion: latestSupportedVersion,
5959
namespace: namespace,
6060
status: StatusSetup,
61-
sourcegraph: config.Sourcegraph{},
61+
sourcegraph: &config.Sourcegraph{},
6262
logger: logger,
6363
}
6464
}

internal/appliance/config/BUILD.bazel

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,9 @@ go_test(
3232
srcs = ["dev_mode_test.go"],
3333
embed = [":config"],
3434
tags = [TAG_INFRA_RELEASE],
35-
deps = ["@com_github_stretchr_testify//assert"],
35+
deps = [
36+
"@com_github_stretchr_testify//assert",
37+
"@io_k8s_api//core/v1:core",
38+
"@io_k8s_apimachinery//pkg/api/resource",
39+
],
3640
)

internal/appliance/config/dev_mode.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,41 @@
11
package config
22

3-
func SetLocalDevMode(sg *Sourcegraph) {
3+
func (sg *Sourcegraph) SetLocalDevMode() {
44
sg.Spec.Blobstore.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.Blobstore.ContainerConfig, "blobstore")
5+
sg.Spec.Cadvisor.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.Cadvisor.ContainerConfig, "cadvisor")
6+
7+
sg.Spec.CodeInsights.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.CodeInsights.ContainerConfig, "correct-data-dir-permissions")
8+
sg.Spec.CodeInsights.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.CodeInsights.ContainerConfig, "codeinsights")
9+
sg.Spec.CodeInsights.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.CodeInsights.ContainerConfig, "pgsql-exporter")
10+
11+
sg.Spec.CodeIntel.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.CodeIntel.ContainerConfig, "correct-data-dir-permissions")
12+
sg.Spec.CodeIntel.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.CodeIntel.ContainerConfig, "codeintel-db")
13+
sg.Spec.CodeIntel.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.CodeIntel.ContainerConfig, "pgsql-exporter")
14+
15+
sg.Spec.Frontend.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.Frontend.ContainerConfig, "frontend")
16+
sg.Spec.Frontend.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.Frontend.ContainerConfig, "migrator")
17+
518
sg.Spec.GitServer.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.GitServer.ContainerConfig, "gitserver")
619

20+
sg.Spec.IndexedSearch.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.IndexedSearch.ContainerConfig, "zoekt-webserver")
21+
sg.Spec.IndexedSearch.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.IndexedSearch.ContainerConfig, "zoekt-indexserver")
22+
723
sg.Spec.PGSQL.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.PGSQL.ContainerConfig, "correct-data-dir-permissions")
824
sg.Spec.PGSQL.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.PGSQL.ContainerConfig, "pgsql")
925
sg.Spec.PGSQL.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.PGSQL.ContainerConfig, "pgsql-exporter")
1026

27+
sg.Spec.PreciseCodeIntel.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.PreciseCodeIntel.ContainerConfig, "precise-code-intel-worker")
28+
sg.Spec.Prometheus.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.Prometheus.ContainerConfig, "prometheus")
29+
sg.Spec.RepoUpdater.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.RepoUpdater.ContainerConfig, "repo-updater")
30+
1131
sg.Spec.RedisCache.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.RedisCache.ContainerConfig, "redis-cache")
1232
sg.Spec.RedisCache.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.RedisCache.ContainerConfig, "redis-exporter")
1333
sg.Spec.RedisStore.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.RedisStore.ContainerConfig, "redis-store")
1434
sg.Spec.RedisStore.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.RedisStore.ContainerConfig, "redis-exporter")
1535

16-
sg.Spec.PreciseCodeIntel.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.PreciseCodeIntel.ContainerConfig, "precise-code-intel-worker")
1736
sg.Spec.Symbols.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.Symbols.ContainerConfig, "symbols")
1837
sg.Spec.SyntectServer.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.SyntectServer.ContainerConfig, "syntect-server")
19-
sg.Spec.RepoUpdater.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.RepoUpdater.ContainerConfig, "repo-updater")
38+
sg.Spec.Worker.ContainerConfig = setBestEffortQOSOnContainer(sg.Spec.Worker.ContainerConfig, "worker")
2039
}
2140

2241
func setBestEffortQOSOnContainer(ctrConfigs map[string]ContainerConfig, container string) map[string]ContainerConfig {
@@ -25,7 +44,6 @@ func setBestEffortQOSOnContainer(ctrConfigs map[string]ContainerConfig, containe
2544
}
2645
ctrConfig := ctrConfigs[container]
2746
ctrConfig.BestEffortQOS = true
28-
ctrConfig.Resources = nil
2947
ctrConfigs[container] = ctrConfig
3048
return ctrConfigs
3149
}

internal/appliance/config/dev_mode_test.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ import (
44
"testing"
55

66
"github.com/stretchr/testify/assert"
7+
corev1 "k8s.io/api/core/v1"
8+
"k8s.io/apimachinery/pkg/api/resource"
79
)
810

911
func TestSetLocalDevMode_CreatesContainerConfigWhereNoneExistedBefore(t *testing.T) {
10-
sg := Sourcegraph{}
12+
sg := &Sourcegraph{}
1113

12-
SetLocalDevMode(&sg)
14+
sg.SetLocalDevMode()
1315
assert.Equal(t, sg.Spec.Blobstore.ContainerConfig, map[string]ContainerConfig{
1416
"blobstore": {BestEffortQOS: true},
1517
})
1618
}
1719

1820
func TestSetLocalDevMode_PreservesContainerConfigOtherThanBestEffortQOS(t *testing.T) {
19-
sg := Sourcegraph{
21+
sg := &Sourcegraph{
2022
Spec: SourcegraphSpec{
2123
Blobstore: BlobstoreSpec{
2224
StandardConfig: StandardConfig{
@@ -25,20 +27,54 @@ func TestSetLocalDevMode_PreservesContainerConfigOtherThanBestEffortQOS(t *testi
2527
EnvVars: map[string]string{
2628
"foo": "bar",
2729
},
30+
Resources: &corev1.ResourceRequirements{
31+
Requests: corev1.ResourceList{
32+
corev1.ResourceCPU: resource.MustParse("2"),
33+
corev1.ResourceMemory: resource.MustParse("2G"),
34+
corev1.ResourceEphemeralStorage: resource.MustParse("4Gi"),
35+
},
36+
Limits: corev1.ResourceList{
37+
corev1.ResourceCPU: resource.MustParse("2"),
38+
corev1.ResourceMemory: resource.MustParse("4G"),
39+
corev1.ResourceEphemeralStorage: resource.MustParse("8Gi"),
40+
},
41+
},
2842
},
2943
},
3044
},
3145
},
3246
},
3347
}
3448

35-
SetLocalDevMode(&sg)
49+
sg.SetLocalDevMode()
3650
assert.Equal(t, sg.Spec.Blobstore.ContainerConfig, map[string]ContainerConfig{
3751
"blobstore": {
3852
BestEffortQOS: true,
3953
EnvVars: map[string]string{
4054
"foo": "bar",
4155
},
56+
57+
// We really do want to preserve the resources block, if its already
58+
// set, for one reason: in case the admin has overriden
59+
// ephemeral-resources. Dev mode only affects CPU and memory, but
60+
// this is implemented in
61+
// internal/k8s/resource/container/container.go, not here. We set
62+
// the BestEffortQOS flag to influence the behavior in that file.
63+
// While this is admittedly a bit of a confusing leaky abstraction,
64+
// the golden tests should catch any regressions in the interactions
65+
// between these 2 bits of code.
66+
Resources: &corev1.ResourceRequirements{
67+
Requests: corev1.ResourceList{
68+
corev1.ResourceCPU: resource.MustParse("2"),
69+
corev1.ResourceMemory: resource.MustParse("2G"),
70+
corev1.ResourceEphemeralStorage: resource.MustParse("4Gi"),
71+
},
72+
Limits: corev1.ResourceList{
73+
corev1.ResourceCPU: resource.MustParse("2"),
74+
corev1.ResourceMemory: resource.MustParse("4G"),
75+
corev1.ResourceEphemeralStorage: resource.MustParse("8Gi"),
76+
},
77+
},
4278
},
4379
})
4480
}

internal/appliance/config/spec.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package config
22

33
import (
4-
corev1 "k8s.io/api/core/v1"
54
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
65
)
76

@@ -100,11 +99,6 @@ type PGSQLSpec struct {
10099
DatabaseConnection *DatabaseConnectionSpec `json:"database,omitempty"`
101100
}
102101

103-
type PostgresExporterSpec struct {
104-
// Resources allows for custom resource limits and requests.
105-
Resources *corev1.ResourceList `json:"resources,omitempty"`
106-
}
107-
108102
type PreciseCodeIntelSpec struct {
109103
StandardConfig
110104

@@ -232,9 +226,6 @@ type SourcegraphSpec struct {
232226
// PGSQL defines the desired state of the PostgreSQL database.
233227
PGSQL PGSQLSpec `json:"pgsql,omitempty"`
234228

235-
// PostgresExporter defines the desired state of the Postgres exporter service.
236-
PostgresExporter PostgresExporterSpec `json:"postgresExporter,omitempty"`
237-
238229
// PreciseCodeIntel defines the desired state of the Precise Code Intel service.
239230
PreciseCodeIntel PreciseCodeIntelSpec `json:"preciseCodeIntel,omitempty"`
240231

internal/appliance/dev/integrationtest/integration_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ func srcValidate(t *testing.T, namespace string) {
6666
}
6767

6868
func createConfigMap(t *testing.T, namespace string, k8sClient *kubernetes.Clientset, cfg config.SourcegraphSpec) {
69-
sg := config.Sourcegraph{
69+
sg := &config.Sourcegraph{
7070
Spec: cfg,
7171
}
72-
config.SetLocalDevMode(&sg)
72+
sg.SetLocalDevMode()
7373
cfgBytes, err := yaml.Marshal(sg)
7474
require.NoError(t, err)
7575
cfgMap := configmap.NewConfigMap("sg", namespace)

internal/appliance/html.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
const (
1818
templateSetup = "web/template/setup.gohtml"
19+
formValueOn = "on"
1920
)
2021

2122
var (
@@ -84,7 +85,7 @@ func (a *Appliance) postSetupHandler(w http.ResponseWriter, r *http.Request) {
8485
}
8586

8687
a.sourcegraph.Spec.RequestedVersion = r.FormValue("version")
87-
if r.FormValue("external_database") == "yes" {
88+
if r.FormValue("external_database") == formValueOn {
8889
a.sourcegraph.Spec.PGSQL.DatabaseConnection = &config.DatabaseConnectionSpec{
8990
Host: r.FormValue("pgsqlDBHost"),
9091
Port: r.FormValue("pgsqlDBPort"),
@@ -109,6 +110,10 @@ func (a *Appliance) postSetupHandler(w http.ResponseWriter, r *http.Request) {
109110
}
110111
// TODO validate user input
111112

113+
if r.FormValue("dev_mode") == formValueOn {
114+
a.sourcegraph.SetLocalDevMode()
115+
}
116+
112117
_, err = a.CreateConfigMap(r.Context(), "sourcegraph-appliance")
113118
if err != nil {
114119
a.logger.Error("failed to create configMap sourcegraph-appliance", log.Error(err))

internal/appliance/reconciler/codeintel.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,6 @@ func (r *Reconciler) reconcileCodeIntelService(ctx context.Context, sg *config.S
227227

228228
func (r *Reconciler) reconcileCodeIntelServiceAccount(ctx context.Context, sg *config.Sourcegraph, owner client.Object) error {
229229
cfg := sg.Spec.CodeIntel
230-
sa := serviceaccount.NewServiceAccount("codeintel", sg.Namespace, cfg)
230+
sa := serviceaccount.NewServiceAccount("codeintel-db", sg.Namespace, cfg)
231231
return reconcileObject(ctx, r, sg.Spec.CodeIntel, &sa, &corev1.ServiceAccount{}, sg, owner)
232232
}

internal/appliance/reconciler/gitserver.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ func (r *Reconciler) reconcileGitServerStatefulSet(ctx context.Context, sg *conf
6767
Port: intstr.FromString("rpc"),
6868
},
6969
},
70-
TimeoutSeconds: 5,
71-
InitialDelaySeconds: 5,
7270
}
7371

7472
ctr.VolumeMounts = []corev1.VolumeMount{

internal/appliance/reconciler/indexed_search.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (r *Reconciler) reconcileIndexedSearcherStatefulSet(ctx context.Context, sg
4040
cfg := sg.Spec.IndexedSearch
4141

4242
webServer := container.NewContainer("zoekt-webserver", cfg, config.ContainerConfig{
43-
Image: config.GetDefaultImage(sg, name),
43+
Image: config.GetDefaultImage(sg, "indexed-searcher"),
4444
Resources: &corev1.ResourceRequirements{
4545
Requests: corev1.ResourceList{
4646
corev1.ResourceCPU: resource.MustParse("500m"),

0 commit comments

Comments
 (0)