Skip to content

Commit 53d7e69

Browse files
committed
f
1 parent e7da6bb commit 53d7e69

File tree

5 files changed

+704
-0
lines changed

5 files changed

+704
-0
lines changed

api/client/client.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Client interface {
1818
GetLinuxInfraStatus() (types.Infra, error)
1919
GetLinuxAppConfig() (types.AppConfig, error)
2020
GetLinuxAppConfigValues() (map[string]string, error)
21+
SetLinuxAppConfigValues(values map[string]string) (types.AppConfig, error)
2122

2223
GetKubernetesInstallationConfig() (types.KubernetesInstallationConfig, error)
2324
ConfigureKubernetesInstallation(config types.KubernetesInstallationConfig) (types.Status, error)
@@ -26,6 +27,7 @@ type Client interface {
2627
GetKubernetesInfraStatus() (types.Infra, error)
2728
GetKubernetesAppConfig() (types.AppConfig, error)
2829
GetKubernetesAppConfigValues() (map[string]string, error)
30+
SetKubernetesAppConfigValues(values map[string]string) (types.AppConfig, error)
2931
}
3032

3133
type client struct {

api/client/client_test.go

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,3 +858,155 @@ func TestKubernetesGetAppConfigValues(t *testing.T) {
858858
assert.Equal(t, http.StatusInternalServerError, apiErr.StatusCode)
859859
assert.Equal(t, "Internal Server Error", apiErr.Message)
860860
}
861+
862+
func TestLinuxSetAppConfigValues(t *testing.T) {
863+
// Define expected config once
864+
expectedConfig := types.AppConfig{
865+
Groups: []kotsv1beta1.ConfigGroup{
866+
{
867+
Name: "test-group",
868+
Title: "Test Group",
869+
Items: []kotsv1beta1.ConfigItem{
870+
{
871+
Name: "test-item",
872+
Type: "text",
873+
Title: "Test Item",
874+
Default: multitype.BoolOrString{StrVal: "default"},
875+
Value: multitype.BoolOrString{StrVal: "value"},
876+
},
877+
},
878+
},
879+
},
880+
}
881+
882+
// Create a test server
883+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
884+
// Check request method and path
885+
assert.Equal(t, "POST", r.Method)
886+
assert.Equal(t, "/api/linux/install/app/config/values", r.URL.Path)
887+
888+
// Check headers
889+
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
890+
assert.Equal(t, "Bearer test-token", r.Header.Get("Authorization"))
891+
892+
// Decode request body
893+
var request types.SetAppConfigValuesRequest
894+
err := json.NewDecoder(r.Body).Decode(&request)
895+
require.NoError(t, err, "Failed to decode request body")
896+
897+
// Verify the request contains expected values
898+
assert.Equal(t, "new-value", request.Values["test-item"])
899+
assert.Equal(t, "required-value", request.Values["required-item"])
900+
901+
// Return successful response
902+
w.WriteHeader(http.StatusOK)
903+
json.NewEncoder(w).Encode(expectedConfig)
904+
}))
905+
defer server.Close()
906+
907+
// Test successful set
908+
c := New(server.URL, WithToken("test-token"))
909+
configValues := map[string]string{
910+
"test-item": "new-value",
911+
"required-item": "required-value",
912+
}
913+
config, err := c.SetLinuxAppConfigValues(configValues)
914+
assert.NoError(t, err)
915+
assert.Equal(t, expectedConfig, config)
916+
917+
// Test error response
918+
errorServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
919+
w.WriteHeader(http.StatusBadRequest)
920+
json.NewEncoder(w).Encode(types.APIError{
921+
StatusCode: http.StatusBadRequest,
922+
Message: "Bad Request",
923+
})
924+
}))
925+
defer errorServer.Close()
926+
927+
c = New(errorServer.URL, WithToken("test-token"))
928+
config, err = c.SetLinuxAppConfigValues(configValues)
929+
assert.Error(t, err)
930+
assert.Equal(t, types.AppConfig{}, config)
931+
932+
apiErr, ok := err.(*types.APIError)
933+
require.True(t, ok, "Expected err to be of type *types.APIError")
934+
assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode)
935+
assert.Equal(t, "Bad Request", apiErr.Message)
936+
}
937+
938+
func TestKubernetesSetAppConfigValues(t *testing.T) {
939+
// Define expected config once
940+
expectedConfig := types.AppConfig{
941+
Groups: []kotsv1beta1.ConfigGroup{
942+
{
943+
Name: "test-group",
944+
Title: "Test Group",
945+
Items: []kotsv1beta1.ConfigItem{
946+
{
947+
Name: "test-item",
948+
Type: "text",
949+
Title: "Test Item",
950+
Default: multitype.BoolOrString{StrVal: "default"},
951+
Value: multitype.BoolOrString{StrVal: "value"},
952+
},
953+
},
954+
},
955+
},
956+
}
957+
958+
// Create a test server
959+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
960+
// Check request method and path
961+
assert.Equal(t, "POST", r.Method)
962+
assert.Equal(t, "/api/kubernetes/install/app/config/values", r.URL.Path)
963+
964+
// Check headers
965+
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
966+
assert.Equal(t, "Bearer test-token", r.Header.Get("Authorization"))
967+
968+
// Decode request body
969+
var request types.SetAppConfigValuesRequest
970+
err := json.NewDecoder(r.Body).Decode(&request)
971+
require.NoError(t, err, "Failed to decode request body")
972+
973+
// Verify the request contains expected values
974+
assert.Equal(t, "new-value", request.Values["test-item"])
975+
assert.Equal(t, "required-value", request.Values["required-item"])
976+
977+
// Return successful response
978+
w.WriteHeader(http.StatusOK)
979+
json.NewEncoder(w).Encode(expectedConfig)
980+
}))
981+
defer server.Close()
982+
983+
// Test successful set
984+
c := New(server.URL, WithToken("test-token"))
985+
configValues := map[string]string{
986+
"test-item": "new-value",
987+
"required-item": "required-value",
988+
}
989+
config, err := c.SetKubernetesAppConfigValues(configValues)
990+
assert.NoError(t, err)
991+
assert.Equal(t, expectedConfig, config)
992+
993+
// Test error response
994+
errorServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
995+
w.WriteHeader(http.StatusBadRequest)
996+
json.NewEncoder(w).Encode(types.APIError{
997+
StatusCode: http.StatusBadRequest,
998+
Message: "Bad Request",
999+
})
1000+
}))
1001+
defer errorServer.Close()
1002+
1003+
c = New(errorServer.URL, WithToken("test-token"))
1004+
config, err = c.SetKubernetesAppConfigValues(configValues)
1005+
assert.Error(t, err)
1006+
assert.Equal(t, types.AppConfig{}, config)
1007+
1008+
apiErr, ok := err.(*types.APIError)
1009+
require.True(t, ok, "Expected err to be of type *types.APIError")
1010+
assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode)
1011+
assert.Equal(t, "Bad Request", apiErr.Message)
1012+
}

api/client/install.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,3 +402,75 @@ func (c *client) GetKubernetesAppConfigValues() (map[string]string, error) {
402402

403403
return response.Values, nil
404404
}
405+
406+
func (c *client) SetLinuxAppConfigValues(values map[string]string) (types.AppConfig, error) {
407+
request := types.SetAppConfigValuesRequest{
408+
Values: values,
409+
}
410+
411+
b, err := json.Marshal(request)
412+
if err != nil {
413+
return types.AppConfig{}, err
414+
}
415+
416+
req, err := http.NewRequest("POST", c.apiURL+"/api/linux/install/app/config/values", bytes.NewBuffer(b))
417+
if err != nil {
418+
return types.AppConfig{}, err
419+
}
420+
req.Header.Set("Content-Type", "application/json")
421+
setAuthorizationHeader(req, c.token)
422+
423+
resp, err := c.httpClient.Do(req)
424+
if err != nil {
425+
return types.AppConfig{}, err
426+
}
427+
defer resp.Body.Close()
428+
429+
if resp.StatusCode != http.StatusOK {
430+
return types.AppConfig{}, errorFromResponse(resp)
431+
}
432+
433+
var config types.AppConfig
434+
err = json.NewDecoder(resp.Body).Decode(&config)
435+
if err != nil {
436+
return types.AppConfig{}, err
437+
}
438+
439+
return config, nil
440+
}
441+
442+
func (c *client) SetKubernetesAppConfigValues(values map[string]string) (types.AppConfig, error) {
443+
request := types.SetAppConfigValuesRequest{
444+
Values: values,
445+
}
446+
447+
b, err := json.Marshal(request)
448+
if err != nil {
449+
return types.AppConfig{}, err
450+
}
451+
452+
req, err := http.NewRequest("POST", c.apiURL+"/api/kubernetes/install/app/config/values", bytes.NewBuffer(b))
453+
if err != nil {
454+
return types.AppConfig{}, err
455+
}
456+
req.Header.Set("Content-Type", "application/json")
457+
setAuthorizationHeader(req, c.token)
458+
459+
resp, err := c.httpClient.Do(req)
460+
if err != nil {
461+
return types.AppConfig{}, err
462+
}
463+
defer resp.Body.Close()
464+
465+
if resp.StatusCode != http.StatusOK {
466+
return types.AppConfig{}, errorFromResponse(resp)
467+
}
468+
469+
var config types.AppConfig
470+
err = json.NewDecoder(resp.Body).Decode(&config)
471+
if err != nil {
472+
return types.AppConfig{}, err
473+
}
474+
475+
return config, nil
476+
}

0 commit comments

Comments
 (0)