Skip to content

Commit d85b862

Browse files
authored
feat: Skip syncing on start if flag set (#485)
* Skip syncing on start if flag set * Skip sync specifically * remove need to use project * Return early * add comment * Add test and fix existing one
1 parent c1bad90 commit d85b862

File tree

5 files changed

+42
-9
lines changed

5 files changed

+42
-9
lines changed

cmd/cliflags/flags.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const (
1717
PortFlag = "port"
1818
ProjectFlag = "project"
1919
RoleFlag = "role"
20+
SyncOnceFlag = "sync-once"
2021

2122
AccessTokenFlagDescription = "LaunchDarkly access token with write-level access"
2223
AnalyticsOptOutDescription = "Opt out of analytics tracking"
@@ -27,6 +28,7 @@ const (
2728
OutputFlagDescription = "Command response output format in either JSON or plain text"
2829
PortFlagDescription = "Port for the dev server to run on"
2930
ProjectFlagDescription = "Default project key"
31+
SyncOnceFlagDescription = "Only sync new projects. Existing projects will not be resynced on startup"
3032
)
3133

3234
func AllFlagsHelp() map[string]string {
@@ -40,5 +42,6 @@ func AllFlagsHelp() map[string]string {
4042
OutputFlag: OutputFlagDescription,
4143
PortFlag: PortFlagDescription,
4244
ProjectFlag: ProjectFlagDescription,
45+
SyncOnceFlag: SyncOnceFlagDescription,
4346
}
4447
}

cmd/config/testdata/help.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Supported settings:
1010
- `output`: Command response output format in either JSON or plain text
1111
- `port`: Port for the dev server to run on
1212
- `project`: Default project key
13+
- `sync-once`: Only sync new projects. Existing projects will not be resynced on startup
1314

1415
Usage:
1516
ldcli config [flags]

cmd/dev_server/start_server.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ func NewStartServerCmd(client dev_server.Client) *cobra.Command {
4343
cmd.Flags().String(OverrideFlag, "", `Stringified JSON representation of flag overrides ex. {"flagName": true, "stringFlagName": "test" }`)
4444
_ = viper.BindPFlag(OverrideFlag, cmd.Flags().Lookup(OverrideFlag))
4545

46+
cmd.Flags().Bool(cliflags.SyncOnceFlag, false, cliflags.SyncOnceFlagDescription)
47+
_ = viper.BindPFlag(cliflags.SyncOnceFlag, cmd.Flags().Lookup(cliflags.SyncOnceFlag))
48+
4649
return cmd
4750
}
4851

@@ -58,6 +61,7 @@ func startServer(client dev_server.Client) func(*cobra.Command, []string) error
5861
Enabled: true,
5962
ProjectKey: viper.GetString(cliflags.ProjectFlag),
6063
EnvKey: viper.GetString(SourceEnvironmentFlag),
64+
SyncOnce: viper.GetBool(cliflags.SyncOnceFlag),
6165
}
6266
if viper.IsSet(ContextFlag) {
6367
var c ldcontext.Context

internal/dev_server/model/sync.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type InitialProjectSettings struct {
1818
EnvKey string
1919
Context *ldcontext.Context `json:"context,omitempty"`
2020
Overrides map[string]FlagValue `json:"overrides,omitempty"`
21+
SyncOnce bool
2122
}
2223

2324
func CreateOrSyncProject(ctx context.Context, settings InitialProjectSettings) error {
@@ -29,17 +30,23 @@ func CreateOrSyncProject(ctx context.Context, settings InitialProjectSettings) e
2930
var project Project
3031
project, createError := CreateProject(ctx, settings.ProjectKey, settings.EnvKey, settings.Context)
3132
if createError != nil {
32-
if errors.Is(createError, ErrAlreadyExists) {
33-
log.Printf("Project [%s] exists, refreshing data", settings.ProjectKey)
34-
var updateErr error
35-
project, updateErr = UpdateProject(ctx, settings.ProjectKey, settings.Context, &settings.EnvKey)
36-
if updateErr != nil {
37-
return updateErr
38-
}
39-
40-
} else {
33+
if !errors.Is(createError, ErrAlreadyExists) {
4134
return createError
4235
}
36+
37+
// If set, don't resync and don't apply overrides because whatever you have locally
38+
// is already set up with what you want.
39+
if settings.SyncOnce {
40+
log.Printf("Project [%s] exists, but --sync-once flag is set, skipping refresh", settings.ProjectKey)
41+
return nil
42+
}
43+
44+
log.Printf("Project [%s] exists, refreshing data", settings.ProjectKey)
45+
var updateErr error
46+
project, updateErr = UpdateProject(ctx, settings.ProjectKey, settings.Context, &settings.EnvKey)
47+
if updateErr != nil {
48+
return updateErr
49+
}
4350
}
4451
for flagKey, val := range settings.Overrides {
4552
_, err := UpsertOverride(ctx, settings.ProjectKey, flagKey, val)

internal/dev_server/model/sync_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,22 @@ func TestInitialSync(t *testing.T) {
170170
assert.NoError(t, err)
171171
})
172172

173+
t.Run("If SyncOnce is set and the project already exists, return early", func(t *testing.T) {
174+
api.EXPECT().GetSdkKey(gomock.Any(), projKey, sourceEnvKey).Return(sdkKey, nil)
175+
sdk.EXPECT().GetAllFlagsState(gomock.Any(), gomock.Any(), sdkKey).Return(allFlagsState, nil)
176+
api.EXPECT().GetAllFlags(gomock.Any(), projKey).Return(allFlags, nil)
177+
store.EXPECT().InsertProject(gomock.Any(), gomock.Any()).Return(model.ErrAlreadyExists)
178+
179+
input := model.InitialProjectSettings{
180+
Enabled: true,
181+
ProjectKey: projKey,
182+
EnvKey: sourceEnvKey,
183+
Context: nil,
184+
SyncOnce: true,
185+
}
186+
err := model.CreateOrSyncProject(ctx, input)
187+
188+
assert.NoError(t, err)
189+
})
190+
173191
}

0 commit comments

Comments
 (0)