github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/manager/controlapi/extension_test.go (about) 1 package controlapi 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 "google.golang.org/grpc/codes" 9 10 "github.com/docker/swarmkit/api" 11 "github.com/docker/swarmkit/manager/state/store" 12 "github.com/docker/swarmkit/testutils" 13 ) 14 15 func TestCreateExtension(t *testing.T) { 16 ts := newTestServer(t) 17 defer ts.Stop() 18 19 // ---- CreateExtensionRequest with no Annotations fails ---- 20 _, err := ts.Client.CreateExtension(context.Background(), &api.CreateExtensionRequest{}) 21 assert.Error(t, err) 22 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 23 24 // --- With no name also fails 25 _, err = ts.Client.CreateExtension(context.Background(), 26 &api.CreateExtensionRequest{ 27 Annotations: &api.Annotations{ 28 Name: "", 29 Labels: map[string]string{"foo": "bar"}, 30 }, 31 }, 32 ) 33 assert.Error(t, err) 34 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 35 36 extensionName := "extension1" 37 // ---- creating an extension with a valid extension object passed in succeeds ---- 38 validRequest := api.CreateExtensionRequest{Annotations: &api.Annotations{Name: extensionName}} 39 40 resp, err := ts.Client.CreateExtension(context.Background(), &validRequest) 41 assert.NoError(t, err) 42 assert.NotNil(t, resp) 43 44 // for sanity, check that the stored extension still has the extension data 45 var storedExtension *api.Extension 46 ts.Store.View(func(tx store.ReadTx) { 47 storedExtension = store.GetExtension(tx, resp.Extension.ID) 48 }) 49 assert.NotNil(t, storedExtension) 50 assert.Equal(t, extensionName, storedExtension.Annotations.Name) 51 52 // ---- creating an extension with the same name, even if it's the exact same spec, fails due to a name conflict ---- 53 _, err = ts.Client.CreateExtension(context.Background(), &validRequest) 54 assert.Error(t, err) 55 assert.Equal(t, codes.AlreadyExists, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 56 57 // creating an extension with an empty string as a name fails 58 hasNoName := api.CreateExtensionRequest{ 59 Annotations: &api.Annotations{ 60 Labels: map[string]string{"name": "nope"}, 61 }, 62 Description: "some text", 63 } 64 _, err = ts.Client.CreateExtension( 65 context.Background(), &hasNoName, 66 ) 67 assert.Error(t, err) 68 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 69 } 70 71 func TestGetExtension(t *testing.T) { 72 ts := newTestServer(t) 73 defer ts.Stop() 74 75 // ---- getting an extension without providing an ID results in an InvalidArgument ---- 76 _, err := ts.Client.GetExtension(context.Background(), &api.GetExtensionRequest{}) 77 assert.Error(t, err) 78 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 79 80 // ---- getting a non-existent extension fails with NotFound ---- 81 _, err = ts.Client.GetExtension(context.Background(), &api.GetExtensionRequest{ExtensionID: "12345"}) 82 assert.Error(t, err) 83 assert.Equal(t, codes.NotFound, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 84 85 // ---- getting an existing extension returns the extension ---- 86 extensionName := "extension1" 87 validRequest := api.CreateExtensionRequest{Annotations: &api.Annotations{Name: extensionName}} 88 resp, err := ts.Client.CreateExtension(context.Background(), &validRequest) 89 assert.NoError(t, err) 90 assert.NotNil(t, resp) 91 92 resp1, err := ts.Client.GetExtension(context.Background(), &api.GetExtensionRequest{ExtensionID: resp.Extension.ID}) 93 assert.NoError(t, err) 94 assert.NotNil(t, resp1) 95 assert.NotNil(t, resp1) 96 assert.Equal(t, validRequest.Annotations.Name, resp1.Extension.Annotations.Name) 97 } 98 99 // Test removing an extension that has no resources of that kind present. 100 func TestRemoveUnreferencedExtension(t *testing.T) { 101 ts := newTestServer(t) 102 defer ts.Stop() 103 104 // removing an extension without providing an ID results in an InvalidArgument 105 _, err := ts.Client.RemoveExtension(context.Background(), &api.RemoveExtensionRequest{}) 106 assert.Error(t, err) 107 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 108 109 // removing an extension that exists succeeds 110 extensionName := "extension1" 111 validRequest := api.CreateExtensionRequest{Annotations: &api.Annotations{Name: extensionName}} 112 resp, err := ts.Client.CreateExtension(context.Background(), &validRequest) 113 assert.NoError(t, err) 114 assert.NotNil(t, resp) 115 116 resp1, err := ts.Client.RemoveExtension(context.Background(), &api.RemoveExtensionRequest{ExtensionID: resp.Extension.ID}) 117 assert.NoError(t, err) 118 assert.Equal(t, api.RemoveExtensionResponse{}, *resp1) 119 120 // ---- verify the extension was really removed because attempting to remove it again fails with a NotFound ---- 121 _, err = ts.Client.RemoveExtension(context.Background(), &api.RemoveExtensionRequest{ExtensionID: resp.Extension.ID}) 122 assert.Error(t, err) 123 assert.Equal(t, codes.NotFound, testutils.ErrorCode(err), testutils.ErrorDesc(err)) 124 125 } 126 127 // Test removing an extension that has resources of that kind present. 128 func TestRemoveReferencedExtension(t *testing.T) { 129 // TDB after resource APIs are implemented 130 }