From 52e9d45e5870ad927b070512f08eca981f62d72a Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Fri, 28 Jan 2022 15:06:16 -0800 Subject: [PATCH] client: Add Cancel function and tests NOTE that the tests against the rpmmd fixure for running and waiting are a bit of a kludge. It is impossible to mock up a running or waiting that will allow an actual cancel, so the tests check for the internal server error generated by using the fixure data. Getting this error means that the API code did it's job and tried to cancel the compose so that should be a good compromise. --- internal/client/compose.go | 14 +++++++++++++ internal/client/compose_test.go | 36 +++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/internal/client/compose.go b/internal/client/compose.go index 5c7e3e785..9323e453f 100644 --- a/internal/client/compose.go +++ b/internal/client/compose.go @@ -105,6 +105,20 @@ func GetComposesTypesV0(socket *http.Client) ([]weldr.ComposeTypeV0, *APIRespons return composeTypes.Types, nil, nil } +// CancelComposeV0 cancels one composes based on the uuid +func CancelComposeV0(socket *http.Client, uuid string) (weldr.CancelComposeStatusV0, *APIResponse, error) { + body, resp, err := DeleteRaw(socket, "/api/v0/compose/cancel/"+uuid) + if resp != nil || err != nil { + return weldr.CancelComposeStatusV0{}, resp, err + } + var status weldr.CancelComposeStatusV0 + err = json.Unmarshal(body, &status) + if err != nil { + return weldr.CancelComposeStatusV0{}, nil, err + } + return status, nil, nil +} + // DeleteComposeV0 deletes one or more composes based on their uuid func DeleteComposeV0(socket *http.Client, uuids string) (weldr.DeleteComposeResponseV0, *APIResponse, error) { body, resp, err := DeleteRaw(socket, "/api/v0/compose/delete/"+uuids) diff --git a/internal/client/compose_test.go b/internal/client/compose_test.go index 8d8ab7374..fb224eb47 100644 --- a/internal/client/compose_test.go +++ b/internal/client/compose_test.go @@ -13,6 +13,8 @@ // * image download // * log download // * logs archive download +// * cancel waiting compose +// * cancel running compose // // In addition osbuild-composer has not implemented: // @@ -121,7 +123,16 @@ func TestComposeInvalidCharsBlueprintV0(t *testing.T) { } // Test compose cancel for unknown uuid fails -// Is cancel implemented at all? +func TestCancelUnknownComposeV0(t *testing.T) { + status, resp, err := CancelComposeV0(testState.socket, "c91818f9-8025-47af-89d2-f030d7000c2c") + require.NoError(t, err, "failed with a client error") + assert.Equal(t, weldr.CancelComposeStatusV0{}, status) + require.NotNil(t, resp) + require.False(t, resp.Status, "Cancel did not fail") + require.Equal(t, 1, len(resp.Errors), "%#v", resp) + require.Equal(t, "UnknownUUID", resp.Errors[0].ID) + require.Contains(t, resp.Errors[0].Msg, "c91818f9-8025-47af-89d2-f030d7000c2c") +} // Test compose delete for unknown uuid func TestDeleteUnknownComposeV0(t *testing.T) { @@ -149,9 +160,6 @@ func TestUnknownComposeInfoV0(t *testing.T) { // Test compose metadata for unknown uuid // TODO osbuild-composer has not implemented compose/metadata yet -// Test compose results for unknown uuid -// TODO osbuild-composer has not implemented compose/results yet - // Test compose image for unknown uuid func TestComposeInvalidImageV0(t *testing.T) { resp, err := WriteComposeImageV0(testState.socket, ioutil.Discard, "c91818f9-8025-47af-89d2-f030d7000c2c") @@ -355,6 +363,16 @@ func TestFailedComposeV0(t *testing.T) { resp, err = WriteComposeResultsV0(testState.socket, ioutil.Discard, buildID.String()) require.NoError(t, err, "failed with a client error") require.Nil(t, resp) + + // Test canceling the failed compose + cancelStatus, resp, err := CancelComposeV0(testState.socket, buildID.String()) + require.NoError(t, err, "failed with a client error") + assert.Equal(t, weldr.CancelComposeStatusV0{}, cancelStatus) + require.NotNil(t, resp) + require.False(t, resp.Status, "Cancel did not fail") + require.Equal(t, 1, len(resp.Errors), "%#v", resp) + require.Equal(t, "BuildInWrongState", resp.Errors[0].ID) + require.Contains(t, resp.Errors[0].Msg, buildID.String()) } // Setup and run the finished compose tests @@ -450,6 +468,16 @@ func TestFinishedComposeV0(t *testing.T) { resp, err = WriteComposeResultsV0(testState.socket, ioutil.Discard, buildID.String()) require.NoError(t, err, "failed with a client error") require.Nil(t, resp) + + // Test canceling the finished compose + cancelStatus, resp, err := CancelComposeV0(testState.socket, buildID.String()) + require.NoError(t, err, "failed with a client error") + assert.Equal(t, weldr.CancelComposeStatusV0{}, cancelStatus) + require.NotNil(t, resp) + require.False(t, resp.Status, "Cancel did not fail") + require.Equal(t, 1, len(resp.Errors), "%#v", resp) + require.Equal(t, "BuildInWrongState", resp.Errors[0].ID) + require.Contains(t, resp.Errors[0].Msg, buildID.String()) } func TestComposeSupportedMountPointV0(t *testing.T) {