Skip to content

Commit f4a302c

Browse files
committed
feat(api): validate required app config items
1 parent d6968d8 commit f4a302c

File tree

21 files changed

+1868
-102
lines changed

21 files changed

+1868
-102
lines changed

api/client/client_test.go

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -890,8 +890,9 @@ func TestLinuxPatchAppConfigValues(t *testing.T) {
890890
// Decode and verify request body
891891
var req types.PatchAppConfigValuesRequest
892892
err := json.NewDecoder(r.Body).Decode(&req)
893-
require.NoError(t, err)
893+
require.NoError(t, err, "Failed to decode request body")
894894
assert.Equal(t, "new-value", req.Values["test-item"])
895+
assert.Equal(t, "required-value", request.Values["required-item"])
895896

896897
// Return successful response
897898
w.WriteHeader(http.StatusOK)
@@ -901,35 +902,36 @@ func TestLinuxPatchAppConfigValues(t *testing.T) {
901902

902903
// Test successful set
903904
c := New(server.URL, WithToken("test-token"))
904-
values := map[string]string{
905-
"test-item": "new-value",
905+
configValues := map[string]string{
906+
"test-item": "new-value",
907+
"required-item": "required-value",
906908
}
907-
config, err := c.PatchLinuxAppConfigValues(values)
908-
assert.NoError(t, err)
909+
config, err := c.PatchLinuxAppConfigValues(configValues)
910+
require.NoError(t, err)
909911
assert.Equal(t, expectedConfig, config)
910912

911913
// Test error response
912914
errorServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
913-
w.WriteHeader(http.StatusInternalServerError)
915+
w.WriteHeader(http.StatusBadRequest)
914916
json.NewEncoder(w).Encode(types.APIError{
915-
StatusCode: http.StatusInternalServerError,
916-
Message: "Internal Server Error",
917+
StatusCode: http.StatusBadRequest,
918+
Message: "Bad Request",
917919
})
918920
}))
919921
defer errorServer.Close()
920922

921923
c = New(errorServer.URL, WithToken("test-token"))
922-
config, err = c.PatchLinuxAppConfigValues(values)
924+
config, err = c.PatchLinuxAppConfigValues(configValues)
923925
assert.Error(t, err)
924926
assert.Equal(t, types.AppConfig{}, config)
925927

926928
apiErr, ok := err.(*types.APIError)
927929
require.True(t, ok, "Expected err to be of type *types.APIError")
928-
assert.Equal(t, http.StatusInternalServerError, apiErr.StatusCode)
929-
assert.Equal(t, "Internal Server Error", apiErr.Message)
930+
assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode)
931+
assert.Equal(t, "Bad Request", apiErr.Message)
930932
}
931933

932-
func TestKubernetesPatchAppConfigValues(t *testing.T) {
934+
func TestKubernetesSetAppConfigValues(t *testing.T) {
933935
// Define expected config once
934936
expectedConfig := types.AppConfig{
935937
Groups: []kotsv1beta1.ConfigGroup{
@@ -951,17 +953,23 @@ func TestKubernetesPatchAppConfigValues(t *testing.T) {
951953

952954
// Create a test server
953955
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
956+
// Check request method and path
954957
assert.Equal(t, "PATCH", r.Method)
955958
assert.Equal(t, "/api/kubernetes/install/app/config/values", r.URL.Path)
959+
assert.Equal(t, "Bearer test-token", r.Header.Get("Authorization"))
956960

961+
// Check headers
957962
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
958963
assert.Equal(t, "Bearer test-token", r.Header.Get("Authorization"))
959964

960-
// Decode and verify request body
961-
var req types.PatchAppConfigValuesRequest
962-
err := json.NewDecoder(r.Body).Decode(&req)
963-
require.NoError(t, err)
964-
assert.Equal(t, "new-value", req.Values["test-item"])
965+
// Decode request body
966+
var request types.SetAppConfigValuesRequest
967+
err := json.NewDecoder(r.Body).Decode(&request)
968+
require.NoError(t, err, "Failed to decode request body")
969+
970+
// Verify the request contains expected values
971+
assert.Equal(t, "new-value", request.Values["test-item"])
972+
assert.Equal(t, "required-value", request.Values["required-item"])
965973

966974
// Return successful response
967975
w.WriteHeader(http.StatusOK)
@@ -971,30 +979,31 @@ func TestKubernetesPatchAppConfigValues(t *testing.T) {
971979

972980
// Test successful set
973981
c := New(server.URL, WithToken("test-token"))
974-
values := map[string]string{
975-
"test-item": "new-value",
982+
configValues := map[string]string{
983+
"test-item": "new-value",
984+
"required-item": "required-value",
976985
}
977-
config, err := c.PatchKubernetesAppConfigValues(values)
986+
config, err := c.PatchKubernetesAppConfigValues(configValues)
978987
assert.NoError(t, err)
979988
assert.Equal(t, expectedConfig, config)
980989

981990
// Test error response
982991
errorServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
983-
w.WriteHeader(http.StatusInternalServerError)
992+
w.WriteHeader(http.StatusBadRequest)
984993
json.NewEncoder(w).Encode(types.APIError{
985-
StatusCode: http.StatusInternalServerError,
986-
Message: "Internal Server Error",
994+
StatusCode: http.StatusBadRequest,
995+
Message: "Bad Request",
987996
})
988997
}))
989998
defer errorServer.Close()
990999

9911000
c = New(errorServer.URL, WithToken("test-token"))
992-
config, err = c.PatchKubernetesAppConfigValues(values)
1001+
config, err = c.PatchKubernetesAppConfigValues(configValues)
9931002
assert.Error(t, err)
9941003
assert.Equal(t, types.AppConfig{}, config)
9951004

9961005
apiErr, ok := err.(*types.APIError)
9971006
require.True(t, ok, "Expected err to be of type *types.APIError")
998-
assert.Equal(t, http.StatusInternalServerError, apiErr.StatusCode)
999-
assert.Equal(t, "Internal Server Error", apiErr.Message)
1007+
assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode)
1008+
assert.Equal(t, "Bad Request", apiErr.Message)
10001009
}

api/client/install.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,10 +439,11 @@ func (c *client) GetKubernetesAppConfigValues() (map[string]string, error) {
439439
}
440440

441441
func (c *client) PatchKubernetesAppConfigValues(values map[string]string) (types.AppConfig, error) {
442-
req := types.PatchAppConfigValuesRequest{
442+
request := types.PatchAppConfigValuesRequest{
443443
Values: values,
444444
}
445-
b, err := json.Marshal(req)
445+
446+
b, err := json.Marshal(request)
446447
if err != nil {
447448
return types.AppConfig{}, err
448449
}

api/controllers/kubernetes/install/app.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ func (c *InstallController) PatchAppConfigValues(ctx context.Context, values map
5151
}
5252
}()
5353

54-
err = c.appConfigManager.PatchConfigValues(ctx, *c.releaseData.AppConfig, values)
54+
err = c.appConfigManager.ValidateConfigValues(*c.releaseData.AppConfig, values)
55+
if err != nil {
56+
return fmt.Errorf("validate app config values: %w", err)
57+
}
58+
59+
err = c.appConfigManager.PatchConfigValues(*c.releaseData.AppConfig, values)
5560
if err != nil {
5661
return fmt.Errorf("patch app config values: %w", err)
5762
}

0 commit comments

Comments
 (0)