From 48c4a7e7d4559a2c86f5afc30627e4729e819658 Mon Sep 17 00:00:00 2001 From: Felix Gateru Date: Tue, 3 Sep 2024 17:50:28 +0300 Subject: [PATCH] MG-2264 - Split Auth Client into Separate Clients for AuthN/AuthZ and Policy CRUD (#2392) Signed-off-by: 1998-felix --- .github/workflows/check-generated-files.yml | 4 + .github/workflows/tests.yml | 16 +- api/openapi/auth.yml | 1 + api/openapi/bootstrap.yml | 1 + api/openapi/certs.yml | 1 + api/openapi/http.yml | 1 + api/openapi/invitations.yml | 1 + api/openapi/journal.yml | 1 + api/openapi/notifiers.yml | 1 + api/openapi/provision.yml | 1 + api/openapi/readers.yml | 1 + api/openapi/things.yml | 5 +- api/openapi/twins.yml | 1 + api/openapi/users.yml | 3 +- auth.pb.go | 101 +- auth.proto | 16 +- auth/api/grpc/client.go | 304 +++--- auth/api/grpc/endpoint_test.go | 38 +- auth/api/grpc/server.go | 167 +-- auth/mocks/auth_client.go | 1092 +------------------ auth/mocks/policy_client.go | 932 ++++++++++++++++ auth_grpc.pb.go | 563 +++++----- bootstrap/events/producer/streams_test.go | 159 +-- bootstrap/service.go | 11 +- bootstrap/service_test.go | 123 ++- certs/service.go | 4 +- certs/service_test.go | 4 +- cmd/auth/main.go | 4 +- cmd/bootstrap/main.go | 28 +- cmd/certs/main.go | 14 +- cmd/coap/main.go | 28 +- cmd/http/main.go | 28 +- cmd/invitations/main.go | 15 +- cmd/journal/main.go | 19 +- cmd/mqtt/main.go | 22 +- cmd/postgres-reader/main.go | 38 +- cmd/postgres-writer/main.go | 2 +- cmd/things/main.go | 42 +- cmd/timescale-reader/main.go | 38 +- cmd/timescale-writer/main.go | 2 +- cmd/users/main.go | 38 +- cmd/ws/main.go | 34 +- coap/adapter.go | 12 +- consumers/notifiers/service.go | 4 +- consumers/notifiers/service_test.go | 24 +- http/api/endpoint_test.go | 14 +- http/handler.go | 8 +- internal/groups/service.go | 41 +- internal/groups/service_test.go | 227 ++-- invitations/service.go | 5 +- invitations/service_test.go | 10 +- journal/service.go | 5 +- journal/service_test.go | 4 +- mqtt/handler.go | 8 +- mqtt/handler_test.go | 16 +- pkg/auth/client.go | 60 - pkg/grpcclient/client.go | 82 ++ pkg/{auth => grpcclient}/client_test.go | 80 +- pkg/{auth => grpcclient}/connect.go | 2 +- pkg/{auth => grpcclient}/connect_test.go | 2 +- pkg/{auth => grpcclient}/doc.go | 2 +- pkg/sdk/go/message_test.go | 10 +- readers/api/endpoint.go | 4 +- readers/api/endpoint_test.go | 12 +- readers/api/transport.go | 10 +- things/mocks/auth.go | 33 - things/mocks/authz_client.go | 118 ++ things/service.go | 27 +- things/service_test.go | 79 +- things/standalone/standalone.go | 59 +- tools/config/mockery.yaml | 11 +- users/delete_handler.go | 8 +- users/service.go | 19 +- users/service_test.go | 65 +- ws/adapter.go | 8 +- ws/adapter_test.go | 12 +- ws/api/endpoint_test.go | 18 +- ws/handler.go | 10 +- 78 files changed, 2646 insertions(+), 2367 deletions(-) create mode 100644 auth/mocks/policy_client.go delete mode 100644 pkg/auth/client.go create mode 100644 pkg/grpcclient/client.go rename pkg/{auth => grpcclient}/client_test.go (56%) rename pkg/{auth => grpcclient}/connect.go (99%) rename pkg/{auth => grpcclient}/connect_test.go (99%) rename pkg/{auth => grpcclient}/doc.go (90%) delete mode 100644 things/mocks/auth.go create mode 100644 things/mocks/authz_client.go diff --git a/.github/workflows/check-generated-files.yml b/.github/workflows/check-generated-files.yml index 4f47ac14fc..ef9b299426 100644 --- a/.github/workflows/check-generated-files.yml +++ b/.github/workflows/check-generated-files.yml @@ -154,6 +154,8 @@ jobs: mv ./journal/mocks/repository.go ./journal/mocks/repository.go.tmp mv ./journal/mocks/service.go ./journal/mocks/service.go.tmp mv ./auth/mocks/auth_client.go ./auth/mocks/auth_client.go.tmp + mv ./auth/mocks/policy_client.go ./auth/mocks/policy_client.go.tmp + mv ./things/mocks/authz_client.go ./things/mocks/authz_client.go.tmp make mocks @@ -203,3 +205,5 @@ jobs: check_mock_changes ./journal/mocks/repository.go "Journal Repository ./journal/mocks/repository.go" check_mock_changes ./journal/mocks/service.go "Journal Service ./journal/mocks/service.go" check_mock_changes ./auth/mocks/auth_client.go "Auth Service Client ./auth/mocks/auth_client.go" + check_mock_changes ./auth/mocks/policy_client.go "Policy Service Client ./auth/mocks/policy_client.go" + check_mock_changes ./things/mocks/authz_client.go "Authz Service Client things/mocks/authz_client.go" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 70504d41d9..704572f5fc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -160,9 +160,6 @@ jobs: - "logger/**" - "pkg/events/**" - pkg-auth: - - "pkg/auth/**" - pkg-clients: - "pkg/clients/**" @@ -173,6 +170,9 @@ jobs: - "pkg/events/**" - "pkg/messaging/**" + pkg-grpcclient: + - "pkg/grpcclient/**" + pkg-messaging: - "pkg/messaging/**" @@ -314,11 +314,6 @@ jobs: run: | go test --race -v -count=1 -coverprofile=coverage/mqtt.out ./mqtt/... - - name: Run pkg auth tests - if: steps.changes.outputs.pkg-auth == 'true' || steps.changes.outputs.workflow == 'true' - run: | - go test --race -v -count=1 -coverprofile=coverage/pkg-auth.out ./pkg/auth/... - - name: Run pkg clients tests if: steps.changes.outputs.pkg-clients == 'true' || steps.changes.outputs.workflow == 'true' run: | @@ -334,6 +329,11 @@ jobs: run: | go test --race -v -count=1 -coverprofile=coverage/pkg-events.out ./pkg/events/... + - name: Run pkg grpcclient tests + if: steps.changes.outputs.pkg-grpcclient == 'true' || steps.changes.outputs.workflow == 'true' + run: | + go test --race -v -count=1 -coverprofile=coverage/pkg-grpcclient.out ./pkg/grpcclient/... + - name: Run pkg messaging tests if: steps.changes.outputs.pkg-messaging == 'true' || steps.changes.outputs.workflow == 'true' run: | diff --git a/api/openapi/auth.yml b/api/openapi/auth.yml index 01112ff13b..5c1c3dca75 100644 --- a/api/openapi/auth.yml +++ b/api/openapi/auth.yml @@ -466,6 +466,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/bootstrap.yml b/api/openapi/bootstrap.yml index e75a69d917..f8bed71225 100644 --- a/api/openapi/bootstrap.yml +++ b/api/openapi/bootstrap.yml @@ -306,6 +306,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/certs.yml b/api/openapi/certs.yml index 7847b98330..9e41397f73 100644 --- a/api/openapi/certs.yml +++ b/api/openapi/certs.yml @@ -131,6 +131,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/http.yml b/api/openapi/http.yml index f484c20d1e..f366458bdf 100644 --- a/api/openapi/http.yml +++ b/api/openapi/http.yml @@ -57,6 +57,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/invitations.yml b/api/openapi/invitations.yml index dd84d3f004..069b1564e4 100644 --- a/api/openapi/invitations.yml +++ b/api/openapi/invitations.yml @@ -171,6 +171,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/journal.yml b/api/openapi/journal.yml index ac55dba0db..1652227449 100644 --- a/api/openapi/journal.yml +++ b/api/openapi/journal.yml @@ -71,6 +71,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/notifiers.yml b/api/openapi/notifiers.yml index 6a4c099d65..62a681eaaa 100644 --- a/api/openapi/notifiers.yml +++ b/api/openapi/notifiers.yml @@ -131,6 +131,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/provision.yml b/api/openapi/provision.yml index 888df2fa40..35b91766b3 100644 --- a/api/openapi/provision.yml +++ b/api/openapi/provision.yml @@ -71,6 +71,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/readers.yml b/api/openapi/readers.yml index e82de3fb1b..3ffdf7f8b1 100644 --- a/api/openapi/readers.yml +++ b/api/openapi/readers.yml @@ -75,6 +75,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/things.yml b/api/openapi/things.yml index 8deae43c9b..a01f63d047 100644 --- a/api/openapi/things.yml +++ b/api/openapi/things.yml @@ -453,7 +453,7 @@ paths: "403": description: Failed to perform authorization over the entity. "404": - descripttion: A non-existent entity request. + description: A non-existent entity request. "409": description: Failed due to using an existing identity. "415": @@ -577,7 +577,7 @@ paths: "403": description: Unauthorized access to thing id. "404": - descripttion: A non-existent entity request. + description: A non-existent entity request. "500": $ref: "#/components/responses/ServiceError" @@ -967,6 +967,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/twins.yml b/api/openapi/twins.yml index f582958396..36261f5ff2 100644 --- a/api/openapi/twins.yml +++ b/api/openapi/twins.yml @@ -180,6 +180,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/api/openapi/users.yml b/api/openapi/users.yml index d2407ef964..170aee6fa7 100644 --- a/api/openapi/users.yml +++ b/api/openapi/users.yml @@ -397,7 +397,7 @@ paths: "500": $ref: "#/components/responses/ServiceError" - /users/search: + /users/search: get: operationId: searchUsers summary: Search users @@ -1062,6 +1062,7 @@ paths: summary: Retrieves service health check info. tags: - health + security: [] responses: "200": $ref: "#/components/responses/HealthRes" diff --git a/auth.pb.go b/auth.pb.go index 6c072e2033..617dddae0a 100644 --- a/auth.pb.go +++ b/auth.pb.go @@ -2256,23 +2256,20 @@ var file_auth_proto_rawDesc = []byte{ 0x72, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x32, 0xac, 0x09, 0x0a, 0x0b, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x49, 0x73, - 0x73, 0x75, 0x65, 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, - 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x61, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x00, 0x12, 0x36, - 0x0a, 0x07, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x16, 0x2e, 0x6d, 0x61, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x79, 0x12, 0x17, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d, 0x61, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x65, 0x12, 0x18, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, - 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x09, 0x41, 0x64, 0x64, + 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x32, 0xba, 0x01, 0x0a, 0x0c, 0x41, + 0x75, 0x74, 0x68, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x49, + 0x73, 0x73, 0x75, 0x65, 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, + 0x61, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x61, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x00, 0x12, + 0x36, 0x0a, 0x07, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x16, 0x2e, 0x6d, 0x61, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x79, 0x12, 0x17, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, + 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d, + 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x73, 0x22, 0x00, 0x32, 0xbf, 0x07, 0x0a, 0x0d, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x6d, 0x61, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x61, 0x2e, 0x41, 0x64, @@ -2381,41 +2378,39 @@ var file_auth_proto_depIdxs = []int32{ 7, // 0: magistrala.AddPoliciesReq.addPoliciesReq:type_name -> magistrala.AddPolicyReq 13, // 1: magistrala.DeletePoliciesReq.deletePoliciesReq:type_name -> magistrala.DeletePolicyReq 5, // 2: magistrala.AuthzService.Authorize:input_type -> magistrala.AuthorizeReq - 3, // 3: magistrala.AuthService.Issue:input_type -> magistrala.IssueReq - 4, // 4: magistrala.AuthService.Refresh:input_type -> magistrala.RefreshReq - 1, // 5: magistrala.AuthService.Identify:input_type -> magistrala.IdentityReq - 5, // 6: magistrala.AuthService.Authorize:input_type -> magistrala.AuthorizeReq - 7, // 7: magistrala.AuthService.AddPolicy:input_type -> magistrala.AddPolicyReq - 8, // 8: magistrala.AuthService.AddPolicies:input_type -> magistrala.AddPoliciesReq - 11, // 9: magistrala.AuthService.DeletePolicyFilter:input_type -> magistrala.DeletePolicyFilterReq - 12, // 10: magistrala.AuthService.DeletePolicies:input_type -> magistrala.DeletePoliciesReq - 15, // 11: magistrala.AuthService.ListObjects:input_type -> magistrala.ListObjectsReq - 15, // 12: magistrala.AuthService.ListAllObjects:input_type -> magistrala.ListObjectsReq - 17, // 13: magistrala.AuthService.CountObjects:input_type -> magistrala.CountObjectsReq - 19, // 14: magistrala.AuthService.ListSubjects:input_type -> magistrala.ListSubjectsReq - 19, // 15: magistrala.AuthService.ListAllSubjects:input_type -> magistrala.ListSubjectsReq - 21, // 16: magistrala.AuthService.CountSubjects:input_type -> magistrala.CountSubjectsReq - 23, // 17: magistrala.AuthService.ListPermissions:input_type -> magistrala.ListPermissionsReq - 25, // 18: magistrala.AuthService.DeleteEntityPolicies:input_type -> magistrala.DeleteEntityPoliciesReq - 6, // 19: magistrala.AuthzService.Authorize:output_type -> magistrala.AuthorizeRes - 0, // 20: magistrala.AuthService.Issue:output_type -> magistrala.Token - 0, // 21: magistrala.AuthService.Refresh:output_type -> magistrala.Token - 2, // 22: magistrala.AuthService.Identify:output_type -> magistrala.IdentityRes - 6, // 23: magistrala.AuthService.Authorize:output_type -> magistrala.AuthorizeRes - 9, // 24: magistrala.AuthService.AddPolicy:output_type -> magistrala.AddPolicyRes - 10, // 25: magistrala.AuthService.AddPolicies:output_type -> magistrala.AddPoliciesRes - 14, // 26: magistrala.AuthService.DeletePolicyFilter:output_type -> magistrala.DeletePolicyRes - 14, // 27: magistrala.AuthService.DeletePolicies:output_type -> magistrala.DeletePolicyRes - 16, // 28: magistrala.AuthService.ListObjects:output_type -> magistrala.ListObjectsRes - 16, // 29: magistrala.AuthService.ListAllObjects:output_type -> magistrala.ListObjectsRes - 18, // 30: magistrala.AuthService.CountObjects:output_type -> magistrala.CountObjectsRes - 20, // 31: magistrala.AuthService.ListSubjects:output_type -> magistrala.ListSubjectsRes - 20, // 32: magistrala.AuthService.ListAllSubjects:output_type -> magistrala.ListSubjectsRes - 22, // 33: magistrala.AuthService.CountSubjects:output_type -> magistrala.CountSubjectsRes - 24, // 34: magistrala.AuthService.ListPermissions:output_type -> magistrala.ListPermissionsRes - 14, // 35: magistrala.AuthService.DeleteEntityPolicies:output_type -> magistrala.DeletePolicyRes - 19, // [19:36] is the sub-list for method output_type - 2, // [2:19] is the sub-list for method input_type + 3, // 3: magistrala.AuthnService.Issue:input_type -> magistrala.IssueReq + 4, // 4: magistrala.AuthnService.Refresh:input_type -> magistrala.RefreshReq + 1, // 5: magistrala.AuthnService.Identify:input_type -> magistrala.IdentityReq + 7, // 6: magistrala.PolicyService.AddPolicy:input_type -> magistrala.AddPolicyReq + 8, // 7: magistrala.PolicyService.AddPolicies:input_type -> magistrala.AddPoliciesReq + 11, // 8: magistrala.PolicyService.DeletePolicyFilter:input_type -> magistrala.DeletePolicyFilterReq + 12, // 9: magistrala.PolicyService.DeletePolicies:input_type -> magistrala.DeletePoliciesReq + 15, // 10: magistrala.PolicyService.ListObjects:input_type -> magistrala.ListObjectsReq + 15, // 11: magistrala.PolicyService.ListAllObjects:input_type -> magistrala.ListObjectsReq + 17, // 12: magistrala.PolicyService.CountObjects:input_type -> magistrala.CountObjectsReq + 19, // 13: magistrala.PolicyService.ListSubjects:input_type -> magistrala.ListSubjectsReq + 19, // 14: magistrala.PolicyService.ListAllSubjects:input_type -> magistrala.ListSubjectsReq + 21, // 15: magistrala.PolicyService.CountSubjects:input_type -> magistrala.CountSubjectsReq + 23, // 16: magistrala.PolicyService.ListPermissions:input_type -> magistrala.ListPermissionsReq + 25, // 17: magistrala.PolicyService.DeleteEntityPolicies:input_type -> magistrala.DeleteEntityPoliciesReq + 6, // 18: magistrala.AuthzService.Authorize:output_type -> magistrala.AuthorizeRes + 0, // 19: magistrala.AuthnService.Issue:output_type -> magistrala.Token + 0, // 20: magistrala.AuthnService.Refresh:output_type -> magistrala.Token + 2, // 21: magistrala.AuthnService.Identify:output_type -> magistrala.IdentityRes + 9, // 22: magistrala.PolicyService.AddPolicy:output_type -> magistrala.AddPolicyRes + 10, // 23: magistrala.PolicyService.AddPolicies:output_type -> magistrala.AddPoliciesRes + 14, // 24: magistrala.PolicyService.DeletePolicyFilter:output_type -> magistrala.DeletePolicyRes + 14, // 25: magistrala.PolicyService.DeletePolicies:output_type -> magistrala.DeletePolicyRes + 16, // 26: magistrala.PolicyService.ListObjects:output_type -> magistrala.ListObjectsRes + 16, // 27: magistrala.PolicyService.ListAllObjects:output_type -> magistrala.ListObjectsRes + 18, // 28: magistrala.PolicyService.CountObjects:output_type -> magistrala.CountObjectsRes + 20, // 29: magistrala.PolicyService.ListSubjects:output_type -> magistrala.ListSubjectsRes + 20, // 30: magistrala.PolicyService.ListAllSubjects:output_type -> magistrala.ListSubjectsRes + 22, // 31: magistrala.PolicyService.CountSubjects:output_type -> magistrala.CountSubjectsRes + 24, // 32: magistrala.PolicyService.ListPermissions:output_type -> magistrala.ListPermissionsRes + 14, // 33: magistrala.PolicyService.DeleteEntityPolicies:output_type -> magistrala.DeletePolicyRes + 18, // [18:34] is the sub-list for method output_type + 2, // [2:18] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name @@ -2751,7 +2746,7 @@ func file_auth_proto_init() { NumEnums: 0, NumMessages: 26, NumExtensions: 0, - NumServices: 2, + NumServices: 3, }, GoTypes: file_auth_proto_goTypes, DependencyIndexes: file_auth_proto_depIdxs, diff --git a/auth.proto b/auth.proto index 9f937cba8e..fb034ab81c 100644 --- a/auth.proto +++ b/auth.proto @@ -6,21 +6,25 @@ syntax = "proto3"; package magistrala; option go_package = "./magistrala"; -// AuthzService is a service that provides authentication and authorization -// functionalities for the things service. +// AuthzService is a service that provides authorization functionalities +// for magistrala services. service AuthzService { // Authorize checks if the subject is authorized to perform // the action on the object. rpc Authorize(AuthorizeReq) returns (AuthorizeRes) {} } -// AuthService is a service that provides authentication and authorization -// functionalities for the users service. -service AuthService { +// AuthnService is a service that provides authentication functionalities +// for magistrala services. +service AuthnService { rpc Issue(IssueReq) returns (Token) {} rpc Refresh(RefreshReq) returns (Token) {} rpc Identify(IdentityReq) returns (IdentityRes) {} - rpc Authorize(AuthorizeReq) returns (AuthorizeRes) {} +} + +// PolicyService is a service that provides policy CRUD +// functionalities for magistrala services. +service PolicyService { rpc AddPolicy(AddPolicyReq) returns (AddPolicyRes) {} rpc AddPolicies(AddPoliciesReq) returns (AddPoliciesRes) {} rpc DeletePolicyFilter(DeletePolicyFilterReq) returns (DeletePolicyRes) {} diff --git a/auth/api/grpc/client.go b/auth/api/grpc/client.go index c81d605c88..2d193c3ed3 100644 --- a/auth/api/grpc/client.go +++ b/auth/api/grpc/client.go @@ -19,36 +19,37 @@ import ( "google.golang.org/grpc/status" ) -const svcName = "magistrala.AuthService" +const ( + authzSvcName = "magistrala.AuthzService" + authnSvcName = "magistrala.AuthnService" + policySvcName = "magistrala.PolicyService" +) -var _ magistrala.AuthServiceClient = (*grpcClient)(nil) +var ( + _ AuthServiceClient = (*authGrpcClient)(nil) + _ magistrala.PolicyServiceClient = (*policyGrpcClient)(nil) +) -type grpcClient struct { - issue endpoint.Endpoint - refresh endpoint.Endpoint - identify endpoint.Endpoint - authorize endpoint.Endpoint - addPolicy endpoint.Endpoint - addPolicies endpoint.Endpoint - deletePolicyFilter endpoint.Endpoint - deletePolicies endpoint.Endpoint - listObjects endpoint.Endpoint - listAllObjects endpoint.Endpoint - countObjects endpoint.Endpoint - listSubjects endpoint.Endpoint - listAllSubjects endpoint.Endpoint - countSubjects endpoint.Endpoint - listPermissions endpoint.Endpoint - deleteEntityPolicies endpoint.Endpoint - timeout time.Duration +//go:generate mockery --name AuthServiceClient --output=../../mocks --filename auth_client.go --quiet --note "Copyright (c) Abstract Machines" +type AuthServiceClient interface { + magistrala.AuthzServiceClient + magistrala.AuthnServiceClient +} + +type authGrpcClient struct { + issue endpoint.Endpoint + refresh endpoint.Endpoint + identify endpoint.Endpoint + authorize endpoint.Endpoint + timeout time.Duration } -// NewClient returns new gRPC client instance. -func NewClient(conn *grpc.ClientConn, timeout time.Duration) magistrala.AuthServiceClient { - return &grpcClient{ +// NewAuthClient returns new auth gRPC client instance. +func NewAuthClient(conn *grpc.ClientConn, timeout time.Duration) AuthServiceClient { + return &authGrpcClient{ issue: kitgrpc.NewClient( conn, - svcName, + authnSvcName, "Issue", encodeIssueRequest, decodeIssueResponse, @@ -56,7 +57,7 @@ func NewClient(conn *grpc.ClientConn, timeout time.Duration) magistrala.AuthServ ).Endpoint(), refresh: kitgrpc.NewClient( conn, - svcName, + authnSvcName, "Refresh", encodeRefreshRequest, decodeRefreshResponse, @@ -64,7 +65,7 @@ func NewClient(conn *grpc.ClientConn, timeout time.Duration) magistrala.AuthServ ).Endpoint(), identify: kitgrpc.NewClient( conn, - svcName, + authnSvcName, "Identify", encodeIdentifyRequest, decodeIdentifyResponse, @@ -72,114 +73,17 @@ func NewClient(conn *grpc.ClientConn, timeout time.Duration) magistrala.AuthServ ).Endpoint(), authorize: kitgrpc.NewClient( conn, - svcName, + authzSvcName, "Authorize", encodeAuthorizeRequest, decodeAuthorizeResponse, magistrala.AuthorizeRes{}, ).Endpoint(), - addPolicy: kitgrpc.NewClient( - conn, - svcName, - "AddPolicy", - encodeAddPolicyRequest, - decodeAddPolicyResponse, - magistrala.AddPolicyRes{}, - ).Endpoint(), - addPolicies: kitgrpc.NewClient( - conn, - svcName, - "AddPolicies", - encodeAddPoliciesRequest, - decodeAddPoliciesResponse, - magistrala.AddPoliciesRes{}, - ).Endpoint(), - deletePolicyFilter: kitgrpc.NewClient( - conn, - svcName, - "DeletePolicyFilter", - encodeDeletePolicyFilterRequest, - decodeDeletePolicyFilterResponse, - magistrala.DeletePolicyRes{}, - ).Endpoint(), - deletePolicies: kitgrpc.NewClient( - conn, - svcName, - "DeletePolicies", - encodeDeletePoliciesRequest, - decodeDeletePoliciesResponse, - magistrala.DeletePolicyRes{}, - ).Endpoint(), - listObjects: kitgrpc.NewClient( - conn, - svcName, - "ListObjects", - encodeListObjectsRequest, - decodeListObjectsResponse, - magistrala.ListObjectsRes{}, - ).Endpoint(), - listAllObjects: kitgrpc.NewClient( - conn, - svcName, - "ListAllObjects", - encodeListObjectsRequest, - decodeListObjectsResponse, - magistrala.ListObjectsRes{}, - ).Endpoint(), - countObjects: kitgrpc.NewClient( - conn, - svcName, - "CountObjects", - encodeCountObjectsRequest, - decodeCountObjectsResponse, - magistrala.CountObjectsRes{}, - ).Endpoint(), - listSubjects: kitgrpc.NewClient( - conn, - svcName, - "ListSubjects", - encodeListSubjectsRequest, - decodeListSubjectsResponse, - magistrala.ListSubjectsRes{}, - ).Endpoint(), - listAllSubjects: kitgrpc.NewClient( - conn, - svcName, - "ListAllSubjects", - encodeListSubjectsRequest, - decodeListSubjectsResponse, - magistrala.ListSubjectsRes{}, - ).Endpoint(), - countSubjects: kitgrpc.NewClient( - conn, - svcName, - "CountSubjects", - encodeCountSubjectsRequest, - decodeCountSubjectsResponse, - magistrala.CountSubjectsRes{}, - ).Endpoint(), - listPermissions: kitgrpc.NewClient( - conn, - svcName, - "ListPermissions", - encodeListPermissionsRequest, - decodeListPermissionsResponse, - magistrala.ListPermissionsRes{}, - ).Endpoint(), - deleteEntityPolicies: kitgrpc.NewClient( - conn, - svcName, - "DeleteEntityPolicies", - encodeDeleteEntityPoliciesRequest, - decodeDeleteEntityPoliciesResponse, - magistrala.DeletePolicyRes{}, - ).Endpoint(), - timeout: timeout, } } -func (client grpcClient) Issue(ctx context.Context, req *magistrala.IssueReq, _ ...grpc.CallOption) (*magistrala.Token, error) { +func (client authGrpcClient) Issue(ctx context.Context, req *magistrala.IssueReq, _ ...grpc.CallOption) (*magistrala.Token, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -207,7 +111,7 @@ func decodeIssueResponse(_ context.Context, grpcRes interface{}) (interface{}, e return grpcRes, nil } -func (client grpcClient) Refresh(ctx context.Context, req *magistrala.RefreshReq, _ ...grpc.CallOption) (*magistrala.Token, error) { +func (client authGrpcClient) Refresh(ctx context.Context, req *magistrala.RefreshReq, _ ...grpc.CallOption) (*magistrala.Token, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -227,7 +131,7 @@ func decodeRefreshResponse(_ context.Context, grpcRes interface{}) (interface{}, return grpcRes, nil } -func (client grpcClient) Identify(ctx context.Context, token *magistrala.IdentityReq, _ ...grpc.CallOption) (*magistrala.IdentityRes, error) { +func (client authGrpcClient) Identify(ctx context.Context, token *magistrala.IdentityReq, _ ...grpc.CallOption) (*magistrala.IdentityRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -249,7 +153,7 @@ func decodeIdentifyResponse(_ context.Context, grpcRes interface{}) (interface{} return identityRes{id: res.GetId(), userID: res.GetUserId(), domainID: res.GetDomainId()}, nil } -func (client grpcClient) Authorize(ctx context.Context, req *magistrala.AuthorizeReq, _ ...grpc.CallOption) (r *magistrala.AuthorizeRes, err error) { +func (client authGrpcClient) Authorize(ctx context.Context, req *magistrala.AuthorizeReq, _ ...grpc.CallOption) (r *magistrala.AuthorizeRes, err error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -290,7 +194,127 @@ func encodeAuthorizeRequest(_ context.Context, grpcReq interface{}) (interface{} }, nil } -func (client grpcClient) AddPolicy(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption) (*magistrala.AddPolicyRes, error) { +type policyGrpcClient struct { + addPolicy endpoint.Endpoint + addPolicies endpoint.Endpoint + deletePolicyFilter endpoint.Endpoint + deletePolicies endpoint.Endpoint + listObjects endpoint.Endpoint + listAllObjects endpoint.Endpoint + countObjects endpoint.Endpoint + listSubjects endpoint.Endpoint + listAllSubjects endpoint.Endpoint + countSubjects endpoint.Endpoint + listPermissions endpoint.Endpoint + deleteEntityPolicies endpoint.Endpoint + timeout time.Duration +} + +// NewPolicyClient returns new policy gRPC client instance. +func NewPolicyClient(conn *grpc.ClientConn, timeout time.Duration) magistrala.PolicyServiceClient { + return &policyGrpcClient{ + addPolicy: kitgrpc.NewClient( + conn, + policySvcName, + "AddPolicy", + encodeAddPolicyRequest, + decodeAddPolicyResponse, + magistrala.AddPolicyRes{}, + ).Endpoint(), + addPolicies: kitgrpc.NewClient( + conn, + policySvcName, + "AddPolicies", + encodeAddPoliciesRequest, + decodeAddPoliciesResponse, + magistrala.AddPoliciesRes{}, + ).Endpoint(), + deletePolicyFilter: kitgrpc.NewClient( + conn, + policySvcName, + "DeletePolicyFilter", + encodeDeletePolicyFilterRequest, + decodeDeletePolicyFilterResponse, + magistrala.DeletePolicyRes{}, + ).Endpoint(), + deletePolicies: kitgrpc.NewClient( + conn, + policySvcName, + "DeletePolicies", + encodeDeletePoliciesRequest, + decodeDeletePoliciesResponse, + magistrala.DeletePolicyRes{}, + ).Endpoint(), + listObjects: kitgrpc.NewClient( + conn, + policySvcName, + "ListObjects", + encodeListObjectsRequest, + decodeListObjectsResponse, + magistrala.ListObjectsRes{}, + ).Endpoint(), + listAllObjects: kitgrpc.NewClient( + conn, + policySvcName, + "ListAllObjects", + encodeListObjectsRequest, + decodeListObjectsResponse, + magistrala.ListObjectsRes{}, + ).Endpoint(), + countObjects: kitgrpc.NewClient( + conn, + policySvcName, + "CountObjects", + encodeCountObjectsRequest, + decodeCountObjectsResponse, + magistrala.CountObjectsRes{}, + ).Endpoint(), + listSubjects: kitgrpc.NewClient( + conn, + policySvcName, + "ListSubjects", + encodeListSubjectsRequest, + decodeListSubjectsResponse, + magistrala.ListSubjectsRes{}, + ).Endpoint(), + listAllSubjects: kitgrpc.NewClient( + conn, + policySvcName, + "ListAllSubjects", + encodeListSubjectsRequest, + decodeListSubjectsResponse, + magistrala.ListSubjectsRes{}, + ).Endpoint(), + countSubjects: kitgrpc.NewClient( + conn, + policySvcName, + "CountSubjects", + encodeCountSubjectsRequest, + decodeCountSubjectsResponse, + magistrala.CountSubjectsRes{}, + ).Endpoint(), + listPermissions: kitgrpc.NewClient( + conn, + policySvcName, + "ListPermissions", + encodeListPermissionsRequest, + decodeListPermissionsResponse, + magistrala.ListPermissionsRes{}, + ).Endpoint(), + deleteEntityPolicies: kitgrpc.NewClient( + conn, + policySvcName, + "DeleteEntityPolicies", + encodeDeleteEntityPoliciesRequest, + decodeDeleteEntityPoliciesResponse, + magistrala.DeletePolicyRes{}, + ).Endpoint(), + + timeout: timeout, + } +} + +func (client policyGrpcClient) AddPolicy(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption) (*magistrala.AddPolicyRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -333,7 +357,7 @@ func encodeAddPolicyRequest(_ context.Context, grpcReq interface{}) (interface{} }, nil } -func (client grpcClient) AddPolicies(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption) (*magistrala.AddPoliciesRes, error) { +func (client policyGrpcClient) AddPolicies(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption) (*magistrala.AddPoliciesRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() r := policiesReq{} @@ -388,7 +412,7 @@ func encodeAddPoliciesRequest(_ context.Context, grpcReq interface{}) (interface return &magistrala.AddPoliciesReq{AddPoliciesReq: addPolicies}, nil } -func (client grpcClient) DeletePolicyFilter(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { +func (client policyGrpcClient) DeletePolicyFilter(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -431,7 +455,7 @@ func encodeDeletePolicyFilterRequest(_ context.Context, grpcReq interface{}) (in }, nil } -func (client grpcClient) DeletePolicies(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { +func (client policyGrpcClient) DeletePolicies(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() r := policiesReq{} @@ -486,7 +510,7 @@ func encodeDeletePoliciesRequest(_ context.Context, grpcReq interface{}) (interf return &magistrala.DeletePoliciesReq{DeletePoliciesReq: deletePolicies}, nil } -func (client grpcClient) ListObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { +func (client policyGrpcClient) ListObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -525,7 +549,7 @@ func encodeListObjectsRequest(_ context.Context, grpcReq interface{}) (interface }, nil } -func (client grpcClient) ListAllObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { +func (client policyGrpcClient) ListAllObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -546,7 +570,7 @@ func (client grpcClient) ListAllObjects(ctx context.Context, in *magistrala.List return &magistrala.ListObjectsRes{Policies: lpr.policies}, nil } -func (client grpcClient) CountObjects(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption) (*magistrala.CountObjectsRes, error) { +func (client policyGrpcClient) CountObjects(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption) (*magistrala.CountObjectsRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -585,7 +609,7 @@ func encodeCountObjectsRequest(_ context.Context, grpcReq interface{}) (interfac }, nil } -func (client grpcClient) ListSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { +func (client policyGrpcClient) ListSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -625,7 +649,7 @@ func encodeListSubjectsRequest(_ context.Context, grpcReq interface{}) (interfac }, nil } -func (client grpcClient) ListAllSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { +func (client policyGrpcClient) ListAllSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -646,7 +670,7 @@ func (client grpcClient) ListAllSubjects(ctx context.Context, in *magistrala.Lis return &magistrala.ListSubjectsRes{Policies: lpr.policies}, nil } -func (client grpcClient) CountSubjects(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption) (*magistrala.CountSubjectsRes, error) { +func (client policyGrpcClient) CountSubjects(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption) (*magistrala.CountSubjectsRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -685,7 +709,7 @@ func encodeCountSubjectsRequest(_ context.Context, grpcReq interface{}) (interfa }, nil } -func (client grpcClient) ListPermissions(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption) (*magistrala.ListPermissionsRes, error) { +func (client policyGrpcClient) ListPermissions(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption) (*magistrala.ListPermissionsRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() @@ -739,7 +763,7 @@ func encodeListPermissionsRequest(_ context.Context, grpcReq interface{}) (inter }, nil } -func (client grpcClient) DeleteEntityPolicies(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { +func (client policyGrpcClient) DeleteEntityPolicies(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { ctx, cancel := context.WithTimeout(ctx, client.timeout) defer cancel() diff --git a/auth/api/grpc/endpoint_test.go b/auth/api/grpc/endpoint_test.go index 0221fbaf2f..381e5443e3 100644 --- a/auth/api/grpc/endpoint_test.go +++ b/auth/api/grpc/endpoint_test.go @@ -55,17 +55,19 @@ var ( func startGRPCServer(svc auth.Service, port int) { listener, _ := net.Listen("tcp", fmt.Sprintf(":%d", port)) server := grpc.NewServer() - magistrala.RegisterAuthServiceServer(server, grpcapi.NewServer(svc)) + magistrala.RegisterAuthzServiceServer(server, grpcapi.NewAuthzServer(svc)) + magistrala.RegisterAuthnServiceServer(server, grpcapi.NewAuthnServer(svc)) + magistrala.RegisterPolicyServiceServer(server, grpcapi.NewPolicyServer(svc)) go func() { err := server.Serve(listener) - assert.Nil(&testing.T{}, err, fmt.Sprintf(`"Unexpected error creating server %s"`, err)) + assert.Nil(&testing.T{}, err, fmt.Sprintf(`"Unexpected error creating auth server %s"`, err)) }() } func TestIssue(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewAuthClient(conn, time.Second) cases := []struct { desc string @@ -134,7 +136,7 @@ func TestIssue(t *testing.T) { func TestRefresh(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewAuthClient(conn, time.Second) cases := []struct { desc string @@ -180,7 +182,7 @@ func TestRefresh(t *testing.T) { func TestIdentify(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewAuthClient(conn, time.Second) cases := []struct { desc string @@ -224,7 +226,7 @@ func TestIdentify(t *testing.T) { func TestAuthorize(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewAuthClient(conn, time.Second) cases := []struct { desc string @@ -346,7 +348,7 @@ func TestAuthorize(t *testing.T) { func TestAddPolicy(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) groupAdminObj := "groupadmin" @@ -400,7 +402,7 @@ func TestAddPolicy(t *testing.T) { func TestAddPolicies(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) groupAdminObj := "groupadmin" @@ -462,7 +464,7 @@ func TestAddPolicies(t *testing.T) { func TestDeletePolicyFilter(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) readRelation := "read" thingID := "thing" @@ -515,7 +517,7 @@ func TestDeletePolicyFilter(t *testing.T) { func TestDeletePolicies(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) readRelation := "read" thingID := "thing" @@ -578,7 +580,7 @@ func TestDeletePolicies(t *testing.T) { func TestListObjects(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string @@ -628,7 +630,7 @@ func TestListObjects(t *testing.T) { func TestListAllObjects(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string @@ -678,7 +680,7 @@ func TestListAllObjects(t *testing.T) { func TestCountObects(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string @@ -728,7 +730,7 @@ func TestCountObects(t *testing.T) { func TestListSubjects(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string @@ -778,7 +780,7 @@ func TestListSubjects(t *testing.T) { func TestListAllSubjects(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf(`"Unexpected error creating client connection %s"`, err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string @@ -828,7 +830,7 @@ func TestListAllSubjects(t *testing.T) { func TestCountSubjects(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string @@ -883,7 +885,7 @@ func TestCountSubjects(t *testing.T) { func TestListPermissions(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string @@ -1014,7 +1016,7 @@ func TestListPermissions(t *testing.T) { func TestDeleteEntityPolicies(t *testing.T) { conn, err := grpc.NewClient(authAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) assert.Nil(t, err, fmt.Sprintf("Unexpected error creating client connection %s", err)) - client := grpcapi.NewClient(conn, time.Second) + client := grpcapi.NewPolicyClient(conn, time.Second) cases := []struct { desc string diff --git a/auth/api/grpc/server.go b/auth/api/grpc/server.go index 21e703d41b..89500bb4ba 100644 --- a/auth/api/grpc/server.go +++ b/auth/api/grpc/server.go @@ -16,31 +16,46 @@ import ( "google.golang.org/grpc/status" ) -var _ magistrala.AuthServiceServer = (*grpcServer)(nil) - -type grpcServer struct { - magistrala.UnimplementedAuthServiceServer - issue kitgrpc.Handler - refresh kitgrpc.Handler - identify kitgrpc.Handler - authorize kitgrpc.Handler - addPolicy kitgrpc.Handler - addPolicies kitgrpc.Handler - deletePolicyFilter kitgrpc.Handler - deletePolicies kitgrpc.Handler - listObjects kitgrpc.Handler - listAllObjects kitgrpc.Handler - countObjects kitgrpc.Handler - listSubjects kitgrpc.Handler - listAllSubjects kitgrpc.Handler - countSubjects kitgrpc.Handler - listPermissions kitgrpc.Handler - deleteEntityPolicies kitgrpc.Handler +var ( + _ magistrala.AuthzServiceServer = (*authzGrpcServer)(nil) + _ magistrala.AuthnServiceServer = (*authnGrpcServer)(nil) + _ magistrala.PolicyServiceServer = (*policyGrpcServer)(nil) +) + +type authzGrpcServer struct { + magistrala.UnimplementedAuthzServiceServer + authorize kitgrpc.Handler } -// NewServer returns new AuthServiceServer instance. -func NewServer(svc auth.Service) magistrala.AuthServiceServer { - return &grpcServer{ +// NewAuthzServer returns new AuthzServiceServer instance. +func NewAuthzServer(svc auth.Service) magistrala.AuthzServiceServer { + return &authzGrpcServer{ + authorize: kitgrpc.NewServer( + (authorizeEndpoint(svc)), + decodeAuthorizeRequest, + encodeAuthorizeResponse, + ), + } +} + +func (s *authzGrpcServer) Authorize(ctx context.Context, req *magistrala.AuthorizeReq) (*magistrala.AuthorizeRes, error) { + _, res, err := s.authorize.ServeGRPC(ctx, req) + if err != nil { + return nil, encodeError(err) + } + return res.(*magistrala.AuthorizeRes), nil +} + +type authnGrpcServer struct { + magistrala.UnimplementedAuthnServiceServer + issue kitgrpc.Handler + refresh kitgrpc.Handler + identify kitgrpc.Handler +} + +// NewAuthnServer returns new AuthnServiceServer instance. +func NewAuthnServer(svc auth.Service) magistrala.AuthnServiceServer { + return &authnGrpcServer{ issue: kitgrpc.NewServer( (issueEndpoint(svc)), decodeIssueRequest, @@ -56,11 +71,51 @@ func NewServer(svc auth.Service) magistrala.AuthServiceServer { decodeIdentifyRequest, encodeIdentifyResponse, ), - authorize: kitgrpc.NewServer( - (authorizeEndpoint(svc)), - decodeAuthorizeRequest, - encodeAuthorizeResponse, - ), + } +} + +func (s *authnGrpcServer) Issue(ctx context.Context, req *magistrala.IssueReq) (*magistrala.Token, error) { + _, res, err := s.issue.ServeGRPC(ctx, req) + if err != nil { + return nil, encodeError(err) + } + return res.(*magistrala.Token), nil +} + +func (s *authnGrpcServer) Refresh(ctx context.Context, req *magistrala.RefreshReq) (*magistrala.Token, error) { + _, res, err := s.refresh.ServeGRPC(ctx, req) + if err != nil { + return nil, encodeError(err) + } + return res.(*magistrala.Token), nil +} + +func (s *authnGrpcServer) Identify(ctx context.Context, token *magistrala.IdentityReq) (*magistrala.IdentityRes, error) { + _, res, err := s.identify.ServeGRPC(ctx, token) + if err != nil { + return nil, encodeError(err) + } + return res.(*magistrala.IdentityRes), nil +} + +type policyGrpcServer struct { + magistrala.UnimplementedPolicyServiceServer + addPolicy kitgrpc.Handler + addPolicies kitgrpc.Handler + deletePolicyFilter kitgrpc.Handler + deletePolicies kitgrpc.Handler + listObjects kitgrpc.Handler + listAllObjects kitgrpc.Handler + countObjects kitgrpc.Handler + listSubjects kitgrpc.Handler + listAllSubjects kitgrpc.Handler + countSubjects kitgrpc.Handler + listPermissions kitgrpc.Handler + deleteEntityPolicies kitgrpc.Handler +} + +func NewPolicyServer(svc auth.Service) magistrala.PolicyServiceServer { + return &policyGrpcServer{ addPolicy: kitgrpc.NewServer( (addPolicyEndpoint(svc)), decodeAddPolicyRequest, @@ -124,39 +179,7 @@ func NewServer(svc auth.Service) magistrala.AuthServiceServer { } } -func (s *grpcServer) Issue(ctx context.Context, req *magistrala.IssueReq) (*magistrala.Token, error) { - _, res, err := s.issue.ServeGRPC(ctx, req) - if err != nil { - return nil, encodeError(err) - } - return res.(*magistrala.Token), nil -} - -func (s *grpcServer) Refresh(ctx context.Context, req *magistrala.RefreshReq) (*magistrala.Token, error) { - _, res, err := s.refresh.ServeGRPC(ctx, req) - if err != nil { - return nil, encodeError(err) - } - return res.(*magistrala.Token), nil -} - -func (s *grpcServer) Identify(ctx context.Context, token *magistrala.IdentityReq) (*magistrala.IdentityRes, error) { - _, res, err := s.identify.ServeGRPC(ctx, token) - if err != nil { - return nil, encodeError(err) - } - return res.(*magistrala.IdentityRes), nil -} - -func (s *grpcServer) Authorize(ctx context.Context, req *magistrala.AuthorizeReq) (*magistrala.AuthorizeRes, error) { - _, res, err := s.authorize.ServeGRPC(ctx, req) - if err != nil { - return nil, encodeError(err) - } - return res.(*magistrala.AuthorizeRes), nil -} - -func (s *grpcServer) AddPolicy(ctx context.Context, req *magistrala.AddPolicyReq) (*magistrala.AddPolicyRes, error) { +func (s *policyGrpcServer) AddPolicy(ctx context.Context, req *magistrala.AddPolicyReq) (*magistrala.AddPolicyRes, error) { _, res, err := s.addPolicy.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -164,7 +187,7 @@ func (s *grpcServer) AddPolicy(ctx context.Context, req *magistrala.AddPolicyReq return res.(*magistrala.AddPolicyRes), nil } -func (s *grpcServer) AddPolicies(ctx context.Context, req *magistrala.AddPoliciesReq) (*magistrala.AddPoliciesRes, error) { +func (s *policyGrpcServer) AddPolicies(ctx context.Context, req *magistrala.AddPoliciesReq) (*magistrala.AddPoliciesRes, error) { _, res, err := s.addPolicies.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -172,7 +195,7 @@ func (s *grpcServer) AddPolicies(ctx context.Context, req *magistrala.AddPolicie return res.(*magistrala.AddPoliciesRes), nil } -func (s *grpcServer) DeletePolicyFilter(ctx context.Context, req *magistrala.DeletePolicyFilterReq) (*magistrala.DeletePolicyRes, error) { +func (s *policyGrpcServer) DeletePolicyFilter(ctx context.Context, req *magistrala.DeletePolicyFilterReq) (*magistrala.DeletePolicyRes, error) { _, res, err := s.deletePolicyFilter.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -180,7 +203,7 @@ func (s *grpcServer) DeletePolicyFilter(ctx context.Context, req *magistrala.Del return res.(*magistrala.DeletePolicyRes), nil } -func (s *grpcServer) DeletePolicies(ctx context.Context, req *magistrala.DeletePoliciesReq) (*magistrala.DeletePolicyRes, error) { +func (s *policyGrpcServer) DeletePolicies(ctx context.Context, req *magistrala.DeletePoliciesReq) (*magistrala.DeletePolicyRes, error) { _, res, err := s.deletePolicies.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -188,7 +211,7 @@ func (s *grpcServer) DeletePolicies(ctx context.Context, req *magistrala.DeleteP return res.(*magistrala.DeletePolicyRes), nil } -func (s *grpcServer) ListObjects(ctx context.Context, req *magistrala.ListObjectsReq) (*magistrala.ListObjectsRes, error) { +func (s *policyGrpcServer) ListObjects(ctx context.Context, req *magistrala.ListObjectsReq) (*magistrala.ListObjectsRes, error) { _, res, err := s.listObjects.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -196,7 +219,7 @@ func (s *grpcServer) ListObjects(ctx context.Context, req *magistrala.ListObject return res.(*magistrala.ListObjectsRes), nil } -func (s *grpcServer) ListAllObjects(ctx context.Context, req *magistrala.ListObjectsReq) (*magistrala.ListObjectsRes, error) { +func (s *policyGrpcServer) ListAllObjects(ctx context.Context, req *magistrala.ListObjectsReq) (*magistrala.ListObjectsRes, error) { _, res, err := s.listAllObjects.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -204,7 +227,7 @@ func (s *grpcServer) ListAllObjects(ctx context.Context, req *magistrala.ListObj return res.(*magistrala.ListObjectsRes), nil } -func (s *grpcServer) CountObjects(ctx context.Context, req *magistrala.CountObjectsReq) (*magistrala.CountObjectsRes, error) { +func (s *policyGrpcServer) CountObjects(ctx context.Context, req *magistrala.CountObjectsReq) (*magistrala.CountObjectsRes, error) { _, res, err := s.countObjects.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -212,7 +235,7 @@ func (s *grpcServer) CountObjects(ctx context.Context, req *magistrala.CountObje return res.(*magistrala.CountObjectsRes), nil } -func (s *grpcServer) ListSubjects(ctx context.Context, req *magistrala.ListSubjectsReq) (*magistrala.ListSubjectsRes, error) { +func (s *policyGrpcServer) ListSubjects(ctx context.Context, req *magistrala.ListSubjectsReq) (*magistrala.ListSubjectsRes, error) { _, res, err := s.listSubjects.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -220,7 +243,7 @@ func (s *grpcServer) ListSubjects(ctx context.Context, req *magistrala.ListSubje return res.(*magistrala.ListSubjectsRes), nil } -func (s *grpcServer) ListAllSubjects(ctx context.Context, req *magistrala.ListSubjectsReq) (*magistrala.ListSubjectsRes, error) { +func (s *policyGrpcServer) ListAllSubjects(ctx context.Context, req *magistrala.ListSubjectsReq) (*magistrala.ListSubjectsRes, error) { _, res, err := s.listAllSubjects.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -228,7 +251,7 @@ func (s *grpcServer) ListAllSubjects(ctx context.Context, req *magistrala.ListSu return res.(*magistrala.ListSubjectsRes), nil } -func (s *grpcServer) CountSubjects(ctx context.Context, req *magistrala.CountSubjectsReq) (*magistrala.CountSubjectsRes, error) { +func (s *policyGrpcServer) CountSubjects(ctx context.Context, req *magistrala.CountSubjectsReq) (*magistrala.CountSubjectsRes, error) { _, res, err := s.countSubjects.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -236,7 +259,7 @@ func (s *grpcServer) CountSubjects(ctx context.Context, req *magistrala.CountSub return res.(*magistrala.CountSubjectsRes), nil } -func (s *grpcServer) ListPermissions(ctx context.Context, req *magistrala.ListPermissionsReq) (*magistrala.ListPermissionsRes, error) { +func (s *policyGrpcServer) ListPermissions(ctx context.Context, req *magistrala.ListPermissionsReq) (*magistrala.ListPermissionsRes, error) { _, res, err := s.listPermissions.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) @@ -244,7 +267,7 @@ func (s *grpcServer) ListPermissions(ctx context.Context, req *magistrala.ListPe return res.(*magistrala.ListPermissionsRes), nil } -func (s *grpcServer) DeleteEntityPolicies(ctx context.Context, req *magistrala.DeleteEntityPoliciesReq) (*magistrala.DeletePolicyRes, error) { +func (s *policyGrpcServer) DeleteEntityPolicies(ctx context.Context, req *magistrala.DeleteEntityPoliciesReq) (*magistrala.DeletePolicyRes, error) { _, res, err := s.deleteEntityPolicies.ServeGRPC(ctx, req) if err != nil { return nil, encodeError(err) diff --git a/auth/mocks/auth_client.go b/auth/mocks/auth_client.go index 37134ba5da..ed1ceec41a 100644 --- a/auth/mocks/auth_client.go +++ b/auth/mocks/auth_client.go @@ -1,9 +1,7 @@ -// Copyright (c) Abstract Machines - -// SPDX-License-Identifier: Apache-2.0 - // Code generated by mockery v2.43.2. DO NOT EDIT. +// Copyright (c) Abstract Machines + package mocks import ( @@ -11,544 +9,18 @@ import ( grpc "google.golang.org/grpc" - magistrala "github.com/absmach/magistrala" - - mock "github.com/stretchr/testify/mock" -) - -// AuthClient is an autogenerated mock type for the AuthServiceClient type -type AuthClient struct { - mock.Mock -} - -type AuthClient_Expecter struct { - mock *mock.Mock -} - -func (_m *AuthClient) EXPECT() *AuthClient_Expecter { - return &AuthClient_Expecter{mock: &_m.Mock} -} - -// AddPolicies provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) AddPolicies(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption) (*magistrala.AddPoliciesRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for AddPolicies") - } - - var r0 *magistrala.AddPoliciesRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) (*magistrala.AddPoliciesRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) *magistrala.AddPoliciesRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.AddPoliciesRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_AddPolicies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPolicies' -type AuthClient_AddPolicies_Call struct { - *mock.Call -} - -// AddPolicies is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.AddPoliciesReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) AddPolicies(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_AddPolicies_Call { - return &AuthClient_AddPolicies_Call{Call: _e.mock.On("AddPolicies", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_AddPolicies_Call) Run(run func(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption)) *AuthClient_AddPolicies_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.AddPoliciesReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_AddPolicies_Call) Return(_a0 *magistrala.AddPoliciesRes, _a1 error) *AuthClient_AddPolicies_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_AddPolicies_Call) RunAndReturn(run func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) (*magistrala.AddPoliciesRes, error)) *AuthClient_AddPolicies_Call { - _c.Call.Return(run) - return _c -} - -// AddPolicy provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) AddPolicy(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption) (*magistrala.AddPolicyRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for AddPolicy") - } - - var r0 *magistrala.AddPolicyRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) (*magistrala.AddPolicyRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) *magistrala.AddPolicyRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.AddPolicyRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_AddPolicy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPolicy' -type AuthClient_AddPolicy_Call struct { - *mock.Call -} - -// AddPolicy is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.AddPolicyReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) AddPolicy(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_AddPolicy_Call { - return &AuthClient_AddPolicy_Call{Call: _e.mock.On("AddPolicy", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_AddPolicy_Call) Run(run func(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption)) *AuthClient_AddPolicy_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.AddPolicyReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_AddPolicy_Call) Return(_a0 *magistrala.AddPolicyRes, _a1 error) *AuthClient_AddPolicy_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_AddPolicy_Call) RunAndReturn(run func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) (*magistrala.AddPolicyRes, error)) *AuthClient_AddPolicy_Call { - _c.Call.Return(run) - return _c -} - -// Authorize provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) Authorize(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption) (*magistrala.AuthorizeRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for Authorize") - } - - var r0 *magistrala.AuthorizeRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) (*magistrala.AuthorizeRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) *magistrala.AuthorizeRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.AuthorizeRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_Authorize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Authorize' -type AuthClient_Authorize_Call struct { - *mock.Call -} - -// Authorize is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.AuthorizeReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) Authorize(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_Authorize_Call { - return &AuthClient_Authorize_Call{Call: _e.mock.On("Authorize", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_Authorize_Call) Run(run func(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption)) *AuthClient_Authorize_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.AuthorizeReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_Authorize_Call) Return(_a0 *magistrala.AuthorizeRes, _a1 error) *AuthClient_Authorize_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_Authorize_Call) RunAndReturn(run func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) (*magistrala.AuthorizeRes, error)) *AuthClient_Authorize_Call { - _c.Call.Return(run) - return _c -} - -// CountObjects provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) CountObjects(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption) (*magistrala.CountObjectsRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for CountObjects") - } - - var r0 *magistrala.CountObjectsRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) (*magistrala.CountObjectsRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) *magistrala.CountObjectsRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.CountObjectsRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_CountObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CountObjects' -type AuthClient_CountObjects_Call struct { - *mock.Call -} - -// CountObjects is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.CountObjectsReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) CountObjects(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_CountObjects_Call { - return &AuthClient_CountObjects_Call{Call: _e.mock.On("CountObjects", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_CountObjects_Call) Run(run func(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption)) *AuthClient_CountObjects_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.CountObjectsReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_CountObjects_Call) Return(_a0 *magistrala.CountObjectsRes, _a1 error) *AuthClient_CountObjects_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_CountObjects_Call) RunAndReturn(run func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) (*magistrala.CountObjectsRes, error)) *AuthClient_CountObjects_Call { - _c.Call.Return(run) - return _c -} - -// CountSubjects provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) CountSubjects(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption) (*magistrala.CountSubjectsRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for CountSubjects") - } - - var r0 *magistrala.CountSubjectsRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) (*magistrala.CountSubjectsRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) *magistrala.CountSubjectsRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.CountSubjectsRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_CountSubjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CountSubjects' -type AuthClient_CountSubjects_Call struct { - *mock.Call -} - -// CountSubjects is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.CountSubjectsReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) CountSubjects(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_CountSubjects_Call { - return &AuthClient_CountSubjects_Call{Call: _e.mock.On("CountSubjects", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_CountSubjects_Call) Run(run func(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption)) *AuthClient_CountSubjects_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.CountSubjectsReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_CountSubjects_Call) Return(_a0 *magistrala.CountSubjectsRes, _a1 error) *AuthClient_CountSubjects_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_CountSubjects_Call) RunAndReturn(run func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) (*magistrala.CountSubjectsRes, error)) *AuthClient_CountSubjects_Call { - _c.Call.Return(run) - return _c -} - -// DeleteEntityPolicies provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) DeleteEntityPolicies(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for DeleteEntityPolicies") - } - - var r0 *magistrala.DeletePolicyRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) *magistrala.DeletePolicyRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.DeletePolicyRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_DeleteEntityPolicies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteEntityPolicies' -type AuthClient_DeleteEntityPolicies_Call struct { - *mock.Call -} - -// DeleteEntityPolicies is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.DeleteEntityPoliciesReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) DeleteEntityPolicies(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_DeleteEntityPolicies_Call { - return &AuthClient_DeleteEntityPolicies_Call{Call: _e.mock.On("DeleteEntityPolicies", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_DeleteEntityPolicies_Call) Run(run func(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption)) *AuthClient_DeleteEntityPolicies_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.DeleteEntityPoliciesReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_DeleteEntityPolicies_Call) Return(_a0 *magistrala.DeletePolicyRes, _a1 error) *AuthClient_DeleteEntityPolicies_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_DeleteEntityPolicies_Call) RunAndReturn(run func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)) *AuthClient_DeleteEntityPolicies_Call { - _c.Call.Return(run) - return _c -} - -// DeletePolicies provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) DeletePolicies(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for DeletePolicies") - } - - var r0 *magistrala.DeletePolicyRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) *magistrala.DeletePolicyRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.DeletePolicyRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_DeletePolicies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeletePolicies' -type AuthClient_DeletePolicies_Call struct { - *mock.Call -} - -// DeletePolicies is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.DeletePoliciesReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) DeletePolicies(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_DeletePolicies_Call { - return &AuthClient_DeletePolicies_Call{Call: _e.mock.On("DeletePolicies", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_DeletePolicies_Call) Run(run func(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption)) *AuthClient_DeletePolicies_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.DeletePoliciesReq), variadicArgs...) - }) - return _c -} + magistrala "github.com/absmach/magistrala" -func (_c *AuthClient_DeletePolicies_Call) Return(_a0 *magistrala.DeletePolicyRes, _a1 error) *AuthClient_DeletePolicies_Call { - _c.Call.Return(_a0, _a1) - return _c -} + mock "github.com/stretchr/testify/mock" +) -func (_c *AuthClient_DeletePolicies_Call) RunAndReturn(run func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)) *AuthClient_DeletePolicies_Call { - _c.Call.Return(run) - return _c +// AuthServiceClient is an autogenerated mock type for the AuthServiceClient type +type AuthServiceClient struct { + mock.Mock } -// DeletePolicyFilter provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) DeletePolicyFilter(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { +// Authorize provides a mock function with given fields: ctx, in, opts +func (_m *AuthServiceClient) Authorize(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption) (*magistrala.AuthorizeRes, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -559,23 +31,23 @@ func (_m *AuthClient) DeletePolicyFilter(ctx context.Context, in *magistrala.Del ret := _m.Called(_ca...) if len(ret) == 0 { - panic("no return value specified for DeletePolicyFilter") + panic("no return value specified for Authorize") } - var r0 *magistrala.DeletePolicyRes + var r0 *magistrala.AuthorizeRes var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) (*magistrala.AuthorizeRes, error)); ok { return rf(ctx, in, opts...) } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) *magistrala.DeletePolicyRes); ok { + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) *magistrala.AuthorizeRes); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.DeletePolicyRes) + r0 = ret.Get(0).(*magistrala.AuthorizeRes) } } - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -584,45 +56,8 @@ func (_m *AuthClient) DeletePolicyFilter(ctx context.Context, in *magistrala.Del return r0, r1 } -// AuthClient_DeletePolicyFilter_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeletePolicyFilter' -type AuthClient_DeletePolicyFilter_Call struct { - *mock.Call -} - -// DeletePolicyFilter is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.DeletePolicyFilterReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) DeletePolicyFilter(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_DeletePolicyFilter_Call { - return &AuthClient_DeletePolicyFilter_Call{Call: _e.mock.On("DeletePolicyFilter", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_DeletePolicyFilter_Call) Run(run func(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption)) *AuthClient_DeletePolicyFilter_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.DeletePolicyFilterReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_DeletePolicyFilter_Call) Return(_a0 *magistrala.DeletePolicyRes, _a1 error) *AuthClient_DeletePolicyFilter_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_DeletePolicyFilter_Call) RunAndReturn(run func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)) *AuthClient_DeletePolicyFilter_Call { - _c.Call.Return(run) - return _c -} - // Identify provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) Identify(ctx context.Context, in *magistrala.IdentityReq, opts ...grpc.CallOption) (*magistrala.IdentityRes, error) { +func (_m *AuthServiceClient) Identify(ctx context.Context, in *magistrala.IdentityReq, opts ...grpc.CallOption) (*magistrala.IdentityRes, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -658,45 +93,8 @@ func (_m *AuthClient) Identify(ctx context.Context, in *magistrala.IdentityReq, return r0, r1 } -// AuthClient_Identify_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Identify' -type AuthClient_Identify_Call struct { - *mock.Call -} - -// Identify is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.IdentityReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) Identify(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_Identify_Call { - return &AuthClient_Identify_Call{Call: _e.mock.On("Identify", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_Identify_Call) Run(run func(ctx context.Context, in *magistrala.IdentityReq, opts ...grpc.CallOption)) *AuthClient_Identify_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.IdentityReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_Identify_Call) Return(_a0 *magistrala.IdentityRes, _a1 error) *AuthClient_Identify_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_Identify_Call) RunAndReturn(run func(context.Context, *magistrala.IdentityReq, ...grpc.CallOption) (*magistrala.IdentityRes, error)) *AuthClient_Identify_Call { - _c.Call.Return(run) - return _c -} - // Issue provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) Issue(ctx context.Context, in *magistrala.IssueReq, opts ...grpc.CallOption) (*magistrala.Token, error) { +func (_m *AuthServiceClient) Issue(ctx context.Context, in *magistrala.IssueReq, opts ...grpc.CallOption) (*magistrala.Token, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -732,415 +130,8 @@ func (_m *AuthClient) Issue(ctx context.Context, in *magistrala.IssueReq, opts . return r0, r1 } -// AuthClient_Issue_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Issue' -type AuthClient_Issue_Call struct { - *mock.Call -} - -// Issue is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.IssueReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) Issue(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_Issue_Call { - return &AuthClient_Issue_Call{Call: _e.mock.On("Issue", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_Issue_Call) Run(run func(ctx context.Context, in *magistrala.IssueReq, opts ...grpc.CallOption)) *AuthClient_Issue_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.IssueReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_Issue_Call) Return(_a0 *magistrala.Token, _a1 error) *AuthClient_Issue_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_Issue_Call) RunAndReturn(run func(context.Context, *magistrala.IssueReq, ...grpc.CallOption) (*magistrala.Token, error)) *AuthClient_Issue_Call { - _c.Call.Return(run) - return _c -} - -// ListAllObjects provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) ListAllObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for ListAllObjects") - } - - var r0 *magistrala.ListObjectsRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) *magistrala.ListObjectsRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.ListObjectsRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_ListAllObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListAllObjects' -type AuthClient_ListAllObjects_Call struct { - *mock.Call -} - -// ListAllObjects is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.ListObjectsReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) ListAllObjects(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_ListAllObjects_Call { - return &AuthClient_ListAllObjects_Call{Call: _e.mock.On("ListAllObjects", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_ListAllObjects_Call) Run(run func(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption)) *AuthClient_ListAllObjects_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.ListObjectsReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_ListAllObjects_Call) Return(_a0 *magistrala.ListObjectsRes, _a1 error) *AuthClient_ListAllObjects_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_ListAllObjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)) *AuthClient_ListAllObjects_Call { - _c.Call.Return(run) - return _c -} - -// ListAllSubjects provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) ListAllSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for ListAllSubjects") - } - - var r0 *magistrala.ListSubjectsRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) *magistrala.ListSubjectsRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.ListSubjectsRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_ListAllSubjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListAllSubjects' -type AuthClient_ListAllSubjects_Call struct { - *mock.Call -} - -// ListAllSubjects is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.ListSubjectsReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) ListAllSubjects(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_ListAllSubjects_Call { - return &AuthClient_ListAllSubjects_Call{Call: _e.mock.On("ListAllSubjects", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_ListAllSubjects_Call) Run(run func(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption)) *AuthClient_ListAllSubjects_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.ListSubjectsReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_ListAllSubjects_Call) Return(_a0 *magistrala.ListSubjectsRes, _a1 error) *AuthClient_ListAllSubjects_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_ListAllSubjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)) *AuthClient_ListAllSubjects_Call { - _c.Call.Return(run) - return _c -} - -// ListObjects provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) ListObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for ListObjects") - } - - var r0 *magistrala.ListObjectsRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) *magistrala.ListObjectsRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.ListObjectsRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_ListObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListObjects' -type AuthClient_ListObjects_Call struct { - *mock.Call -} - -// ListObjects is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.ListObjectsReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) ListObjects(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_ListObjects_Call { - return &AuthClient_ListObjects_Call{Call: _e.mock.On("ListObjects", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_ListObjects_Call) Run(run func(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption)) *AuthClient_ListObjects_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.ListObjectsReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_ListObjects_Call) Return(_a0 *magistrala.ListObjectsRes, _a1 error) *AuthClient_ListObjects_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_ListObjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)) *AuthClient_ListObjects_Call { - _c.Call.Return(run) - return _c -} - -// ListPermissions provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) ListPermissions(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption) (*magistrala.ListPermissionsRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for ListPermissions") - } - - var r0 *magistrala.ListPermissionsRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) (*magistrala.ListPermissionsRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) *magistrala.ListPermissionsRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.ListPermissionsRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_ListPermissions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListPermissions' -type AuthClient_ListPermissions_Call struct { - *mock.Call -} - -// ListPermissions is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.ListPermissionsReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) ListPermissions(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_ListPermissions_Call { - return &AuthClient_ListPermissions_Call{Call: _e.mock.On("ListPermissions", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_ListPermissions_Call) Run(run func(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption)) *AuthClient_ListPermissions_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.ListPermissionsReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_ListPermissions_Call) Return(_a0 *magistrala.ListPermissionsRes, _a1 error) *AuthClient_ListPermissions_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_ListPermissions_Call) RunAndReturn(run func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) (*magistrala.ListPermissionsRes, error)) *AuthClient_ListPermissions_Call { - _c.Call.Return(run) - return _c -} - -// ListSubjects provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) ListSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - if len(ret) == 0 { - panic("no return value specified for ListSubjects") - } - - var r0 *magistrala.ListSubjectsRes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)); ok { - return rf(ctx, in, opts...) - } - if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) *magistrala.ListSubjectsRes); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*magistrala.ListSubjectsRes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// AuthClient_ListSubjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListSubjects' -type AuthClient_ListSubjects_Call struct { - *mock.Call -} - -// ListSubjects is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.ListSubjectsReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) ListSubjects(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_ListSubjects_Call { - return &AuthClient_ListSubjects_Call{Call: _e.mock.On("ListSubjects", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_ListSubjects_Call) Run(run func(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption)) *AuthClient_ListSubjects_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.ListSubjectsReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_ListSubjects_Call) Return(_a0 *magistrala.ListSubjectsRes, _a1 error) *AuthClient_ListSubjects_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_ListSubjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)) *AuthClient_ListSubjects_Call { - _c.Call.Return(run) - return _c -} - // Refresh provides a mock function with given fields: ctx, in, opts -func (_m *AuthClient) Refresh(ctx context.Context, in *magistrala.RefreshReq, opts ...grpc.CallOption) (*magistrala.Token, error) { +func (_m *AuthServiceClient) Refresh(ctx context.Context, in *magistrala.RefreshReq, opts ...grpc.CallOption) (*magistrala.Token, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -1176,50 +167,13 @@ func (_m *AuthClient) Refresh(ctx context.Context, in *magistrala.RefreshReq, op return r0, r1 } -// AuthClient_Refresh_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Refresh' -type AuthClient_Refresh_Call struct { - *mock.Call -} - -// Refresh is a helper method to define mock.On call -// - ctx context.Context -// - in *magistrala.RefreshReq -// - opts ...grpc.CallOption -func (_e *AuthClient_Expecter) Refresh(ctx interface{}, in interface{}, opts ...interface{}) *AuthClient_Refresh_Call { - return &AuthClient_Refresh_Call{Call: _e.mock.On("Refresh", - append([]interface{}{ctx, in}, opts...)...)} -} - -func (_c *AuthClient_Refresh_Call) Run(run func(ctx context.Context, in *magistrala.RefreshReq, opts ...grpc.CallOption)) *AuthClient_Refresh_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]grpc.CallOption, len(args)-2) - for i, a := range args[2:] { - if a != nil { - variadicArgs[i] = a.(grpc.CallOption) - } - } - run(args[0].(context.Context), args[1].(*magistrala.RefreshReq), variadicArgs...) - }) - return _c -} - -func (_c *AuthClient_Refresh_Call) Return(_a0 *magistrala.Token, _a1 error) *AuthClient_Refresh_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *AuthClient_Refresh_Call) RunAndReturn(run func(context.Context, *magistrala.RefreshReq, ...grpc.CallOption) (*magistrala.Token, error)) *AuthClient_Refresh_Call { - _c.Call.Return(run) - return _c -} - -// NewAuthClient creates a new instance of AuthClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// NewAuthServiceClient creates a new instance of AuthServiceClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. -func NewAuthClient(t interface { +func NewAuthServiceClient(t interface { mock.TestingT Cleanup(func()) -}) *AuthClient { - mock := &AuthClient{} +}) *AuthServiceClient { + mock := &AuthServiceClient{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/auth/mocks/policy_client.go b/auth/mocks/policy_client.go new file mode 100644 index 0000000000..5ebe5ac1ed --- /dev/null +++ b/auth/mocks/policy_client.go @@ -0,0 +1,932 @@ +// Copyright (c) Abstract Machines + +// SPDX-License-Identifier: Apache-2.0 + +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mocks + +import ( + context "context" + + grpc "google.golang.org/grpc" + + magistrala "github.com/absmach/magistrala" + + mock "github.com/stretchr/testify/mock" +) + +// PolicyServiceClient is an autogenerated mock type for the PolicyServiceClient type +type PolicyServiceClient struct { + mock.Mock +} + +type PolicyServiceClient_Expecter struct { + mock *mock.Mock +} + +func (_m *PolicyServiceClient) EXPECT() *PolicyServiceClient_Expecter { + return &PolicyServiceClient_Expecter{mock: &_m.Mock} +} + +// AddPolicies provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) AddPolicies(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption) (*magistrala.AddPoliciesRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for AddPolicies") + } + + var r0 *magistrala.AddPoliciesRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) (*magistrala.AddPoliciesRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) *magistrala.AddPoliciesRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.AddPoliciesRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_AddPolicies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPolicies' +type PolicyServiceClient_AddPolicies_Call struct { + *mock.Call +} + +// AddPolicies is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.AddPoliciesReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) AddPolicies(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_AddPolicies_Call { + return &PolicyServiceClient_AddPolicies_Call{Call: _e.mock.On("AddPolicies", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_AddPolicies_Call) Run(run func(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption)) *PolicyServiceClient_AddPolicies_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.AddPoliciesReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_AddPolicies_Call) Return(_a0 *magistrala.AddPoliciesRes, _a1 error) *PolicyServiceClient_AddPolicies_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_AddPolicies_Call) RunAndReturn(run func(context.Context, *magistrala.AddPoliciesReq, ...grpc.CallOption) (*magistrala.AddPoliciesRes, error)) *PolicyServiceClient_AddPolicies_Call { + _c.Call.Return(run) + return _c +} + +// AddPolicy provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) AddPolicy(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption) (*magistrala.AddPolicyRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for AddPolicy") + } + + var r0 *magistrala.AddPolicyRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) (*magistrala.AddPolicyRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) *magistrala.AddPolicyRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.AddPolicyRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_AddPolicy_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPolicy' +type PolicyServiceClient_AddPolicy_Call struct { + *mock.Call +} + +// AddPolicy is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.AddPolicyReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) AddPolicy(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_AddPolicy_Call { + return &PolicyServiceClient_AddPolicy_Call{Call: _e.mock.On("AddPolicy", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_AddPolicy_Call) Run(run func(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption)) *PolicyServiceClient_AddPolicy_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.AddPolicyReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_AddPolicy_Call) Return(_a0 *magistrala.AddPolicyRes, _a1 error) *PolicyServiceClient_AddPolicy_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_AddPolicy_Call) RunAndReturn(run func(context.Context, *magistrala.AddPolicyReq, ...grpc.CallOption) (*magistrala.AddPolicyRes, error)) *PolicyServiceClient_AddPolicy_Call { + _c.Call.Return(run) + return _c +} + +// CountObjects provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) CountObjects(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption) (*magistrala.CountObjectsRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for CountObjects") + } + + var r0 *magistrala.CountObjectsRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) (*magistrala.CountObjectsRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) *magistrala.CountObjectsRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.CountObjectsRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_CountObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CountObjects' +type PolicyServiceClient_CountObjects_Call struct { + *mock.Call +} + +// CountObjects is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.CountObjectsReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) CountObjects(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_CountObjects_Call { + return &PolicyServiceClient_CountObjects_Call{Call: _e.mock.On("CountObjects", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_CountObjects_Call) Run(run func(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption)) *PolicyServiceClient_CountObjects_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.CountObjectsReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_CountObjects_Call) Return(_a0 *magistrala.CountObjectsRes, _a1 error) *PolicyServiceClient_CountObjects_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_CountObjects_Call) RunAndReturn(run func(context.Context, *magistrala.CountObjectsReq, ...grpc.CallOption) (*magistrala.CountObjectsRes, error)) *PolicyServiceClient_CountObjects_Call { + _c.Call.Return(run) + return _c +} + +// CountSubjects provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) CountSubjects(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption) (*magistrala.CountSubjectsRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for CountSubjects") + } + + var r0 *magistrala.CountSubjectsRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) (*magistrala.CountSubjectsRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) *magistrala.CountSubjectsRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.CountSubjectsRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_CountSubjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CountSubjects' +type PolicyServiceClient_CountSubjects_Call struct { + *mock.Call +} + +// CountSubjects is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.CountSubjectsReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) CountSubjects(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_CountSubjects_Call { + return &PolicyServiceClient_CountSubjects_Call{Call: _e.mock.On("CountSubjects", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_CountSubjects_Call) Run(run func(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption)) *PolicyServiceClient_CountSubjects_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.CountSubjectsReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_CountSubjects_Call) Return(_a0 *magistrala.CountSubjectsRes, _a1 error) *PolicyServiceClient_CountSubjects_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_CountSubjects_Call) RunAndReturn(run func(context.Context, *magistrala.CountSubjectsReq, ...grpc.CallOption) (*magistrala.CountSubjectsRes, error)) *PolicyServiceClient_CountSubjects_Call { + _c.Call.Return(run) + return _c +} + +// DeleteEntityPolicies provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) DeleteEntityPolicies(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for DeleteEntityPolicies") + } + + var r0 *magistrala.DeletePolicyRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) *magistrala.DeletePolicyRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.DeletePolicyRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_DeleteEntityPolicies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteEntityPolicies' +type PolicyServiceClient_DeleteEntityPolicies_Call struct { + *mock.Call +} + +// DeleteEntityPolicies is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.DeleteEntityPoliciesReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) DeleteEntityPolicies(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_DeleteEntityPolicies_Call { + return &PolicyServiceClient_DeleteEntityPolicies_Call{Call: _e.mock.On("DeleteEntityPolicies", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_DeleteEntityPolicies_Call) Run(run func(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption)) *PolicyServiceClient_DeleteEntityPolicies_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.DeleteEntityPoliciesReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_DeleteEntityPolicies_Call) Return(_a0 *magistrala.DeletePolicyRes, _a1 error) *PolicyServiceClient_DeleteEntityPolicies_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_DeleteEntityPolicies_Call) RunAndReturn(run func(context.Context, *magistrala.DeleteEntityPoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)) *PolicyServiceClient_DeleteEntityPolicies_Call { + _c.Call.Return(run) + return _c +} + +// DeletePolicies provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) DeletePolicies(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for DeletePolicies") + } + + var r0 *magistrala.DeletePolicyRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) *magistrala.DeletePolicyRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.DeletePolicyRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_DeletePolicies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeletePolicies' +type PolicyServiceClient_DeletePolicies_Call struct { + *mock.Call +} + +// DeletePolicies is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.DeletePoliciesReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) DeletePolicies(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_DeletePolicies_Call { + return &PolicyServiceClient_DeletePolicies_Call{Call: _e.mock.On("DeletePolicies", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_DeletePolicies_Call) Run(run func(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption)) *PolicyServiceClient_DeletePolicies_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.DeletePoliciesReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_DeletePolicies_Call) Return(_a0 *magistrala.DeletePolicyRes, _a1 error) *PolicyServiceClient_DeletePolicies_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_DeletePolicies_Call) RunAndReturn(run func(context.Context, *magistrala.DeletePoliciesReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)) *PolicyServiceClient_DeletePolicies_Call { + _c.Call.Return(run) + return _c +} + +// DeletePolicyFilter provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) DeletePolicyFilter(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for DeletePolicyFilter") + } + + var r0 *magistrala.DeletePolicyRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) *magistrala.DeletePolicyRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.DeletePolicyRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_DeletePolicyFilter_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeletePolicyFilter' +type PolicyServiceClient_DeletePolicyFilter_Call struct { + *mock.Call +} + +// DeletePolicyFilter is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.DeletePolicyFilterReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) DeletePolicyFilter(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_DeletePolicyFilter_Call { + return &PolicyServiceClient_DeletePolicyFilter_Call{Call: _e.mock.On("DeletePolicyFilter", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_DeletePolicyFilter_Call) Run(run func(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption)) *PolicyServiceClient_DeletePolicyFilter_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.DeletePolicyFilterReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_DeletePolicyFilter_Call) Return(_a0 *magistrala.DeletePolicyRes, _a1 error) *PolicyServiceClient_DeletePolicyFilter_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_DeletePolicyFilter_Call) RunAndReturn(run func(context.Context, *magistrala.DeletePolicyFilterReq, ...grpc.CallOption) (*magistrala.DeletePolicyRes, error)) *PolicyServiceClient_DeletePolicyFilter_Call { + _c.Call.Return(run) + return _c +} + +// ListAllObjects provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) ListAllObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ListAllObjects") + } + + var r0 *magistrala.ListObjectsRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) *magistrala.ListObjectsRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.ListObjectsRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_ListAllObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListAllObjects' +type PolicyServiceClient_ListAllObjects_Call struct { + *mock.Call +} + +// ListAllObjects is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.ListObjectsReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) ListAllObjects(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_ListAllObjects_Call { + return &PolicyServiceClient_ListAllObjects_Call{Call: _e.mock.On("ListAllObjects", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_ListAllObjects_Call) Run(run func(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption)) *PolicyServiceClient_ListAllObjects_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.ListObjectsReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_ListAllObjects_Call) Return(_a0 *magistrala.ListObjectsRes, _a1 error) *PolicyServiceClient_ListAllObjects_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_ListAllObjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)) *PolicyServiceClient_ListAllObjects_Call { + _c.Call.Return(run) + return _c +} + +// ListAllSubjects provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) ListAllSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ListAllSubjects") + } + + var r0 *magistrala.ListSubjectsRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) *magistrala.ListSubjectsRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.ListSubjectsRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_ListAllSubjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListAllSubjects' +type PolicyServiceClient_ListAllSubjects_Call struct { + *mock.Call +} + +// ListAllSubjects is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.ListSubjectsReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) ListAllSubjects(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_ListAllSubjects_Call { + return &PolicyServiceClient_ListAllSubjects_Call{Call: _e.mock.On("ListAllSubjects", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_ListAllSubjects_Call) Run(run func(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption)) *PolicyServiceClient_ListAllSubjects_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.ListSubjectsReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_ListAllSubjects_Call) Return(_a0 *magistrala.ListSubjectsRes, _a1 error) *PolicyServiceClient_ListAllSubjects_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_ListAllSubjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)) *PolicyServiceClient_ListAllSubjects_Call { + _c.Call.Return(run) + return _c +} + +// ListObjects provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) ListObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ListObjects") + } + + var r0 *magistrala.ListObjectsRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) *magistrala.ListObjectsRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.ListObjectsRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_ListObjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListObjects' +type PolicyServiceClient_ListObjects_Call struct { + *mock.Call +} + +// ListObjects is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.ListObjectsReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) ListObjects(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_ListObjects_Call { + return &PolicyServiceClient_ListObjects_Call{Call: _e.mock.On("ListObjects", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_ListObjects_Call) Run(run func(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption)) *PolicyServiceClient_ListObjects_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.ListObjectsReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_ListObjects_Call) Return(_a0 *magistrala.ListObjectsRes, _a1 error) *PolicyServiceClient_ListObjects_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_ListObjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListObjectsReq, ...grpc.CallOption) (*magistrala.ListObjectsRes, error)) *PolicyServiceClient_ListObjects_Call { + _c.Call.Return(run) + return _c +} + +// ListPermissions provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) ListPermissions(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption) (*magistrala.ListPermissionsRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ListPermissions") + } + + var r0 *magistrala.ListPermissionsRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) (*magistrala.ListPermissionsRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) *magistrala.ListPermissionsRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.ListPermissionsRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_ListPermissions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListPermissions' +type PolicyServiceClient_ListPermissions_Call struct { + *mock.Call +} + +// ListPermissions is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.ListPermissionsReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) ListPermissions(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_ListPermissions_Call { + return &PolicyServiceClient_ListPermissions_Call{Call: _e.mock.On("ListPermissions", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_ListPermissions_Call) Run(run func(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption)) *PolicyServiceClient_ListPermissions_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.ListPermissionsReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_ListPermissions_Call) Return(_a0 *magistrala.ListPermissionsRes, _a1 error) *PolicyServiceClient_ListPermissions_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_ListPermissions_Call) RunAndReturn(run func(context.Context, *magistrala.ListPermissionsReq, ...grpc.CallOption) (*magistrala.ListPermissionsRes, error)) *PolicyServiceClient_ListPermissions_Call { + _c.Call.Return(run) + return _c +} + +// ListSubjects provides a mock function with given fields: ctx, in, opts +func (_m *PolicyServiceClient) ListSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for ListSubjects") + } + + var r0 *magistrala.ListSubjectsRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) *magistrala.ListSubjectsRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.ListSubjectsRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PolicyServiceClient_ListSubjects_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListSubjects' +type PolicyServiceClient_ListSubjects_Call struct { + *mock.Call +} + +// ListSubjects is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.ListSubjectsReq +// - opts ...grpc.CallOption +func (_e *PolicyServiceClient_Expecter) ListSubjects(ctx interface{}, in interface{}, opts ...interface{}) *PolicyServiceClient_ListSubjects_Call { + return &PolicyServiceClient_ListSubjects_Call{Call: _e.mock.On("ListSubjects", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *PolicyServiceClient_ListSubjects_Call) Run(run func(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption)) *PolicyServiceClient_ListSubjects_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.ListSubjectsReq), variadicArgs...) + }) + return _c +} + +func (_c *PolicyServiceClient_ListSubjects_Call) Return(_a0 *magistrala.ListSubjectsRes, _a1 error) *PolicyServiceClient_ListSubjects_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *PolicyServiceClient_ListSubjects_Call) RunAndReturn(run func(context.Context, *magistrala.ListSubjectsReq, ...grpc.CallOption) (*magistrala.ListSubjectsRes, error)) *PolicyServiceClient_ListSubjects_Call { + _c.Call.Return(run) + return _c +} + +// NewPolicyServiceClient creates a new instance of PolicyServiceClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewPolicyServiceClient(t interface { + mock.TestingT + Cleanup(func()) +}) *PolicyServiceClient { + mock := &PolicyServiceClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/auth_grpc.pb.go b/auth_grpc.pb.go index c6350d3a48..cac9ebe723 100644 --- a/auth_grpc.pb.go +++ b/auth_grpc.pb.go @@ -29,8 +29,8 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. // -// AuthzService is a service that provides authentication and authorization -// functionalities for the things service. +// AuthzService is a service that provides authorization functionalities +// for magistrala services. type AuthzServiceClient interface { // Authorize checks if the subject is authorized to perform // the action on the object. @@ -59,8 +59,8 @@ func (c *authzServiceClient) Authorize(ctx context.Context, in *AuthorizeReq, op // All implementations must embed UnimplementedAuthzServiceServer // for forward compatibility // -// AuthzService is a service that provides authentication and authorization -// functionalities for the things service. +// AuthzService is a service that provides authorization functionalities +// for magistrala services. type AuthzServiceServer interface { // Authorize checks if the subject is authorized to perform // the action on the object. @@ -123,228 +123,349 @@ var AuthzService_ServiceDesc = grpc.ServiceDesc{ } const ( - AuthService_Issue_FullMethodName = "/magistrala.AuthService/Issue" - AuthService_Refresh_FullMethodName = "/magistrala.AuthService/Refresh" - AuthService_Identify_FullMethodName = "/magistrala.AuthService/Identify" - AuthService_Authorize_FullMethodName = "/magistrala.AuthService/Authorize" - AuthService_AddPolicy_FullMethodName = "/magistrala.AuthService/AddPolicy" - AuthService_AddPolicies_FullMethodName = "/magistrala.AuthService/AddPolicies" - AuthService_DeletePolicyFilter_FullMethodName = "/magistrala.AuthService/DeletePolicyFilter" - AuthService_DeletePolicies_FullMethodName = "/magistrala.AuthService/DeletePolicies" - AuthService_ListObjects_FullMethodName = "/magistrala.AuthService/ListObjects" - AuthService_ListAllObjects_FullMethodName = "/magistrala.AuthService/ListAllObjects" - AuthService_CountObjects_FullMethodName = "/magistrala.AuthService/CountObjects" - AuthService_ListSubjects_FullMethodName = "/magistrala.AuthService/ListSubjects" - AuthService_ListAllSubjects_FullMethodName = "/magistrala.AuthService/ListAllSubjects" - AuthService_CountSubjects_FullMethodName = "/magistrala.AuthService/CountSubjects" - AuthService_ListPermissions_FullMethodName = "/magistrala.AuthService/ListPermissions" - AuthService_DeleteEntityPolicies_FullMethodName = "/magistrala.AuthService/DeleteEntityPolicies" + AuthnService_Issue_FullMethodName = "/magistrala.AuthnService/Issue" + AuthnService_Refresh_FullMethodName = "/magistrala.AuthnService/Refresh" + AuthnService_Identify_FullMethodName = "/magistrala.AuthnService/Identify" ) -// AuthServiceClient is the client API for AuthService service. +// AuthnServiceClient is the client API for AuthnService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. // -// AuthService is a service that provides authentication and authorization -// functionalities for the users service. -type AuthServiceClient interface { +// AuthnService is a service that provides authentication functionalities +// for magistrala services. +type AuthnServiceClient interface { Issue(ctx context.Context, in *IssueReq, opts ...grpc.CallOption) (*Token, error) Refresh(ctx context.Context, in *RefreshReq, opts ...grpc.CallOption) (*Token, error) Identify(ctx context.Context, in *IdentityReq, opts ...grpc.CallOption) (*IdentityRes, error) - Authorize(ctx context.Context, in *AuthorizeReq, opts ...grpc.CallOption) (*AuthorizeRes, error) - AddPolicy(ctx context.Context, in *AddPolicyReq, opts ...grpc.CallOption) (*AddPolicyRes, error) - AddPolicies(ctx context.Context, in *AddPoliciesReq, opts ...grpc.CallOption) (*AddPoliciesRes, error) - DeletePolicyFilter(ctx context.Context, in *DeletePolicyFilterReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) - DeletePolicies(ctx context.Context, in *DeletePoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) - ListObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) - ListAllObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) - CountObjects(ctx context.Context, in *CountObjectsReq, opts ...grpc.CallOption) (*CountObjectsRes, error) - ListSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) - ListAllSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) - CountSubjects(ctx context.Context, in *CountSubjectsReq, opts ...grpc.CallOption) (*CountSubjectsRes, error) - ListPermissions(ctx context.Context, in *ListPermissionsReq, opts ...grpc.CallOption) (*ListPermissionsRes, error) - DeleteEntityPolicies(ctx context.Context, in *DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) } -type authServiceClient struct { +type authnServiceClient struct { cc grpc.ClientConnInterface } -func NewAuthServiceClient(cc grpc.ClientConnInterface) AuthServiceClient { - return &authServiceClient{cc} +func NewAuthnServiceClient(cc grpc.ClientConnInterface) AuthnServiceClient { + return &authnServiceClient{cc} } -func (c *authServiceClient) Issue(ctx context.Context, in *IssueReq, opts ...grpc.CallOption) (*Token, error) { +func (c *authnServiceClient) Issue(ctx context.Context, in *IssueReq, opts ...grpc.CallOption) (*Token, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Token) - err := c.cc.Invoke(ctx, AuthService_Issue_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, AuthnService_Issue_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) Refresh(ctx context.Context, in *RefreshReq, opts ...grpc.CallOption) (*Token, error) { +func (c *authnServiceClient) Refresh(ctx context.Context, in *RefreshReq, opts ...grpc.CallOption) (*Token, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Token) - err := c.cc.Invoke(ctx, AuthService_Refresh_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, AuthnService_Refresh_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) Identify(ctx context.Context, in *IdentityReq, opts ...grpc.CallOption) (*IdentityRes, error) { +func (c *authnServiceClient) Identify(ctx context.Context, in *IdentityReq, opts ...grpc.CallOption) (*IdentityRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(IdentityRes) - err := c.cc.Invoke(ctx, AuthService_Identify_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, AuthnService_Identify_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) Authorize(ctx context.Context, in *AuthorizeReq, opts ...grpc.CallOption) (*AuthorizeRes, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(AuthorizeRes) - err := c.cc.Invoke(ctx, AuthService_Authorize_FullMethodName, in, out, cOpts...) - if err != nil { +// AuthnServiceServer is the server API for AuthnService service. +// All implementations must embed UnimplementedAuthnServiceServer +// for forward compatibility +// +// AuthnService is a service that provides authentication functionalities +// for magistrala services. +type AuthnServiceServer interface { + Issue(context.Context, *IssueReq) (*Token, error) + Refresh(context.Context, *RefreshReq) (*Token, error) + Identify(context.Context, *IdentityReq) (*IdentityRes, error) + mustEmbedUnimplementedAuthnServiceServer() +} + +// UnimplementedAuthnServiceServer must be embedded to have forward compatible implementations. +type UnimplementedAuthnServiceServer struct { +} + +func (UnimplementedAuthnServiceServer) Issue(context.Context, *IssueReq) (*Token, error) { + return nil, status.Errorf(codes.Unimplemented, "method Issue not implemented") +} +func (UnimplementedAuthnServiceServer) Refresh(context.Context, *RefreshReq) (*Token, error) { + return nil, status.Errorf(codes.Unimplemented, "method Refresh not implemented") +} +func (UnimplementedAuthnServiceServer) Identify(context.Context, *IdentityReq) (*IdentityRes, error) { + return nil, status.Errorf(codes.Unimplemented, "method Identify not implemented") +} +func (UnimplementedAuthnServiceServer) mustEmbedUnimplementedAuthnServiceServer() {} + +// UnsafeAuthnServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AuthnServiceServer will +// result in compilation errors. +type UnsafeAuthnServiceServer interface { + mustEmbedUnimplementedAuthnServiceServer() +} + +func RegisterAuthnServiceServer(s grpc.ServiceRegistrar, srv AuthnServiceServer) { + s.RegisterService(&AuthnService_ServiceDesc, srv) +} + +func _AuthnService_Issue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IssueReq) + if err := dec(in); err != nil { return nil, err } - return out, nil + if interceptor == nil { + return srv.(AuthnServiceServer).Issue(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthnService_Issue_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthnServiceServer).Issue(ctx, req.(*IssueReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthnService_Refresh_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthnServiceServer).Refresh(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthnService_Refresh_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthnServiceServer).Refresh(ctx, req.(*RefreshReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthnService_Identify_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IdentityReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthnServiceServer).Identify(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthnService_Identify_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthnServiceServer).Identify(ctx, req.(*IdentityReq)) + } + return interceptor(ctx, in, info, handler) +} + +// AuthnService_ServiceDesc is the grpc.ServiceDesc for AuthnService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AuthnService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "magistrala.AuthnService", + HandlerType: (*AuthnServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Issue", + Handler: _AuthnService_Issue_Handler, + }, + { + MethodName: "Refresh", + Handler: _AuthnService_Refresh_Handler, + }, + { + MethodName: "Identify", + Handler: _AuthnService_Identify_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "auth.proto", +} + +const ( + PolicyService_AddPolicy_FullMethodName = "/magistrala.PolicyService/AddPolicy" + PolicyService_AddPolicies_FullMethodName = "/magistrala.PolicyService/AddPolicies" + PolicyService_DeletePolicyFilter_FullMethodName = "/magistrala.PolicyService/DeletePolicyFilter" + PolicyService_DeletePolicies_FullMethodName = "/magistrala.PolicyService/DeletePolicies" + PolicyService_ListObjects_FullMethodName = "/magistrala.PolicyService/ListObjects" + PolicyService_ListAllObjects_FullMethodName = "/magistrala.PolicyService/ListAllObjects" + PolicyService_CountObjects_FullMethodName = "/magistrala.PolicyService/CountObjects" + PolicyService_ListSubjects_FullMethodName = "/magistrala.PolicyService/ListSubjects" + PolicyService_ListAllSubjects_FullMethodName = "/magistrala.PolicyService/ListAllSubjects" + PolicyService_CountSubjects_FullMethodName = "/magistrala.PolicyService/CountSubjects" + PolicyService_ListPermissions_FullMethodName = "/magistrala.PolicyService/ListPermissions" + PolicyService_DeleteEntityPolicies_FullMethodName = "/magistrala.PolicyService/DeleteEntityPolicies" +) + +// PolicyServiceClient is the client API for PolicyService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// PolicyService is a service that provides policy CRUD +// functionalities for magistrala services. +type PolicyServiceClient interface { + AddPolicy(ctx context.Context, in *AddPolicyReq, opts ...grpc.CallOption) (*AddPolicyRes, error) + AddPolicies(ctx context.Context, in *AddPoliciesReq, opts ...grpc.CallOption) (*AddPoliciesRes, error) + DeletePolicyFilter(ctx context.Context, in *DeletePolicyFilterReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) + DeletePolicies(ctx context.Context, in *DeletePoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) + ListObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) + ListAllObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) + CountObjects(ctx context.Context, in *CountObjectsReq, opts ...grpc.CallOption) (*CountObjectsRes, error) + ListSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) + ListAllSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) + CountSubjects(ctx context.Context, in *CountSubjectsReq, opts ...grpc.CallOption) (*CountSubjectsRes, error) + ListPermissions(ctx context.Context, in *ListPermissionsReq, opts ...grpc.CallOption) (*ListPermissionsRes, error) + DeleteEntityPolicies(ctx context.Context, in *DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) +} + +type policyServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewPolicyServiceClient(cc grpc.ClientConnInterface) PolicyServiceClient { + return &policyServiceClient{cc} } -func (c *authServiceClient) AddPolicy(ctx context.Context, in *AddPolicyReq, opts ...grpc.CallOption) (*AddPolicyRes, error) { +func (c *policyServiceClient) AddPolicy(ctx context.Context, in *AddPolicyReq, opts ...grpc.CallOption) (*AddPolicyRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddPolicyRes) - err := c.cc.Invoke(ctx, AuthService_AddPolicy_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_AddPolicy_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) AddPolicies(ctx context.Context, in *AddPoliciesReq, opts ...grpc.CallOption) (*AddPoliciesRes, error) { +func (c *policyServiceClient) AddPolicies(ctx context.Context, in *AddPoliciesReq, opts ...grpc.CallOption) (*AddPoliciesRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AddPoliciesRes) - err := c.cc.Invoke(ctx, AuthService_AddPolicies_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_AddPolicies_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) DeletePolicyFilter(ctx context.Context, in *DeletePolicyFilterReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) { +func (c *policyServiceClient) DeletePolicyFilter(ctx context.Context, in *DeletePolicyFilterReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeletePolicyRes) - err := c.cc.Invoke(ctx, AuthService_DeletePolicyFilter_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_DeletePolicyFilter_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) DeletePolicies(ctx context.Context, in *DeletePoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) { +func (c *policyServiceClient) DeletePolicies(ctx context.Context, in *DeletePoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeletePolicyRes) - err := c.cc.Invoke(ctx, AuthService_DeletePolicies_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_DeletePolicies_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) ListObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) { +func (c *policyServiceClient) ListObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListObjectsRes) - err := c.cc.Invoke(ctx, AuthService_ListObjects_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_ListObjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) ListAllObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) { +func (c *policyServiceClient) ListAllObjects(ctx context.Context, in *ListObjectsReq, opts ...grpc.CallOption) (*ListObjectsRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListObjectsRes) - err := c.cc.Invoke(ctx, AuthService_ListAllObjects_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_ListAllObjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) CountObjects(ctx context.Context, in *CountObjectsReq, opts ...grpc.CallOption) (*CountObjectsRes, error) { +func (c *policyServiceClient) CountObjects(ctx context.Context, in *CountObjectsReq, opts ...grpc.CallOption) (*CountObjectsRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CountObjectsRes) - err := c.cc.Invoke(ctx, AuthService_CountObjects_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_CountObjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) ListSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) { +func (c *policyServiceClient) ListSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListSubjectsRes) - err := c.cc.Invoke(ctx, AuthService_ListSubjects_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_ListSubjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) ListAllSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) { +func (c *policyServiceClient) ListAllSubjects(ctx context.Context, in *ListSubjectsReq, opts ...grpc.CallOption) (*ListSubjectsRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListSubjectsRes) - err := c.cc.Invoke(ctx, AuthService_ListAllSubjects_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_ListAllSubjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) CountSubjects(ctx context.Context, in *CountSubjectsReq, opts ...grpc.CallOption) (*CountSubjectsRes, error) { +func (c *policyServiceClient) CountSubjects(ctx context.Context, in *CountSubjectsReq, opts ...grpc.CallOption) (*CountSubjectsRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CountSubjectsRes) - err := c.cc.Invoke(ctx, AuthService_CountSubjects_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_CountSubjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) ListPermissions(ctx context.Context, in *ListPermissionsReq, opts ...grpc.CallOption) (*ListPermissionsRes, error) { +func (c *policyServiceClient) ListPermissions(ctx context.Context, in *ListPermissionsReq, opts ...grpc.CallOption) (*ListPermissionsRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListPermissionsRes) - err := c.cc.Invoke(ctx, AuthService_ListPermissions_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_ListPermissions_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *authServiceClient) DeleteEntityPolicies(ctx context.Context, in *DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) { +func (c *policyServiceClient) DeleteEntityPolicies(ctx context.Context, in *DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*DeletePolicyRes, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeletePolicyRes) - err := c.cc.Invoke(ctx, AuthService_DeleteEntityPolicies_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, PolicyService_DeleteEntityPolicies_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -// AuthServiceServer is the server API for AuthService service. -// All implementations must embed UnimplementedAuthServiceServer +// PolicyServiceServer is the server API for PolicyService service. +// All implementations must embed UnimplementedPolicyServiceServer // for forward compatibility // -// AuthService is a service that provides authentication and authorization -// functionalities for the users service. -type AuthServiceServer interface { - Issue(context.Context, *IssueReq) (*Token, error) - Refresh(context.Context, *RefreshReq) (*Token, error) - Identify(context.Context, *IdentityReq) (*IdentityRes, error) - Authorize(context.Context, *AuthorizeReq) (*AuthorizeRes, error) +// PolicyService is a service that provides policy CRUD +// functionalities for magistrala services. +type PolicyServiceServer interface { AddPolicy(context.Context, *AddPolicyReq) (*AddPolicyRes, error) AddPolicies(context.Context, *AddPoliciesReq) (*AddPoliciesRes, error) DeletePolicyFilter(context.Context, *DeletePolicyFilterReq) (*DeletePolicyRes, error) @@ -357,432 +478,332 @@ type AuthServiceServer interface { CountSubjects(context.Context, *CountSubjectsReq) (*CountSubjectsRes, error) ListPermissions(context.Context, *ListPermissionsReq) (*ListPermissionsRes, error) DeleteEntityPolicies(context.Context, *DeleteEntityPoliciesReq) (*DeletePolicyRes, error) - mustEmbedUnimplementedAuthServiceServer() + mustEmbedUnimplementedPolicyServiceServer() } -// UnimplementedAuthServiceServer must be embedded to have forward compatible implementations. -type UnimplementedAuthServiceServer struct { +// UnimplementedPolicyServiceServer must be embedded to have forward compatible implementations. +type UnimplementedPolicyServiceServer struct { } -func (UnimplementedAuthServiceServer) Issue(context.Context, *IssueReq) (*Token, error) { - return nil, status.Errorf(codes.Unimplemented, "method Issue not implemented") -} -func (UnimplementedAuthServiceServer) Refresh(context.Context, *RefreshReq) (*Token, error) { - return nil, status.Errorf(codes.Unimplemented, "method Refresh not implemented") -} -func (UnimplementedAuthServiceServer) Identify(context.Context, *IdentityReq) (*IdentityRes, error) { - return nil, status.Errorf(codes.Unimplemented, "method Identify not implemented") -} -func (UnimplementedAuthServiceServer) Authorize(context.Context, *AuthorizeReq) (*AuthorizeRes, error) { - return nil, status.Errorf(codes.Unimplemented, "method Authorize not implemented") -} -func (UnimplementedAuthServiceServer) AddPolicy(context.Context, *AddPolicyReq) (*AddPolicyRes, error) { +func (UnimplementedPolicyServiceServer) AddPolicy(context.Context, *AddPolicyReq) (*AddPolicyRes, error) { return nil, status.Errorf(codes.Unimplemented, "method AddPolicy not implemented") } -func (UnimplementedAuthServiceServer) AddPolicies(context.Context, *AddPoliciesReq) (*AddPoliciesRes, error) { +func (UnimplementedPolicyServiceServer) AddPolicies(context.Context, *AddPoliciesReq) (*AddPoliciesRes, error) { return nil, status.Errorf(codes.Unimplemented, "method AddPolicies not implemented") } -func (UnimplementedAuthServiceServer) DeletePolicyFilter(context.Context, *DeletePolicyFilterReq) (*DeletePolicyRes, error) { +func (UnimplementedPolicyServiceServer) DeletePolicyFilter(context.Context, *DeletePolicyFilterReq) (*DeletePolicyRes, error) { return nil, status.Errorf(codes.Unimplemented, "method DeletePolicyFilter not implemented") } -func (UnimplementedAuthServiceServer) DeletePolicies(context.Context, *DeletePoliciesReq) (*DeletePolicyRes, error) { +func (UnimplementedPolicyServiceServer) DeletePolicies(context.Context, *DeletePoliciesReq) (*DeletePolicyRes, error) { return nil, status.Errorf(codes.Unimplemented, "method DeletePolicies not implemented") } -func (UnimplementedAuthServiceServer) ListObjects(context.Context, *ListObjectsReq) (*ListObjectsRes, error) { +func (UnimplementedPolicyServiceServer) ListObjects(context.Context, *ListObjectsReq) (*ListObjectsRes, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") } -func (UnimplementedAuthServiceServer) ListAllObjects(context.Context, *ListObjectsReq) (*ListObjectsRes, error) { +func (UnimplementedPolicyServiceServer) ListAllObjects(context.Context, *ListObjectsReq) (*ListObjectsRes, error) { return nil, status.Errorf(codes.Unimplemented, "method ListAllObjects not implemented") } -func (UnimplementedAuthServiceServer) CountObjects(context.Context, *CountObjectsReq) (*CountObjectsRes, error) { +func (UnimplementedPolicyServiceServer) CountObjects(context.Context, *CountObjectsReq) (*CountObjectsRes, error) { return nil, status.Errorf(codes.Unimplemented, "method CountObjects not implemented") } -func (UnimplementedAuthServiceServer) ListSubjects(context.Context, *ListSubjectsReq) (*ListSubjectsRes, error) { +func (UnimplementedPolicyServiceServer) ListSubjects(context.Context, *ListSubjectsReq) (*ListSubjectsRes, error) { return nil, status.Errorf(codes.Unimplemented, "method ListSubjects not implemented") } -func (UnimplementedAuthServiceServer) ListAllSubjects(context.Context, *ListSubjectsReq) (*ListSubjectsRes, error) { +func (UnimplementedPolicyServiceServer) ListAllSubjects(context.Context, *ListSubjectsReq) (*ListSubjectsRes, error) { return nil, status.Errorf(codes.Unimplemented, "method ListAllSubjects not implemented") } -func (UnimplementedAuthServiceServer) CountSubjects(context.Context, *CountSubjectsReq) (*CountSubjectsRes, error) { +func (UnimplementedPolicyServiceServer) CountSubjects(context.Context, *CountSubjectsReq) (*CountSubjectsRes, error) { return nil, status.Errorf(codes.Unimplemented, "method CountSubjects not implemented") } -func (UnimplementedAuthServiceServer) ListPermissions(context.Context, *ListPermissionsReq) (*ListPermissionsRes, error) { +func (UnimplementedPolicyServiceServer) ListPermissions(context.Context, *ListPermissionsReq) (*ListPermissionsRes, error) { return nil, status.Errorf(codes.Unimplemented, "method ListPermissions not implemented") } -func (UnimplementedAuthServiceServer) DeleteEntityPolicies(context.Context, *DeleteEntityPoliciesReq) (*DeletePolicyRes, error) { +func (UnimplementedPolicyServiceServer) DeleteEntityPolicies(context.Context, *DeleteEntityPoliciesReq) (*DeletePolicyRes, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteEntityPolicies not implemented") } -func (UnimplementedAuthServiceServer) mustEmbedUnimplementedAuthServiceServer() {} +func (UnimplementedPolicyServiceServer) mustEmbedUnimplementedPolicyServiceServer() {} -// UnsafeAuthServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to AuthServiceServer will +// UnsafePolicyServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to PolicyServiceServer will // result in compilation errors. -type UnsafeAuthServiceServer interface { - mustEmbedUnimplementedAuthServiceServer() +type UnsafePolicyServiceServer interface { + mustEmbedUnimplementedPolicyServiceServer() } -func RegisterAuthServiceServer(s grpc.ServiceRegistrar, srv AuthServiceServer) { - s.RegisterService(&AuthService_ServiceDesc, srv) +func RegisterPolicyServiceServer(s grpc.ServiceRegistrar, srv PolicyServiceServer) { + s.RegisterService(&PolicyService_ServiceDesc, srv) } -func _AuthService_Issue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(IssueReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).Issue(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: AuthService_Issue_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).Issue(ctx, req.(*IssueReq)) - } - return interceptor(ctx, in, info, handler) -} - -func _AuthService_Refresh_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).Refresh(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: AuthService_Refresh_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).Refresh(ctx, req.(*RefreshReq)) - } - return interceptor(ctx, in, info, handler) -} - -func _AuthService_Identify_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(IdentityReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).Identify(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: AuthService_Identify_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).Identify(ctx, req.(*IdentityReq)) - } - return interceptor(ctx, in, info, handler) -} - -func _AuthService_Authorize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AuthorizeReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).Authorize(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: AuthService_Authorize_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).Authorize(ctx, req.(*AuthorizeReq)) - } - return interceptor(ctx, in, info, handler) -} - -func _AuthService_AddPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_AddPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AddPolicyReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).AddPolicy(ctx, in) + return srv.(PolicyServiceServer).AddPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_AddPolicy_FullMethodName, + FullMethod: PolicyService_AddPolicy_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).AddPolicy(ctx, req.(*AddPolicyReq)) + return srv.(PolicyServiceServer).AddPolicy(ctx, req.(*AddPolicyReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_AddPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_AddPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AddPoliciesReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).AddPolicies(ctx, in) + return srv.(PolicyServiceServer).AddPolicies(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_AddPolicies_FullMethodName, + FullMethod: PolicyService_AddPolicies_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).AddPolicies(ctx, req.(*AddPoliciesReq)) + return srv.(PolicyServiceServer).AddPolicies(ctx, req.(*AddPoliciesReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_DeletePolicyFilter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_DeletePolicyFilter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeletePolicyFilterReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).DeletePolicyFilter(ctx, in) + return srv.(PolicyServiceServer).DeletePolicyFilter(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_DeletePolicyFilter_FullMethodName, + FullMethod: PolicyService_DeletePolicyFilter_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).DeletePolicyFilter(ctx, req.(*DeletePolicyFilterReq)) + return srv.(PolicyServiceServer).DeletePolicyFilter(ctx, req.(*DeletePolicyFilterReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_DeletePolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_DeletePolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeletePoliciesReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).DeletePolicies(ctx, in) + return srv.(PolicyServiceServer).DeletePolicies(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_DeletePolicies_FullMethodName, + FullMethod: PolicyService_DeletePolicies_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).DeletePolicies(ctx, req.(*DeletePoliciesReq)) + return srv.(PolicyServiceServer).DeletePolicies(ctx, req.(*DeletePoliciesReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListObjectsReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).ListObjects(ctx, in) + return srv.(PolicyServiceServer).ListObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_ListObjects_FullMethodName, + FullMethod: PolicyService_ListObjects_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).ListObjects(ctx, req.(*ListObjectsReq)) + return srv.(PolicyServiceServer).ListObjects(ctx, req.(*ListObjectsReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_ListAllObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_ListAllObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListObjectsReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).ListAllObjects(ctx, in) + return srv.(PolicyServiceServer).ListAllObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_ListAllObjects_FullMethodName, + FullMethod: PolicyService_ListAllObjects_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).ListAllObjects(ctx, req.(*ListObjectsReq)) + return srv.(PolicyServiceServer).ListAllObjects(ctx, req.(*ListObjectsReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_CountObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_CountObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CountObjectsReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).CountObjects(ctx, in) + return srv.(PolicyServiceServer).CountObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_CountObjects_FullMethodName, + FullMethod: PolicyService_CountObjects_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).CountObjects(ctx, req.(*CountObjectsReq)) + return srv.(PolicyServiceServer).CountObjects(ctx, req.(*CountObjectsReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_ListSubjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_ListSubjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListSubjectsReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).ListSubjects(ctx, in) + return srv.(PolicyServiceServer).ListSubjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_ListSubjects_FullMethodName, + FullMethod: PolicyService_ListSubjects_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).ListSubjects(ctx, req.(*ListSubjectsReq)) + return srv.(PolicyServiceServer).ListSubjects(ctx, req.(*ListSubjectsReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_ListAllSubjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_ListAllSubjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListSubjectsReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).ListAllSubjects(ctx, in) + return srv.(PolicyServiceServer).ListAllSubjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_ListAllSubjects_FullMethodName, + FullMethod: PolicyService_ListAllSubjects_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).ListAllSubjects(ctx, req.(*ListSubjectsReq)) + return srv.(PolicyServiceServer).ListAllSubjects(ctx, req.(*ListSubjectsReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_CountSubjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_CountSubjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CountSubjectsReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).CountSubjects(ctx, in) + return srv.(PolicyServiceServer).CountSubjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_CountSubjects_FullMethodName, + FullMethod: PolicyService_CountSubjects_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).CountSubjects(ctx, req.(*CountSubjectsReq)) + return srv.(PolicyServiceServer).CountSubjects(ctx, req.(*CountSubjectsReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_ListPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_ListPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListPermissionsReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).ListPermissions(ctx, in) + return srv.(PolicyServiceServer).ListPermissions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_ListPermissions_FullMethodName, + FullMethod: PolicyService_ListPermissions_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).ListPermissions(ctx, req.(*ListPermissionsReq)) + return srv.(PolicyServiceServer).ListPermissions(ctx, req.(*ListPermissionsReq)) } return interceptor(ctx, in, info, handler) } -func _AuthService_DeleteEntityPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _PolicyService_DeleteEntityPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteEntityPoliciesReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AuthServiceServer).DeleteEntityPolicies(ctx, in) + return srv.(PolicyServiceServer).DeleteEntityPolicies(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AuthService_DeleteEntityPolicies_FullMethodName, + FullMethod: PolicyService_DeleteEntityPolicies_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).DeleteEntityPolicies(ctx, req.(*DeleteEntityPoliciesReq)) + return srv.(PolicyServiceServer).DeleteEntityPolicies(ctx, req.(*DeleteEntityPoliciesReq)) } return interceptor(ctx, in, info, handler) } -// AuthService_ServiceDesc is the grpc.ServiceDesc for AuthService service. +// PolicyService_ServiceDesc is the grpc.ServiceDesc for PolicyService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) -var AuthService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "magistrala.AuthService", - HandlerType: (*AuthServiceServer)(nil), +var PolicyService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "magistrala.PolicyService", + HandlerType: (*PolicyServiceServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "Issue", - Handler: _AuthService_Issue_Handler, - }, - { - MethodName: "Refresh", - Handler: _AuthService_Refresh_Handler, - }, - { - MethodName: "Identify", - Handler: _AuthService_Identify_Handler, - }, - { - MethodName: "Authorize", - Handler: _AuthService_Authorize_Handler, - }, { MethodName: "AddPolicy", - Handler: _AuthService_AddPolicy_Handler, + Handler: _PolicyService_AddPolicy_Handler, }, { MethodName: "AddPolicies", - Handler: _AuthService_AddPolicies_Handler, + Handler: _PolicyService_AddPolicies_Handler, }, { MethodName: "DeletePolicyFilter", - Handler: _AuthService_DeletePolicyFilter_Handler, + Handler: _PolicyService_DeletePolicyFilter_Handler, }, { MethodName: "DeletePolicies", - Handler: _AuthService_DeletePolicies_Handler, + Handler: _PolicyService_DeletePolicies_Handler, }, { MethodName: "ListObjects", - Handler: _AuthService_ListObjects_Handler, + Handler: _PolicyService_ListObjects_Handler, }, { MethodName: "ListAllObjects", - Handler: _AuthService_ListAllObjects_Handler, + Handler: _PolicyService_ListAllObjects_Handler, }, { MethodName: "CountObjects", - Handler: _AuthService_CountObjects_Handler, + Handler: _PolicyService_CountObjects_Handler, }, { MethodName: "ListSubjects", - Handler: _AuthService_ListSubjects_Handler, + Handler: _PolicyService_ListSubjects_Handler, }, { MethodName: "ListAllSubjects", - Handler: _AuthService_ListAllSubjects_Handler, + Handler: _PolicyService_ListAllSubjects_Handler, }, { MethodName: "CountSubjects", - Handler: _AuthService_CountSubjects_Handler, + Handler: _PolicyService_CountSubjects_Handler, }, { MethodName: "ListPermissions", - Handler: _AuthService_ListPermissions_Handler, + Handler: _PolicyService_ListPermissions_Handler, }, { MethodName: "DeleteEntityPolicies", - Handler: _AuthService_DeleteEntityPolicies_Handler, + Handler: _PolicyService_DeleteEntityPolicies_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/bootstrap/events/producer/streams_test.go b/bootstrap/events/producer/streams_test.go index 759c689a2d..cfb2e5618e 100644 --- a/bootstrap/events/producer/streams_test.go +++ b/bootstrap/events/producer/streams_test.go @@ -84,24 +84,38 @@ var ( } ) -func newService(t *testing.T, url string) (bootstrap.Service, *mocks.ConfigRepository, *authmocks.AuthClient, *sdkmocks.SDK) { +type testVariable struct { + svc bootstrap.Service + boot *mocks.ConfigRepository + auth *authmocks.AuthServiceClient + policy *authmocks.PolicyServiceClient + sdk *sdkmocks.SDK +} + +func newTestVariable(t *testing.T, redisURL string) testVariable { boot := new(mocks.ConfigRepository) - auth := new(authmocks.AuthClient) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) sdk := new(sdkmocks.SDK) idp := uuid.NewMock() - svc := bootstrap.New(auth, boot, sdk, encKey, idp) - publisher, err := store.NewPublisher(context.Background(), url, streamID) + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + publisher, err := store.NewPublisher(context.Background(), redisURL, streamID) require.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) svc = producer.NewEventStoreMiddleware(svc, publisher) - - return svc, boot, auth, sdk + return testVariable{ + svc: svc, + boot: boot, + auth: auth, + policy: policy, + sdk: sdk, + } } func TestAdd(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, auth, sdk := newService(t, redisURL) + tv := newTestVariable(t, redisURL) var channels []string for _, ch := range config.Channels { @@ -204,13 +218,13 @@ func TestAdd(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) - authCall1 := auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) - sdkCall := sdk.On("Thing", tc.config.ThingID, tc.token).Return(mgsdk.Thing{ID: tc.config.ThingID, Credentials: mgsdk.Credentials{Secret: tc.config.ThingKey}}, errors.NewSDKError(tc.thingErr)) - repoCall := boot.On("ListExisting", context.Background(), domainID, mock.Anything).Return(tc.config.Channels, tc.listErr) - repoCall1 := boot.On("Save", context.Background(), mock.Anything, mock.Anything).Return(mock.Anything, tc.saveErr) + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) + authCall1 := tv.auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) + sdkCall := tv.sdk.On("Thing", tc.config.ThingID, tc.token).Return(mgsdk.Thing{ID: tc.config.ThingID, Credentials: mgsdk.Credentials{Secret: tc.config.ThingKey}}, errors.NewSDKError(tc.thingErr)) + repoCall := tv.boot.On("ListExisting", context.Background(), domainID, mock.Anything).Return(tc.config.Channels, tc.listErr) + repoCall1 := tv.boot.On("Save", context.Background(), mock.Anything, mock.Anything).Return(mock.Anything, tc.saveErr) - _, err := svc.Add(context.Background(), tc.token, tc.config) + _, err := tv.svc.Add(context.Background(), tc.token, tc.config) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -239,7 +253,7 @@ func TestView(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, auth, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) nonExisting := config nonExisting.ThingID = unknownThingID @@ -310,11 +324,11 @@ func TestView(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) - authCall1 := auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) - repoCall := boot.On("RetrieveByID", context.Background(), tc.domainID, tc.config.ThingID).Return(config, tc.retrieveErr) + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) + authCall1 := tv.auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) + repoCall := tv.boot.On("RetrieveByID", context.Background(), tc.domainID, tc.config.ThingID).Return(config, tc.retrieveErr) - _, err := svc.View(context.Background(), tc.token, tc.config.ThingID) + _, err := tv.svc.View(context.Background(), tc.token, tc.config.ThingID) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -342,7 +356,7 @@ func TestUpdate(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, auth, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) c := config @@ -431,10 +445,10 @@ func TestUpdate(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) - authCall1 := auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) - repoCall := boot.On("Update", context.Background(), mock.Anything).Return(tc.updateErr) - err := svc.Update(context.Background(), tc.token, tc.config) + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) + authCall1 := tv.auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) + repoCall := tv.boot.On("Update", context.Background(), mock.Anything).Return(tc.updateErr) + err := tv.svc.Update(context.Background(), tc.token, tc.config) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -462,7 +476,7 @@ func TestUpdateConnections(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, auth, sdk := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -570,13 +584,13 @@ func TestUpdateConnections(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) - authCall1 := auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) - sdkCall := sdk.On("Channel", mock.Anything, tc.token).Return(mgsdk.Channel{}, tc.channelErr) - repoCall := boot.On("RetrieveByID", context.Background(), tc.domainID, tc.configID).Return(config, tc.retrieveErr) - repoCall1 := boot.On("ListExisting", context.Background(), domainID, mock.Anything, mock.Anything).Return(config.Channels, tc.listErr) - repoCall2 := boot.On("UpdateConnections", context.Background(), tc.domainID, tc.configID, mock.Anything, tc.connections).Return(tc.updateErr) - err := svc.UpdateConnections(context.Background(), tc.token, tc.configID, tc.connections) + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.id, DomainId: tc.domainID}, tc.identifyErr) + authCall1 := tv.auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) + sdkCall := tv.sdk.On("Channel", mock.Anything, tc.token).Return(mgsdk.Channel{}, tc.channelErr) + repoCall := tv.boot.On("RetrieveByID", context.Background(), tc.domainID, tc.configID).Return(config, tc.retrieveErr) + repoCall1 := tv.boot.On("ListExisting", context.Background(), domainID, mock.Anything, mock.Anything).Return(config.Channels, tc.listErr) + repoCall2 := tv.boot.On("UpdateConnections", context.Background(), tc.domainID, tc.configID, mock.Anything, tc.connections).Return(tc.updateErr) + err := tv.svc.UpdateConnections(context.Background(), tc.token, tc.configID, tc.connections) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -605,7 +619,7 @@ func TestUpdateCert(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, auth, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -744,10 +758,10 @@ func TestUpdateCert(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) - authCall1 := auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) - repoCall := boot.On("UpdateCert", context.Background(), tc.domainID, tc.configID, tc.clientCert, tc.clientKey, tc.caCert).Return(config, tc.updateErr) - _, err := svc.UpdateCert(context.Background(), tc.token, tc.configID, tc.clientCert, tc.clientKey, tc.caCert) + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) + authCall1 := tv.auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) + repoCall := tv.boot.On("UpdateCert", context.Background(), tc.domainID, tc.configID, tc.clientCert, tc.clientKey, tc.caCert).Return(config, tc.updateErr) + _, err := tv.svc.UpdateCert(context.Background(), tc.token, tc.configID, tc.clientCert, tc.clientKey, tc.caCert) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) @@ -772,7 +786,8 @@ func TestUpdateCert(t *testing.T) { } func TestList(t *testing.T) { - svc, boot, auth, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) + numThings := 101 var c bootstrap.Config saved := make([]bootstrap.Config, 0) @@ -997,15 +1012,15 @@ func TestList(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) - authCall1 := auth.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) + authCall1 := tv.auth.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: authsvc.UserType, Subject: tc.userID, Permission: authsvc.AdminPermission, ObjectType: authsvc.PlatformType, Object: authsvc.MagistralaObject, }).Return(tc.superAdminAuthRes, tc.superAdmiAuthErr) - authCall2 := auth.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall2 := tv.auth.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: authsvc.UserType, SubjectKind: authsvc.UsersKind, Subject: tc.userID, @@ -1013,15 +1028,15 @@ func TestList(t *testing.T) { ObjectType: authsvc.DomainType, Object: tc.domainID, }).Return(tc.domainAdminAuthRes, tc.domainAdmiAuthErr) - authCall3 := auth.On("ListAllObjects", mock.Anything, &magistrala.ListObjectsReq{ + authCall3 := tv.policy.On("ListAllObjects", mock.Anything, &magistrala.ListObjectsReq{ SubjectType: authsvc.UserType, Subject: tc.userID, Permission: authsvc.ViewPermission, ObjectType: authsvc.ThingType, }).Return(tc.listObjectsResponse, tc.listObjectsErr) - repoCall := boot.On("RetrieveAll", context.Background(), mock.Anything, mock.Anything, tc.filter, tc.offset, tc.limit).Return(tc.config, tc.retrieveErr) + repoCall := tv.boot.On("RetrieveAll", context.Background(), mock.Anything, mock.Anything, tc.filter, tc.offset, tc.limit).Return(tc.config, tc.retrieveErr) - _, err := svc.List(context.Background(), tc.token, tc.filter, tc.offset, tc.limit) + _, err := tv.svc.List(context.Background(), tc.token, tc.filter, tc.offset, tc.limit) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1050,7 +1065,7 @@ func TestRemove(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, auth, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) nonExisting := config nonExisting.ThingID = unknownThingID @@ -1116,10 +1131,10 @@ func TestRemove(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) - authCall1 := auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) - repoCall := boot.On("Remove", context.Background(), mock.Anything, mock.Anything).Return(tc.removeErr) - err := svc.Remove(context.Background(), tc.token, tc.configID) + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) + authCall1 := tv.auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authResponse, tc.authorizeErr) + repoCall := tv.boot.On("Remove", context.Background(), mock.Anything, mock.Anything).Return(tc.removeErr) + err := tv.svc.Remove(context.Background(), tc.token, tc.configID) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1145,7 +1160,7 @@ func TestBootstrap(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, _, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -1184,8 +1199,8 @@ func TestBootstrap(t *testing.T) { lastID := "0" for _, tc := range cases { - repoCall := boot.On("RetrieveByExternalID", context.Background(), mock.Anything).Return(config, tc.retrieveErr) - _, err = svc.Bootstrap(context.Background(), tc.externalKey, tc.externalID, false) + repoCall := tv.boot.On("RetrieveByExternalID", context.Background(), mock.Anything).Return(config, tc.retrieveErr) + _, err = tv.svc.Bootstrap(context.Background(), tc.externalKey, tc.externalID, false) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1208,7 +1223,7 @@ func TestChangeState(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, auth, sdk := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -1288,11 +1303,11 @@ func TestChangeState(t *testing.T) { lastID := "0" for _, tc := range cases { - authCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) - repoCall := boot.On("RetrieveByID", context.Background(), tc.domainID, tc.id).Return(config, tc.retrieveErr) - sdkCall1 := sdk.On("Connect", mock.Anything, mock.Anything).Return(errors.NewSDKError(tc.connectErr)) - repoCall1 := boot.On("ChangeState", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(tc.stateErr) - err := svc.ChangeState(context.Background(), tc.token, tc.id, tc.state) + authCall := tv.auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: tc.userID, DomainId: tc.domainID}, tc.identifyErr) + repoCall := tv.boot.On("RetrieveByID", context.Background(), tc.domainID, tc.id).Return(config, tc.retrieveErr) + sdkCall1 := tv.sdk.On("Connect", mock.Anything, mock.Anything).Return(errors.NewSDKError(tc.connectErr)) + repoCall1 := tv.boot.On("ChangeState", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(tc.stateErr) + err := tv.svc.ChangeState(context.Background(), tc.token, tc.id, tc.state) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1319,7 +1334,7 @@ func TestUpdateChannelHandler(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, _, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -1375,8 +1390,8 @@ func TestUpdateChannelHandler(t *testing.T) { lastID := "0" for _, tc := range cases { - repoCall := boot.On("UpdateChannel", context.Background(), mock.Anything).Return(tc.err) - err := svc.UpdateChannelHandler(context.Background(), tc.channel) + repoCall := tv.boot.On("UpdateChannel", context.Background(), mock.Anything).Return(tc.err) + err := tv.svc.UpdateChannelHandler(context.Background(), tc.channel) assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1401,7 +1416,7 @@ func TestRemoveChannelHandler(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, _, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -1436,8 +1451,8 @@ func TestRemoveChannelHandler(t *testing.T) { lastID := "0" for _, tc := range cases { - repoCall := boot.On("RemoveChannel", context.Background(), mock.Anything).Return(tc.err) - err := svc.RemoveChannelHandler(context.Background(), tc.channelID) + repoCall := tv.boot.On("RemoveChannel", context.Background(), mock.Anything).Return(tc.err) + err := tv.svc.RemoveChannelHandler(context.Background(), tc.channelID) assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1463,7 +1478,7 @@ func TestRemoveConfigHandler(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, _, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -1498,8 +1513,8 @@ func TestRemoveConfigHandler(t *testing.T) { lastID := "0" for _, tc := range cases { - repoCall := boot.On("RemoveThing", context.Background(), mock.Anything).Return(tc.err) - err := svc.RemoveConfigHandler(context.Background(), tc.configID) + repoCall := tv.boot.On("RemoveThing", context.Background(), mock.Anything).Return(tc.err) + err := tv.svc.RemoveConfigHandler(context.Background(), tc.configID) assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1525,7 +1540,7 @@ func TestConnectThingHandler(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, _, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -1572,8 +1587,8 @@ func TestConnectThingHandler(t *testing.T) { lastID := "0" for _, tc := range cases { - repoCall := boot.On("ConnectThing", context.Background(), mock.Anything, mock.Anything).Return(tc.err) - err := svc.ConnectThingHandler(context.Background(), tc.channelID, tc.thingID) + repoCall := tv.boot.On("ConnectThing", context.Background(), mock.Anything, mock.Anything).Return(tc.err) + err := tv.svc.ConnectThingHandler(context.Background(), tc.channelID, tc.thingID) assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ @@ -1599,7 +1614,7 @@ func TestDisconnectThingHandler(t *testing.T) { err := redisClient.FlushAll(context.Background()).Err() assert.Nil(t, err, fmt.Sprintf("got unexpected error: %s", err)) - svc, boot, _, _ := newService(t, redisURL) + tv := newTestVariable(t, redisURL) cases := []struct { desc string @@ -1656,8 +1671,8 @@ func TestDisconnectThingHandler(t *testing.T) { lastID := "0" for _, tc := range cases { - repoCall := boot.On("DisconnectThing", context.Background(), tc.channelID, tc.thingID).Return(tc.err) - err := svc.DisconnectThingHandler(context.Background(), tc.channelID, tc.thingID) + repoCall := tv.boot.On("DisconnectThing", context.Background(), tc.channelID, tc.thingID).Return(tc.err) + err := tv.svc.DisconnectThingHandler(context.Background(), tc.channelID, tc.thingID) assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) streams := redisClient.XRead(context.Background(), &redis.XReadArgs{ diff --git a/bootstrap/service.go b/bootstrap/service.go index e3a713625d..45a6d010df 100644 --- a/bootstrap/service.go +++ b/bootstrap/service.go @@ -12,6 +12,7 @@ import ( "github.com/absmach/magistrala" "github.com/absmach/magistrala/auth" + grpcclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/pkg/errors" repoerr "github.com/absmach/magistrala/pkg/errors/repository" svcerr "github.com/absmach/magistrala/pkg/errors/service" @@ -119,7 +120,8 @@ type ConfigReader interface { } type bootstrapService struct { - auth magistrala.AuthServiceClient + auth grpcclient.AuthServiceClient + policy magistrala.PolicyServiceClient configs ConfigRepository sdk mgsdk.SDK encKey []byte @@ -127,11 +129,12 @@ type bootstrapService struct { } // New returns new Bootstrap service. -func New(uauth magistrala.AuthServiceClient, configs ConfigRepository, sdk mgsdk.SDK, encKey []byte, idp magistrala.IDProvider) Service { +func New(auth grpcclient.AuthServiceClient, policy magistrala.PolicyServiceClient, configs ConfigRepository, sdk mgsdk.SDK, encKey []byte, idp magistrala.IDProvider) Service { return &bootstrapService{ configs: configs, sdk: sdk, - auth: uauth, + auth: auth, + policy: policy, encKey: encKey, idProvider: idp, } @@ -302,7 +305,7 @@ func (bs bootstrapService) UpdateConnections(ctx context.Context, token, id stri } func (bs bootstrapService) listClientIDs(ctx context.Context, userID string) ([]string, error) { - tids, err := bs.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + tids, err := bs.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: userID, Permission: auth.ViewPermission, diff --git a/bootstrap/service_test.go b/bootstrap/service_test.go index 63960a841f..445e006f65 100644 --- a/bootstrap/service_test.go +++ b/bootstrap/service_test.go @@ -59,15 +59,6 @@ var ( } ) -func newService() (bootstrap.Service, *mocks.ConfigRepository, *authmocks.AuthClient, *sdkmocks.SDK) { - boot := new(mocks.ConfigRepository) - auth := new(authmocks.AuthClient) - sdk := new(sdkmocks.SDK) - idp := uuid.NewMock() - - return bootstrap.New(auth, boot, sdk, encKey, idp), boot, auth, sdk -} - func enc(in []byte) ([]byte, error) { block, err := aes.NewCipher(encKey) if err != nil { @@ -84,7 +75,13 @@ func enc(in []byte) ([]byte, error) { } func TestAdd(t *testing.T) { - c, boot, auth, sdk := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + neID := config neID.ThingID = "non-existent" @@ -200,7 +197,7 @@ func TestAdd(t *testing.T) { repoCall3 := boot.On("ListExisting", context.Background(), tc.domainID, mock.Anything).Return(tc.config.Channels, tc.listExistingErr) repoCall4 := boot.On("Save", context.Background(), mock.Anything, mock.Anything).Return(mock.Anything, tc.saveErr) - _, err := c.Add(context.Background(), tc.token, tc.config) + _, err := svc.Add(context.Background(), tc.token, tc.config) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) authCall.Unset() @@ -214,7 +211,12 @@ func TestAdd(t *testing.T) { } func TestView(t *testing.T) { - svc, boot, auth, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) cases := []struct { desc string @@ -308,9 +310,14 @@ func TestView(t *testing.T) { } func TestUpdate(t *testing.T) { - svc, boot, auth, _ := newService() - c := config + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + c := config ch := channel ch.ID = "2" c.Channels = append(c.Channels, ch) @@ -395,9 +402,14 @@ func TestUpdate(t *testing.T) { } func TestUpdateCert(t *testing.T) { - svc, boot, auth, _ := newService() - c := config + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + c := config ch := channel ch.ID = "2" c.Channels = append(c.Channels, ch) @@ -506,7 +518,13 @@ func TestUpdateCert(t *testing.T) { } func TestUpdateConnections(t *testing.T) { - svc, boot, auth, sdk := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + c := config c.State = bootstrap.Inactive @@ -620,7 +638,13 @@ func TestUpdateConnections(t *testing.T) { } func TestList(t *testing.T) { - svc, boot, auth, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + numThings := 101 var saved []bootstrap.Config for i := 0; i < numThings; i++ { @@ -960,7 +984,7 @@ func TestList(t *testing.T) { ObjectType: authsvc.DomainType, Object: tc.domainID, }).Return(tc.domainAdminAuthRes, tc.domainAdmiAuthErr) - authCall3 := auth.On("ListAllObjects", mock.Anything, &magistrala.ListObjectsReq{ + authCall3 := policy.On("ListAllObjects", mock.Anything, &magistrala.ListObjectsReq{ SubjectType: authsvc.UserType, Subject: tc.userID, Permission: authsvc.ViewPermission, @@ -981,7 +1005,13 @@ func TestList(t *testing.T) { } func TestRemove(t *testing.T) { - svc, boot, auth, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + c := config cases := []struct { desc string @@ -1064,7 +1094,13 @@ func TestRemove(t *testing.T) { } func TestBootstrap(t *testing.T) { - svc, boot, _, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + c := config e, err := enc([]byte(c.ExternalKey)) assert.Nil(t, err, fmt.Sprintf("Encrypting external key expected to succeed: %s.\n", err)) @@ -1131,7 +1167,12 @@ func TestBootstrap(t *testing.T) { } func TestChangeState(t *testing.T) { - svc, boot, auth, sdk := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) c := config cases := []struct { @@ -1232,7 +1273,13 @@ func TestChangeState(t *testing.T) { } func TestUpdateChannelHandler(t *testing.T) { - svc, boot, _, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + ch := bootstrap.Channel{ ID: channel.ID, Name: "new name", @@ -1265,7 +1312,12 @@ func TestUpdateChannelHandler(t *testing.T) { } func TestRemoveChannelHandler(t *testing.T) { - svc, boot, _, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) cases := []struct { desc string @@ -1293,7 +1345,12 @@ func TestRemoveChannelHandler(t *testing.T) { } func TestRemoveConfigHandler(t *testing.T) { - svc, boot, _, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) cases := []struct { desc string @@ -1321,7 +1378,13 @@ func TestRemoveConfigHandler(t *testing.T) { } func TestConnectThingsHandler(t *testing.T) { - svc, boot, _, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + cases := []struct { desc string thingID string @@ -1351,7 +1414,13 @@ func TestConnectThingsHandler(t *testing.T) { } func TestDisconnectThingsHandler(t *testing.T) { - svc, boot, _, _ := newService() + boot := new(mocks.ConfigRepository) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + sdk := new(sdkmocks.SDK) + idp := uuid.NewMock() + svc := bootstrap.New(auth, policy, boot, sdk, encKey, idp) + cases := []struct { desc string thingID string diff --git a/certs/service.go b/certs/service.go index 191b328594..be71f585e1 100644 --- a/certs/service.go +++ b/certs/service.go @@ -50,14 +50,14 @@ type Service interface { } type certsService struct { - auth magistrala.AuthServiceClient + auth magistrala.AuthnServiceClient certsRepo Repository sdk mgsdk.SDK pki pki.Agent } // New returns new Certs service. -func New(auth magistrala.AuthServiceClient, certs Repository, sdk mgsdk.SDK, pkiAgent pki.Agent) Service { +func New(auth magistrala.AuthnServiceClient, certs Repository, sdk mgsdk.SDK, pkiAgent pki.Agent) Service { return &certsService{ certsRepo: certs, sdk: sdk, diff --git a/certs/service_test.go b/certs/service_test.go index 49043ebc76..e42d4f05f2 100644 --- a/certs/service_test.go +++ b/certs/service_test.go @@ -37,10 +37,10 @@ const ( validID = "d4ebb847-5d0e-4e46-bdd9-b6aceaaa3a22" ) -func newService(_ *testing.T) (certs.Service, *mocks.Repository, *mocks.Agent, *authmocks.AuthClient, *sdkmocks.SDK) { +func newService(_ *testing.T) (certs.Service, *mocks.Repository, *mocks.Agent, *authmocks.AuthServiceClient, *sdkmocks.SDK) { repo := new(mocks.Repository) agent := new(mocks.Agent) - auth := new(authmocks.AuthClient) + auth := new(authmocks.AuthServiceClient) sdk := new(sdkmocks.SDK) return certs.New(auth, repo, sdk, agent), repo, agent, auth, sdk diff --git a/cmd/auth/main.go b/cmd/auth/main.go index a2b11b027e..d4074d920c 100644 --- a/cmd/auth/main.go +++ b/cmd/auth/main.go @@ -147,7 +147,9 @@ func main() { } registerAuthServiceServer := func(srv *grpc.Server) { reflection.Register(srv) - magistrala.RegisterAuthServiceServer(srv, grpcapi.NewServer(svc)) + magistrala.RegisterAuthzServiceServer(srv, grpcapi.NewAuthzServer(svc)) + magistrala.RegisterAuthnServiceServer(srv, grpcapi.NewAuthnServer(svc)) + magistrala.RegisterPolicyServiceServer(srv, grpcapi.NewPolicyServer(svc)) } gs := grpcserver.NewServer(ctx, cancel, svcName, grpcServerConfig, registerAuthServiceServer, logger) diff --git a/cmd/bootstrap/main.go b/cmd/bootstrap/main.go index 71a6163ba6..4dcebea286 100644 --- a/cmd/bootstrap/main.go +++ b/cmd/bootstrap/main.go @@ -14,6 +14,7 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" + authclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/bootstrap" "github.com/absmach/magistrala/bootstrap/api" "github.com/absmach/magistrala/bootstrap/events/consumer" @@ -21,9 +22,9 @@ import ( bootstrappg "github.com/absmach/magistrala/bootstrap/postgres" "github.com/absmach/magistrala/bootstrap/tracing" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" "github.com/absmach/magistrala/pkg/events" "github.com/absmach/magistrala/pkg/events/store" + "github.com/absmach/magistrala/pkg/grpcclient" "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/postgres" pgclient "github.com/absmach/magistrala/pkg/postgres" @@ -55,7 +56,7 @@ type config struct { EncKey string `env:"MG_BOOTSTRAP_ENCRYPT_KEY" envDefault:"12345678910111213141516171819202"` ESConsumerName string `env:"MG_BOOTSTRAP_EVENT_CONSUMER" envDefault:"bootstrap"` ThingsURL string `env:"MG_THINGS_URL" envDefault:"http://localhost:9000"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_BOOTSTRAP_INSTANCE_ID" envDefault:""` ESURL string `env:"MG_ES_URL" envDefault:"nats://localhost:4222"` @@ -100,21 +101,30 @@ func main() { } defer db.Close() - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + clientConfig := grpcclient.Config{} + if err := env.ParseWithOptions(&clientConfig, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authClient, authHandler, err := auth.Setup(ctx, authConfig) + authClient, authHandler, err := grpcclient.SetupAuthClient(ctx, clientConfig) if err != nil { logger.Error(err.Error()) exitCode = 1 return } defer authHandler.Close() - logger.Info("Successfully connected to auth grpc server " + authHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) + + policyClient, policyHandler, err := grpcclient.SetupPolicyClient(ctx, clientConfig) + if err != nil { + logger.Error(err.Error()) + exitCode = 1 + return + } + defer policyHandler.Close() + logger.Info("PolicyService gRPC client successfully connected to auth gRPC server " + policyHandler.Secure()) tp, err := jaeger.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio) if err != nil { @@ -130,7 +140,7 @@ func main() { tracer := tp.Tracer(svcName) // Create new service - svc, err := newService(ctx, authClient, db, tracer, logger, cfg, dbConfig) + svc, err := newService(ctx, authClient, policyClient, db, tracer, logger, cfg, dbConfig) if err != nil { logger.Error(fmt.Sprintf("failed to create %s service: %s", svcName, err)) exitCode = 1 @@ -171,7 +181,7 @@ func main() { } } -func newService(ctx context.Context, authClient magistrala.AuthServiceClient, db *sqlx.DB, tracer trace.Tracer, logger *slog.Logger, cfg config, dbConfig pgclient.Config) (bootstrap.Service, error) { +func newService(ctx context.Context, authClient authclient.AuthServiceClient, policyClient magistrala.PolicyServiceClient, db *sqlx.DB, tracer trace.Tracer, logger *slog.Logger, cfg config, dbConfig pgclient.Config) (bootstrap.Service, error) { database := postgres.NewDatabase(db, dbConfig, tracer) repoConfig := bootstrappg.NewConfigRepository(database, logger) @@ -183,7 +193,7 @@ func newService(ctx context.Context, authClient magistrala.AuthServiceClient, db sdk := mgsdk.NewSDK(config) idp := uuid.New() - svc := bootstrap.New(authClient, repoConfig, sdk, []byte(cfg.EncKey), idp) + svc := bootstrap.New(authClient, policyClient, repoConfig, sdk, []byte(cfg.EncKey), idp) publisher, err := store.NewPublisher(ctx, cfg.ESURL, streamID) if err != nil { diff --git a/cmd/certs/main.go b/cmd/certs/main.go index 73e07f2d09..236ae0928b 100644 --- a/cmd/certs/main.go +++ b/cmd/certs/main.go @@ -20,7 +20,7 @@ import ( certspg "github.com/absmach/magistrala/certs/postgres" "github.com/absmach/magistrala/certs/tracing" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/postgres" pgclient "github.com/absmach/magistrala/pkg/postgres" @@ -47,7 +47,7 @@ const ( type config struct { LogLevel string `env:"MG_CERTS_LOG_LEVEL" envDefault:"info"` ThingsURL string `env:"MG_THINGS_URL" envDefault:"http://localhost:9000"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_CERTS_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -119,14 +119,14 @@ func main() { } defer db.Close() - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + authClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&authClientCfg, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authClient, authHandler, err := auth.Setup(ctx, authConfig) + authClient, authHandler, err := grpcclient.SetupAuthClient(ctx, authClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 @@ -134,7 +134,7 @@ func main() { } defer authHandler.Close() - logger.Info("Successfully connected to auth grpc server " + authHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio) if err != nil { @@ -177,7 +177,7 @@ func main() { } } -func newService(authClient magistrala.AuthServiceClient, db *sqlx.DB, tracer trace.Tracer, logger *slog.Logger, cfg config, dbConfig pgclient.Config, pkiAgent vault.Agent) certs.Service { +func newService(authClient magistrala.AuthnServiceClient, db *sqlx.DB, tracer trace.Tracer, logger *slog.Logger, cfg config, dbConfig pgclient.Config, pkiAgent vault.Agent) certs.Service { database := postgres.NewDatabase(db, dbConfig, tracer) certsRepo := certspg.NewRepository(database, logger) config := mgsdk.Config{ diff --git a/cmd/coap/main.go b/cmd/coap/main.go index 156e5804af..f82f2fbe97 100644 --- a/cmd/coap/main.go +++ b/cmd/coap/main.go @@ -17,7 +17,7 @@ import ( "github.com/absmach/magistrala/coap/api" "github.com/absmach/magistrala/coap/tracing" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" @@ -31,18 +31,18 @@ import ( ) const ( - svcName = "coap_adapter" - envPrefix = "MG_COAP_ADAPTER_" - envPrefixHTTP = "MG_COAP_ADAPTER_HTTP_" - envPrefixAuthz = "MG_THINGS_AUTH_GRPC_" - defSvcHTTPPort = "5683" - defSvcCoAPPort = "5683" + svcName = "coap_adapter" + envPrefix = "MG_COAP_ADAPTER_" + envPrefixHTTP = "MG_COAP_ADAPTER_HTTP_" + envPrefixThings = "MG_THINGS_AUTH_GRPC_" + defSvcHTTPPort = "5683" + defSvcCoAPPort = "5683" ) type config struct { LogLevel string `env:"MG_COAP_ADAPTER_LOG_LEVEL" envDefault:"info"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_COAP_ADAPTER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -87,22 +87,22 @@ func main() { return } - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuthz}); err != nil { + thingsClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&thingsClientCfg, env.Options{Prefix: envPrefixThings}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authClient, authHandler, err := auth.SetupAuthz(ctx, authConfig) + thingsClient, thingsHandler, err := grpcclient.SetupThingsClient(ctx, thingsClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer authHandler.Close() + defer thingsHandler.Close() - logger.Info("Successfully connected to things grpc server " + authHandler.Secure()) + logger.Info("Things service gRPC client successfully connected to things gRPC server " + thingsHandler.Secure()) tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio) if err != nil { @@ -126,7 +126,7 @@ func main() { defer nps.Close() nps = brokerstracing.NewPubSub(coapServerConfig, tracer, nps) - svc := coap.New(authClient, nps) + svc := coap.New(thingsClient, nps) svc = tracing.New(tracer, svc) diff --git a/cmd/http/main.go b/cmd/http/main.go index f2c03e5135..59d84cb94b 100644 --- a/cmd/http/main.go +++ b/cmd/http/main.go @@ -19,7 +19,7 @@ import ( adapter "github.com/absmach/magistrala/http" "github.com/absmach/magistrala/http/api" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/messaging" "github.com/absmach/magistrala/pkg/messaging/brokers" @@ -38,18 +38,18 @@ import ( ) const ( - svcName = "http_adapter" - envPrefix = "MG_HTTP_ADAPTER_" - envPrefixAuthz = "MG_THINGS_AUTH_GRPC_" - defSvcHTTPPort = "80" - targetHTTPPort = "81" - targetHTTPHost = "http://localhost" + svcName = "http_adapter" + envPrefix = "MG_HTTP_ADAPTER_" + envPrefixThings = "MG_THINGS_AUTH_GRPC_" + defSvcHTTPPort = "80" + targetHTTPPort = "81" + targetHTTPHost = "http://localhost" ) type config struct { LogLevel string `env:"MG_HTTP_ADAPTER_LOG_LEVEL" envDefault:"info"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_HTTP_ADAPTER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -87,22 +87,22 @@ func main() { return } - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuthz}); err != nil { + thingsClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&thingsClientCfg, env.Options{Prefix: envPrefixThings}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authClient, authHandler, err := auth.SetupAuthz(ctx, authConfig) + thingsClient, thingsHandler, err := grpcclient.SetupThingsClient(ctx, thingsClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer authHandler.Close() + defer thingsHandler.Close() - logger.Info("Successfully connected to things grpc server " + authHandler.Secure()) + logger.Info("Things service gRPC client successfully connected to things gRPC server " + thingsHandler.Secure()) tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio) if err != nil { @@ -126,7 +126,7 @@ func main() { defer pub.Close() pub = brokerstracing.NewPublisher(httpServerConfig, tracer, pub) - svc := newService(pub, authClient, logger, tracer) + svc := newService(pub, thingsClient, logger, tracer) targetServerCfg := server.Config{Port: targetHTTPPort} hs := httpserver.NewServer(ctx, cancel, svcName, targetServerCfg, api.MakeHandler(logger, cfg.InstanceID), logger) diff --git a/cmd/invitations/main.go b/cmd/invitations/main.go index faab1d977d..e2a3d57ce6 100644 --- a/cmd/invitations/main.go +++ b/cmd/invitations/main.go @@ -14,12 +14,13 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" + authclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/invitations" "github.com/absmach/magistrala/invitations/api" "github.com/absmach/magistrala/invitations/middleware" invitationspg "github.com/absmach/magistrala/invitations/postgres" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" + "github.com/absmach/magistrala/pkg/grpcclient" "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/postgres" clientspg "github.com/absmach/magistrala/pkg/postgres" @@ -48,7 +49,7 @@ type config struct { UsersURL string `env:"MG_USERS_URL" envDefault:"http://localhost:9002"` DomainsURL string `env:"MG_DOMAINS_URL" envDefault:"http://localhost:8189"` InstanceID string `env:"MG_INVITATIONS_INSTANCE_ID" envDefault:""` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` } @@ -92,20 +93,20 @@ func main() { } defer db.Close() - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + authClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&authClientCfg, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load auth configuration : %s", err.Error())) exitCode = 1 return } - authClient, authHandler, err := auth.Setup(ctx, authConfig) + authClient, authHandler, err := grpcclient.SetupAuthClient(ctx, authClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } defer authHandler.Close() - logger.Info("Successfully connected to auth grpc server " + authHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) tp, err := jaeger.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio) if err != nil { @@ -154,7 +155,7 @@ func main() { } } -func newService(db *sqlx.DB, dbConfig clientspg.Config, authClient magistrala.AuthServiceClient, tracer trace.Tracer, conf config, logger *slog.Logger) (invitations.Service, error) { +func newService(db *sqlx.DB, dbConfig clientspg.Config, authClient authclient.AuthServiceClient, tracer trace.Tracer, conf config, logger *slog.Logger) (invitations.Service, error) { database := postgres.NewDatabase(db, dbConfig, tracer) repo := invitationspg.NewRepository(database) diff --git a/cmd/journal/main.go b/cmd/journal/main.go index d05beb3c79..df58c42e95 100644 --- a/cmd/journal/main.go +++ b/cmd/journal/main.go @@ -14,14 +14,15 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" + authclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/journal" "github.com/absmach/magistrala/journal/api" "github.com/absmach/magistrala/journal/events" "github.com/absmach/magistrala/journal/middleware" journalpg "github.com/absmach/magistrala/journal/postgres" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" "github.com/absmach/magistrala/pkg/events/store" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/postgres" pgclient "github.com/absmach/magistrala/pkg/postgres" @@ -47,7 +48,7 @@ const ( type config struct { LogLevel string `env:"MG_JOURNAL_LOG_LEVEL" envDefault:"info"` ESURL string `env:"MG_ES_URL" envDefault:"nats://localhost:4222"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_JOURNAL_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -92,22 +93,22 @@ func main() { } defer db.Close() - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + authClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&authClientCfg, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - ac, acHandler, err := auth.Setup(ctx, authConfig) + authClient, authHandler, err := grpcclient.SetupAuthClient(ctx, authClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer acHandler.Close() + defer authHandler.Close() - logger.Info("Successfully connected to auth grpc server " + acHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio) if err != nil { @@ -122,7 +123,7 @@ func main() { }() tracer := tp.Tracer(svcName) - svc := newService(db, dbConfig, ac, logger, tracer) + svc := newService(db, dbConfig, authClient, logger, tracer) subscriber, err := store.NewSubscriber(ctx, cfg.ESURL, logger) if err != nil { @@ -166,7 +167,7 @@ func main() { } } -func newService(db *sqlx.DB, dbConfig pgclient.Config, authClient magistrala.AuthServiceClient, logger *slog.Logger, tracer trace.Tracer) journal.Service { +func newService(db *sqlx.DB, dbConfig pgclient.Config, authClient authclient.AuthServiceClient, logger *slog.Logger, tracer trace.Tracer) journal.Service { database := postgres.NewDatabase(db, dbConfig, tracer) repo := journalpg.NewRepository(database) idp := uuid.New() diff --git a/cmd/mqtt/main.go b/cmd/mqtt/main.go index 99fe92f4c4..a42578ee4f 100644 --- a/cmd/mqtt/main.go +++ b/cmd/mqtt/main.go @@ -23,8 +23,8 @@ import ( "github.com/absmach/magistrala/mqtt" "github.com/absmach/magistrala/mqtt/events" mqtttracing "github.com/absmach/magistrala/mqtt/tracing" - "github.com/absmach/magistrala/pkg/auth" "github.com/absmach/magistrala/pkg/errors" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/messaging/brokers" brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing" @@ -42,9 +42,9 @@ import ( ) const ( - svcName = "mqtt" - envPrefixAuthz = "MG_THINGS_AUTH_GRPC_" - wsPathPrefix = "/mqtt" + svcName = "mqtt" + envPrefixThings = "MG_THINGS_AUTH_GRPC_" + wsPathPrefix = "/mqtt" ) type config struct { @@ -60,7 +60,7 @@ type config struct { HTTPTargetPort string `env:"MG_MQTT_ADAPTER_WS_TARGET_PORT" envDefault:"8080"` HTTPTargetPath string `env:"MG_MQTT_ADAPTER_WS_TARGET_PATH" envDefault:"/mqtt"` Instance string `env:"MG_MQTT_ADAPTER_INSTANCE" envDefault:""` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_MQTT_ADAPTER_INSTANCE_ID" envDefault:""` @@ -165,24 +165,24 @@ func main() { return } - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuthz}); err != nil { + thingsClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&thingsClientCfg, env.Options{Prefix: envPrefixThings}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authClient, authHandler, err := auth.SetupAuthz(ctx, authConfig) + thingsClient, thingsHandler, err := grpcclient.SetupThingsClient(ctx, thingsClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer authHandler.Close() + defer thingsHandler.Close() - logger.Info("Successfully connected to things grpc server " + authHandler.Secure()) + logger.Info("Things service gRPC client successfully connected to things gRPC server " + thingsHandler.Secure()) - h := mqtt.NewHandler(np, es, logger, authClient) + h := mqtt.NewHandler(np, es, logger, thingsClient) h = handler.NewTracing(tracer, h) if cfg.SendTelemetry { diff --git a/cmd/postgres-reader/main.go b/cmd/postgres-reader/main.go index 51ee881d75..6d5939ef29 100644 --- a/cmd/postgres-reader/main.go +++ b/cmd/postgres-reader/main.go @@ -14,7 +14,7 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" + "github.com/absmach/magistrala/pkg/grpcclient" pgclient "github.com/absmach/magistrala/pkg/postgres" "github.com/absmach/magistrala/pkg/prometheus" "github.com/absmach/magistrala/pkg/server" @@ -29,13 +29,13 @@ import ( ) const ( - svcName = "postgres-reader" - envPrefixDB = "MG_POSTGRES_" - envPrefixHTTP = "MG_POSTGRES_READER_HTTP_" - envPrefixAuth = "MG_AUTH_GRPC_" - envPrefixAuthz = "MG_THINGS_AUTH_GRPC_" - defDB = "magistrala" - defSvcHTTPPort = "9009" + svcName = "postgres-reader" + envPrefixDB = "MG_POSTGRES_" + envPrefixHTTP = "MG_POSTGRES_READER_HTTP_" + envPrefixAuth = "MG_AUTH_GRPC_" + envPrefixThings = "MG_THINGS_AUTH_GRPC_" + defDB = "magistrala" + defSvcHTTPPort = "9009" ) type config struct { @@ -83,39 +83,39 @@ func main() { } defer db.Close() - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + authClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&authClientCfg, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - ac, acHandler, err := auth.Setup(ctx, authConfig) + authClient, authHandler, err := grpcclient.SetupAuthClient(ctx, authClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer acHandler.Close() + defer authHandler.Close() - logger.Info("Successfully connected to auth grpc server " + acHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) - authConfig = auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuthz}); err != nil { + thingsClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&thingsClientCfg, env.Options{Prefix: envPrefixThings}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - tc, tcHandler, err := auth.SetupAuthz(ctx, authConfig) + thingsClient, thingsHandler, err := grpcclient.SetupThingsClient(ctx, thingsClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer tcHandler.Close() + defer thingsHandler.Close() - logger.Info("Successfully connected to things grpc server " + tcHandler.Secure()) + logger.Info("Things service gRPC client successfully connected to things gRPC server " + thingsHandler.Secure()) repo := newService(db, logger) @@ -125,7 +125,7 @@ func main() { exitCode = 1 return } - hs := httpserver.NewServer(ctx, cancel, svcName, httpServerConfig, api.MakeHandler(repo, ac, tc, svcName, cfg.InstanceID), logger) + hs := httpserver.NewServer(ctx, cancel, svcName, httpServerConfig, api.MakeHandler(repo, authClient, thingsClient, svcName, cfg.InstanceID), logger) if cfg.SendTelemetry { chc := chclient.New(svcName, magistrala.Version, logger, cancel) diff --git a/cmd/postgres-writer/main.go b/cmd/postgres-writer/main.go index 013fcfb6e2..0a1c5f324a 100644 --- a/cmd/postgres-writer/main.go +++ b/cmd/postgres-writer/main.go @@ -44,7 +44,7 @@ type config struct { LogLevel string `env:"MG_POSTGRES_WRITER_LOG_LEVEL" envDefault:"info"` ConfigPath string `env:"MG_POSTGRES_WRITER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_POSTGRES_WRITER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` diff --git a/cmd/things/main.go b/cmd/things/main.go index cb072f92cd..39e07d5880 100644 --- a/cmd/things/main.go +++ b/cmd/things/main.go @@ -15,6 +15,7 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" + authclient "github.com/absmach/magistrala/auth/api/grpc" redisclient "github.com/absmach/magistrala/internal/clients/redis" mggroups "github.com/absmach/magistrala/internal/groups" gapi "github.com/absmach/magistrala/internal/groups/api" @@ -22,8 +23,8 @@ import ( gpostgres "github.com/absmach/magistrala/internal/groups/postgres" gtracing "github.com/absmach/magistrala/internal/groups/tracing" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" "github.com/absmach/magistrala/pkg/groups" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/postgres" pgclient "github.com/absmach/magistrala/pkg/postgres" @@ -68,7 +69,7 @@ type config struct { LogLevel string `env:"MG_THINGS_LOG_LEVEL" envDefault:"info"` StandaloneID string `env:"MG_THINGS_STANDALONE_ID" envDefault:""` StandaloneToken string `env:"MG_THINGS_STANDALONE_TOKEN" envDefault:""` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` CacheKeyDuration time.Duration `env:"MG_THINGS_CACHE_KEY_DURATION" envDefault:"10m"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_THINGS_INSTANCE_ID" envDefault:""` @@ -144,21 +145,24 @@ func main() { } defer cacheclient.Close() - var authClient magistrala.AuthServiceClient - + var ( + authClient authclient.AuthServiceClient + policyClient magistrala.PolicyServiceClient + ) switch cfg.StandaloneID != "" && cfg.StandaloneToken != "" { case true: authClient = localusers.NewAuthService(cfg.StandaloneID, cfg.StandaloneToken) + policyClient = localusers.NewPolicyService(cfg.StandaloneID, cfg.StandaloneToken) logger.Info("Using standalone auth service") default: - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + clientConfig := grpcclient.Config{} + if err := env.ParseWithOptions(&clientConfig, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authServiceClient, authHandler, err := auth.Setup(ctx, authConfig) + authServiceClient, authHandler, err := grpcclient.SetupAuthClient(ctx, clientConfig) if err != nil { logger.Error(err.Error()) exitCode = 1 @@ -166,10 +170,20 @@ func main() { } defer authHandler.Close() authClient = authServiceClient - logger.Info("Successfully connected to auth grpc server " + authHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) + + policyServiceClient, policyHandler, err := grpcclient.SetupPolicyClient(ctx, clientConfig) + if err != nil { + logger.Error(err.Error()) + exitCode = 1 + return + } + defer policyHandler.Close() + policyClient = policyServiceClient + logger.Info("PolicyService gRPC client successfully connected to auth gRPC server " + policyHandler.Secure()) } - csvc, gsvc, err := newService(ctx, db, dbConfig, authClient, cacheclient, cfg.CacheKeyDuration, cfg.ESURL, tracer, logger) + csvc, gsvc, err := newService(ctx, db, dbConfig, authClient, policyClient, cacheclient, cfg.CacheKeyDuration, cfg.ESURL, tracer, logger) if err != nil { logger.Error(fmt.Sprintf("failed to create services: %s", err)) exitCode = 1 @@ -191,11 +205,11 @@ func main() { exitCode = 1 return } - regiterAuthzServer := func(srv *grpc.Server) { + registerThingsServer := func(srv *grpc.Server) { reflection.Register(srv) magistrala.RegisterAuthzServiceServer(srv, grpcapi.NewServer(csvc)) } - gs := grpcserver.NewServer(ctx, cancel, svcName, grpcServerConfig, regiterAuthzServer, logger) + gs := grpcserver.NewServer(ctx, cancel, svcName, grpcServerConfig, registerThingsServer, logger) if cfg.SendTelemetry { chc := chclient.New(svcName, magistrala.Version, logger, cancel) @@ -220,7 +234,7 @@ func main() { } } -func newService(ctx context.Context, db *sqlx.DB, dbConfig pgclient.Config, authClient magistrala.AuthServiceClient, cacheClient *redis.Client, keyDuration time.Duration, esURL string, tracer trace.Tracer, logger *slog.Logger) (things.Service, groups.Service, error) { +func newService(ctx context.Context, db *sqlx.DB, dbConfig pgclient.Config, authClient authclient.AuthServiceClient, policyClient magistrala.PolicyServiceClient, cacheClient *redis.Client, keyDuration time.Duration, esURL string, tracer trace.Tracer, logger *slog.Logger) (things.Service, groups.Service, error) { database := postgres.NewDatabase(db, dbConfig, tracer) cRepo := thingspg.NewRepository(database) gRepo := gpostgres.New(database) @@ -229,8 +243,8 @@ func newService(ctx context.Context, db *sqlx.DB, dbConfig pgclient.Config, auth thingCache := thcache.NewCache(cacheClient, keyDuration) - csvc := things.NewService(authClient, cRepo, gRepo, thingCache, idp) - gsvc := mggroups.NewService(gRepo, idp, authClient) + csvc := things.NewService(authClient, policyClient, cRepo, gRepo, thingCache, idp) + gsvc := mggroups.NewService(gRepo, idp, authClient, policyClient) csvc, err := thevents.NewEventStoreMiddleware(ctx, csvc, esURL) if err != nil { diff --git a/cmd/timescale-reader/main.go b/cmd/timescale-reader/main.go index 26761ad4ef..1c100c53d1 100644 --- a/cmd/timescale-reader/main.go +++ b/cmd/timescale-reader/main.go @@ -14,7 +14,7 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" + "github.com/absmach/magistrala/pkg/grpcclient" pgclient "github.com/absmach/magistrala/pkg/postgres" "github.com/absmach/magistrala/pkg/prometheus" "github.com/absmach/magistrala/pkg/server" @@ -29,13 +29,13 @@ import ( ) const ( - svcName = "timescaledb-reader" - envPrefixDB = "MG_TIMESCALE_" - envPrefixHTTP = "MG_TIMESCALE_READER_HTTP_" - envPrefixAuth = "MG_AUTH_GRPC_" - envPrefixAuthz = "MG_THINGS_AUTH_GRPC_" - defDB = "messages" - defSvcHTTPPort = "9011" + svcName = "timescaledb-reader" + envPrefixDB = "MG_TIMESCALE_" + envPrefixHTTP = "MG_TIMESCALE_READER_HTTP_" + envPrefixAuth = "MG_AUTH_GRPC_" + envPrefixThings = "MG_THINGS_AUTH_GRPC_" + defDB = "messages" + defSvcHTTPPort = "9011" ) type config struct { @@ -83,39 +83,39 @@ func main() { repo := newService(db, logger) - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + authClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&authClientCfg, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - ac, acHandler, err := auth.Setup(ctx, authConfig) + authClient, authHandler, err := grpcclient.SetupAuthClient(ctx, authClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer acHandler.Close() + defer authHandler.Close() - logger.Info("Successfully connected to auth grpc server " + acHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) - authConfig = auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuthz}); err != nil { + thingsClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&thingsClientCfg, env.Options{Prefix: envPrefixThings}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - tc, tcHandler, err := auth.SetupAuthz(ctx, authConfig) + thingsClient, thingsHandler, err := grpcclient.SetupThingsClient(ctx, thingsClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer tcHandler.Close() + defer thingsHandler.Close() - logger.Info("Successfully connected to things grpc server " + tcHandler.Secure()) + logger.Info("ThingsService gRPC client successfully connected to things gRPC server " + thingsHandler.Secure()) httpServerConfig := server.Config{Port: defSvcHTTPPort} if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil { @@ -123,7 +123,7 @@ func main() { exitCode = 1 return } - hs := httpserver.NewServer(ctx, cancel, svcName, httpServerConfig, api.MakeHandler(repo, ac, tc, svcName, cfg.InstanceID), logger) + hs := httpserver.NewServer(ctx, cancel, svcName, httpServerConfig, api.MakeHandler(repo, authClient, thingsClient, svcName, cfg.InstanceID), logger) if cfg.SendTelemetry { chc := chclient.New(svcName, magistrala.Version, logger, cancel) diff --git a/cmd/timescale-writer/main.go b/cmd/timescale-writer/main.go index de9a2efe52..47d6f5de7c 100644 --- a/cmd/timescale-writer/main.go +++ b/cmd/timescale-writer/main.go @@ -44,7 +44,7 @@ type config struct { LogLevel string `env:"MG_TIMESCALE_WRITER_LOG_LEVEL" envDefault:"info"` ConfigPath string `env:"MG_TIMESCALE_WRITER_CONFIG_PATH" envDefault:"/config.toml"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_TIMESCALE_WRITER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` diff --git a/cmd/users/main.go b/cmd/users/main.go index 5278431e22..69118e5a22 100644 --- a/cmd/users/main.go +++ b/cmd/users/main.go @@ -17,6 +17,7 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" authSvc "github.com/absmach/magistrala/auth" + authclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/internal/email" mggroups "github.com/absmach/magistrala/internal/groups" gapi "github.com/absmach/magistrala/internal/groups/api" @@ -24,10 +25,10 @@ import ( gpostgres "github.com/absmach/magistrala/internal/groups/postgres" gtracing "github.com/absmach/magistrala/internal/groups/tracing" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" mgclients "github.com/absmach/magistrala/pkg/clients" svcerr "github.com/absmach/magistrala/pkg/errors/service" "github.com/absmach/magistrala/pkg/groups" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/oauth2" googleoauth "github.com/absmach/magistrala/pkg/oauth2/google" @@ -69,7 +70,7 @@ type config struct { AdminPassword string `env:"MG_USERS_ADMIN_PASSWORD" envDefault:"12345678"` PassRegexText string `env:"MG_USERS_PASS_REGEX" envDefault:"^.{8,}$"` ResetURL string `env:"MG_TOKEN_RESET_ENDPOINT" envDefault:"/reset-request"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_USERS_INSTANCE_ID" envDefault:""` ESURL string `env:"MG_ES_URL" envDefault:"nats://localhost:4222"` @@ -149,23 +150,32 @@ func main() { }() tracer := tp.Tracer(svcName) - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuth}); err != nil { + clientConfig := grpcclient.Config{} + if err := env.ParseWithOptions(&clientConfig, env.Options{Prefix: envPrefixAuth}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authClient, authHandler, err := auth.Setup(ctx, authConfig) + authClient, authHandler, err := grpcclient.SetupAuthClient(ctx, clientConfig) if err != nil { logger.Error(err.Error()) exitCode = 1 return } defer authHandler.Close() - logger.Info("Successfully connected to auth grpc server " + authHandler.Secure()) + logger.Info("AuthService gRPC client successfully connected to auth gRPC server " + authHandler.Secure()) - csvc, gsvc, err := newService(ctx, authClient, db, dbConfig, tracer, cfg, ec, logger) + policyClient, policyHandler, err := grpcclient.SetupPolicyClient(ctx, clientConfig) + if err != nil { + logger.Error(err.Error()) + exitCode = 1 + return + } + defer policyHandler.Close() + logger.Info("PolicyService gRPC client successfully connected to auth gRPC server " + policyHandler.Secure()) + + csvc, gsvc, err := newService(ctx, authClient, policyClient, db, dbConfig, tracer, cfg, ec, logger) if err != nil { logger.Error(fmt.Sprintf("failed to setup service: %s", err)) exitCode = 1 @@ -208,7 +218,7 @@ func main() { } } -func newService(ctx context.Context, authClient magistrala.AuthServiceClient, db *sqlx.DB, dbConfig pgclient.Config, tracer trace.Tracer, c config, ec email.Config, logger *slog.Logger) (users.Service, groups.Service, error) { +func newService(ctx context.Context, authClient authclient.AuthServiceClient, policyClient magistrala.PolicyServiceClient, db *sqlx.DB, dbConfig pgclient.Config, tracer trace.Tracer, c config, ec email.Config, logger *slog.Logger) (users.Service, groups.Service, error) { database := postgres.NewDatabase(db, dbConfig, tracer) cRepo := clientspg.NewRepository(database) gRepo := gpostgres.New(database) @@ -221,8 +231,8 @@ func newService(ctx context.Context, authClient magistrala.AuthServiceClient, db logger.Error(fmt.Sprintf("failed to configure e-mailing util: %s", err.Error())) } - csvc := users.NewService(cRepo, authClient, emailerClient, hsr, idp, c.SelfRegister) - gsvc := mggroups.NewService(gRepo, idp, authClient) + csvc := users.NewService(cRepo, authClient, policyClient, emailerClient, hsr, idp, c.SelfRegister) + gsvc := mggroups.NewService(gRepo, idp, authClient, policyClient) csvc, err = uevents.NewEventStoreMiddleware(ctx, csvc, c.ESURL) if err != nil { @@ -247,11 +257,11 @@ func newService(ctx context.Context, authClient magistrala.AuthServiceClient, db if err != nil { logger.Error(fmt.Sprintf("failed to create admin client: %s", err)) } - if err := createAdminPolicy(ctx, clientID, authClient); err != nil { + if err := createAdminPolicy(ctx, clientID, authClient, policyClient); err != nil { return nil, nil, err } - users.NewDeleteHandler(ctx, cRepo, authClient, c.DeleteInterval, c.DeleteAfter, logger) + users.NewDeleteHandler(ctx, cRepo, policyClient, c.DeleteInterval, c.DeleteAfter, logger) return csvc, gsvc, err } @@ -296,7 +306,7 @@ func createAdmin(ctx context.Context, c config, crepo clientspg.Repository, hsr return client.ID, nil } -func createAdminPolicy(ctx context.Context, clientID string, authClient magistrala.AuthServiceClient) error { +func createAdminPolicy(ctx context.Context, clientID string, authClient authclient.AuthServiceClient, policyClient magistrala.PolicyServiceClient) error { res, err := authClient.Authorize(ctx, &magistrala.AuthorizeReq{ SubjectType: authSvc.UserType, Subject: clientID, @@ -305,7 +315,7 @@ func createAdminPolicy(ctx context.Context, clientID string, authClient magistra ObjectType: authSvc.PlatformType, }) if err != nil || !res.Authorized { - addPolicyRes, err := authClient.AddPolicy(ctx, &magistrala.AddPolicyReq{ + addPolicyRes, err := policyClient.AddPolicy(ctx, &magistrala.AddPolicyReq{ SubjectType: authSvc.UserType, Subject: clientID, Relation: authSvc.AdministratorRelation, diff --git a/cmd/ws/main.go b/cmd/ws/main.go index cd7755e550..b4bdade5fb 100644 --- a/cmd/ws/main.go +++ b/cmd/ws/main.go @@ -15,7 +15,7 @@ import ( chclient "github.com/absmach/callhome/pkg/client" "github.com/absmach/magistrala" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" + "github.com/absmach/magistrala/pkg/grpcclient" jaegerclient "github.com/absmach/magistrala/pkg/jaeger" "github.com/absmach/magistrala/pkg/messaging" "github.com/absmach/magistrala/pkg/messaging/brokers" @@ -35,18 +35,18 @@ import ( ) const ( - svcName = "ws-adapter" - envPrefixHTTP = "MG_WS_ADAPTER_HTTP_" - envPrefixAuthz = "MG_THINGS_AUTH_GRPC_" - defSvcHTTPPort = "8190" - targetWSPort = "8191" - targetWSHost = "localhost" + svcName = "ws-adapter" + envPrefixHTTP = "MG_WS_ADAPTER_HTTP_" + envPrefixThings = "MG_THINGS_AUTH_GRPC_" + defSvcHTTPPort = "8190" + targetWSPort = "8191" + targetWSHost = "localhost" ) type config struct { LogLevel string `env:"MG_WS_ADAPTER_LOG_LEVEL" envDefault:"info"` BrokerURL string `env:"MG_MESSAGE_BROKER_URL" envDefault:"nats://localhost:4222"` - JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` + JaegerURL url.URL `env:"MG_JAEGER_URL" envDefault:"http://localhost:4318/v1/traces"` SendTelemetry bool `env:"MG_SEND_TELEMETRY" envDefault:"true"` InstanceID string `env:"MG_WS_ADAPTER_INSTANCE_ID" envDefault:""` TraceRatio float64 `env:"MG_JAEGER_TRACE_RATIO" envDefault:"1.0"` @@ -89,22 +89,22 @@ func main() { Host: targetWSHost, } - authConfig := auth.Config{} - if err := env.ParseWithOptions(&authConfig, env.Options{Prefix: envPrefixAuthz}); err != nil { + thingsClientCfg := grpcclient.Config{} + if err := env.ParseWithOptions(&thingsClientCfg, env.Options{Prefix: envPrefixThings}); err != nil { logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err)) exitCode = 1 return } - authClient, authHandler, err := auth.SetupAuthz(ctx, authConfig) + thingsClient, thingsHandler, err := grpcclient.SetupThingsClient(ctx, thingsClientCfg) if err != nil { logger.Error(err.Error()) exitCode = 1 return } - defer authHandler.Close() + defer thingsHandler.Close() - logger.Info("Successfully connected to things grpc server " + authHandler.Secure()) + logger.Info("Things service gRPC client successfully connected to things gRPC server " + thingsHandler.Secure()) tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio) if err != nil { @@ -128,7 +128,7 @@ func main() { defer nps.Close() nps = brokerstracing.NewPubSub(targetServerConfig, tracer, nps) - svc := newService(authClient, nps, logger, tracer) + svc := newService(thingsClient, nps, logger, tracer) hs := httpserver.NewServer(ctx, cancel, svcName, targetServerConfig, api.MakeHandler(ctx, svc, logger, cfg.InstanceID), logger) @@ -141,7 +141,7 @@ func main() { g.Go(func() error { return hs.Start() }) - handler := ws.NewHandler(nps, logger, authClient) + handler := ws.NewHandler(nps, logger, thingsClient) return proxyWS(ctx, httpServerConfig, targetServerConfig, logger, handler) }) @@ -154,8 +154,8 @@ func main() { } } -func newService(tc magistrala.AuthzServiceClient, nps messaging.PubSub, logger *slog.Logger, tracer trace.Tracer) ws.Service { - svc := ws.New(tc, nps) +func newService(thingsClient magistrala.AuthzServiceClient, nps messaging.PubSub, logger *slog.Logger, tracer trace.Tracer) ws.Service { + svc := ws.New(thingsClient, nps) svc = tracing.New(tracer, svc) svc = api.LoggingMiddleware(svc, logger) counter, latency := prometheus.MakeMetrics("ws_adapter", "api") diff --git a/coap/adapter.go b/coap/adapter.go index a662cc8e43..56467eb170 100644 --- a/coap/adapter.go +++ b/coap/adapter.go @@ -37,14 +37,14 @@ var _ Service = (*adapterService)(nil) // Observers is a map of maps,. type adapterService struct { - auth magistrala.AuthzServiceClient + things magistrala.AuthzServiceClient pubsub messaging.PubSub } // New instantiates the CoAP adapter implementation. -func New(authClient magistrala.AuthzServiceClient, pubsub messaging.PubSub) Service { +func New(thingsClient magistrala.AuthzServiceClient, pubsub messaging.PubSub) Service { as := &adapterService{ - auth: authClient, + things: thingsClient, pubsub: pubsub, } @@ -59,7 +59,7 @@ func (svc *adapterService) Publish(ctx context.Context, key string, msg *messagi Object: msg.GetChannel(), ObjectType: auth.GroupType, } - res, err := svc.auth.Authorize(ctx, ar) + res, err := svc.things.Authorize(ctx, ar) if err != nil { return errors.Wrap(svcerr.ErrAuthorization, err) } @@ -79,7 +79,7 @@ func (svc *adapterService) Subscribe(ctx context.Context, key, chanID, subtopic Object: chanID, ObjectType: auth.GroupType, } - res, err := svc.auth.Authorize(ctx, ar) + res, err := svc.things.Authorize(ctx, ar) if err != nil { return errors.Wrap(svcerr.ErrAuthorization, err) } @@ -107,7 +107,7 @@ func (svc *adapterService) Unsubscribe(ctx context.Context, key, chanID, subtopi Object: chanID, ObjectType: auth.GroupType, } - res, err := svc.auth.Authorize(ctx, ar) + res, err := svc.things.Authorize(ctx, ar) if err != nil { return errors.Wrap(svcerr.ErrAuthorization, err) } diff --git a/consumers/notifiers/service.go b/consumers/notifiers/service.go index 563fd59d1b..3e8ad2e495 100644 --- a/consumers/notifiers/service.go +++ b/consumers/notifiers/service.go @@ -42,7 +42,7 @@ type Service interface { var _ Service = (*notifierService)(nil) type notifierService struct { - auth magistrala.AuthServiceClient + auth magistrala.AuthnServiceClient subs SubscriptionsRepository idp magistrala.IDProvider notifier Notifier @@ -51,7 +51,7 @@ type notifierService struct { } // New instantiates the subscriptions service implementation. -func New(auth magistrala.AuthServiceClient, subs SubscriptionsRepository, idp magistrala.IDProvider, notifier Notifier, from string) Service { +func New(auth magistrala.AuthnServiceClient, subs SubscriptionsRepository, idp magistrala.IDProvider, notifier Notifier, from string) Service { return ¬ifierService{ auth: auth, subs: subs, diff --git a/consumers/notifiers/service_test.go b/consumers/notifiers/service_test.go index 28facdcf0d..07c7ab32ee 100644 --- a/consumers/notifiers/service_test.go +++ b/consumers/notifiers/service_test.go @@ -29,9 +29,9 @@ const ( validID = "d4ebb847-5d0e-4e46-bdd9-b6aceaaa3a22" ) -func newService() (notifiers.Service, *authmocks.AuthClient, *mocks.SubscriptionsRepository) { +func newService() (notifiers.Service, *authmocks.AuthServiceClient, *mocks.SubscriptionsRepository) { repo := new(mocks.SubscriptionsRepository) - auth := new(authmocks.AuthClient) + auth := new(authmocks.AuthServiceClient) notifier := new(mocks.Notifier) idp := uuid.NewMock() from := "exampleFrom" @@ -276,10 +276,7 @@ func TestListSubscriptions(t *testing.T) { func TestRemoveSubscription(t *testing.T) { svc, auth, repo := newService() sub := notifiers.Subscription{ - Contact: exampleUser1, - Topic: "valid.topic", - ID: testsutil.GenerateUUID(t), - OwnerID: validID, + ID: testsutil.GenerateUUID(t), } cases := []struct { @@ -327,21 +324,6 @@ func TestRemoveSubscription(t *testing.T) { func TestConsume(t *testing.T) { svc, _, repo := newService() - sub := notifiers.Subscription{ - Contact: exampleUser1, - OwnerID: validID, - Topic: "topic.subtopic", - } - for i := 0; i < total; i++ { - tmp := sub - tmp.Contact = fmt.Sprintf("contact%d@example.com", i) - if i%2 == 0 { - tmp.Topic = fmt.Sprintf("%s-2", sub.Topic) - } - } - sub.Contact = "invalid@example.com" - sub.Topic = fmt.Sprintf("%s-2", sub.Topic) - msg := messaging.Message{ Channel: "topic", Subtopic: "subtopic", diff --git a/http/api/endpoint_test.go b/http/api/endpoint_test.go index c1c48f44bf..12ee314720 100644 --- a/http/api/endpoint_test.go +++ b/http/api/endpoint_test.go @@ -12,12 +12,12 @@ import ( "testing" "github.com/absmach/magistrala" - authmocks "github.com/absmach/magistrala/auth/mocks" server "github.com/absmach/magistrala/http" "github.com/absmach/magistrala/http/api" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/pkg/apiutil" pubsub "github.com/absmach/magistrala/pkg/messaging/mocks" + thmocks "github.com/absmach/magistrala/things/mocks" "github.com/absmach/mproxy" mproxyhttp "github.com/absmach/mproxy/pkg/http" "github.com/absmach/mproxy/pkg/session" @@ -30,9 +30,9 @@ const ( invalidValue = "invalid" ) -func newService(auth magistrala.AuthzServiceClient) (session.Handler, *pubsub.PubSub) { +func newService(things magistrala.AuthzServiceClient) (session.Handler, *pubsub.PubSub) { pub := new(pubsub.PubSub) - return server.NewHandler(pub, mglog.NewMock(), auth), pub + return server.NewHandler(pub, mglog.NewMock(), things), pub } func newTargetHTTPServer() *httptest.Server { @@ -81,7 +81,7 @@ func (tr testRequest) make() (*http.Response, error) { } func TestPublish(t *testing.T) { - auth := new(authmocks.AuthClient) + things := new(thmocks.AuthzServiceClient) chanID := "1" ctSenmlJSON := "application/senml+json" ctSenmlCBOR := "application/senml+cbor" @@ -91,7 +91,7 @@ func TestPublish(t *testing.T) { msg := `[{"n":"current","t":-1,"v":1.6}]` msgJSON := `{"field1":"val1","field2":"val2"}` msgCBOR := `81A3616E6763757272656E746174206176FB3FF999999999999A` - svc, pub := newService(auth) + svc, pub := newService(things) target := newTargetHTTPServer() defer target.Close() ts, err := newProxyHTPPServer(svc, target) @@ -99,8 +99,8 @@ func TestPublish(t *testing.T) { defer ts.Close() - auth.On("Authorize", mock.Anything, &magistrala.AuthorizeReq{Subject: thingKey, Object: chanID, Domain: "", SubjectType: "thing", Permission: "publish", ObjectType: "group"}).Return(&magistrala.AuthorizeRes{Authorized: true, Id: ""}, nil) - auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: false, Id: ""}, nil) + things.On("Authorize", mock.Anything, &magistrala.AuthorizeReq{Subject: thingKey, Object: chanID, Domain: "", SubjectType: "thing", Permission: "publish", ObjectType: "group"}).Return(&magistrala.AuthorizeRes{Authorized: true, Id: ""}, nil) + things.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: false, Id: ""}, nil) cases := map[string]struct { chanID string diff --git a/http/handler.go b/http/handler.go index 060d84e885..3bdaf72865 100644 --- a/http/handler.go +++ b/http/handler.go @@ -47,16 +47,16 @@ var channelRegExp = regexp.MustCompile(`^\/?channels\/([\w\-]+)\/messages(\/[^?] // Event implements events.Event interface. type handler struct { publisher messaging.Publisher - auth magistrala.AuthzServiceClient + things magistrala.AuthzServiceClient logger *slog.Logger } // NewHandler creates new Handler entity. -func NewHandler(publisher messaging.Publisher, logger *slog.Logger, authClient magistrala.AuthzServiceClient) session.Handler { +func NewHandler(publisher messaging.Publisher, logger *slog.Logger, thingsClient magistrala.AuthzServiceClient) session.Handler { return &handler{ logger: logger, publisher: publisher, - auth: authClient, + things: thingsClient, } } @@ -147,7 +147,7 @@ func (h *handler) Publish(ctx context.Context, topic *string, payload *[]byte) e Permission: auth.PublishPermission, ObjectType: auth.GroupType, } - res, err := h.auth.Authorize(ctx, ar) + res, err := h.things.Authorize(ctx, ar) if err != nil { return err } diff --git a/internal/groups/service.go b/internal/groups/service.go index 42d287e18a..3b90dbfe91 100644 --- a/internal/groups/service.go +++ b/internal/groups/service.go @@ -10,6 +10,7 @@ import ( "github.com/absmach/magistrala" "github.com/absmach/magistrala/auth" + grpcclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/pkg/apiutil" mgclients "github.com/absmach/magistrala/pkg/clients" "github.com/absmach/magistrala/pkg/errors" @@ -26,16 +27,18 @@ var ( type service struct { groups groups.Repository - auth magistrala.AuthServiceClient + auth grpcclient.AuthServiceClient + policy magistrala.PolicyServiceClient idProvider magistrala.IDProvider } // NewService returns a new Clients service implementation. -func NewService(g groups.Repository, idp magistrala.IDProvider, authClient magistrala.AuthServiceClient) groups.Service { +func NewService(g groups.Repository, idp magistrala.IDProvider, authClient grpcclient.AuthServiceClient, policyClient magistrala.PolicyServiceClient) groups.Service { return service{ groups: g, idProvider: idp, auth: authClient, + policy: policyClient, } } @@ -119,7 +122,7 @@ func (svc service) ListGroups(ctx context.Context, token, memberKind, memberID s if _, err := svc.authorizeKind(ctx, res.GetDomainId(), auth.UserType, auth.UsersKind, res.GetId(), auth.ViewPermission, auth.ThingType, memberID); err != nil { return groups.Page{}, err } - cids, err := svc.auth.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ + cids, err := svc.policy.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ SubjectType: auth.GroupType, Permission: auth.GroupRelation, ObjectType: auth.ThingType, @@ -137,7 +140,7 @@ func (svc service) ListGroups(ctx context.Context, token, memberKind, memberID s return groups.Page{}, err } - gids, err := svc.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + gids, err := svc.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.GroupType, Subject: memberID, Permission: auth.ParentGroupRelation, @@ -154,7 +157,7 @@ func (svc service) ListGroups(ctx context.Context, token, memberKind, memberID s if _, err := svc.authorizeKind(ctx, res.GetDomainId(), auth.UserType, auth.UsersKind, res.GetId(), auth.ViewPermission, auth.GroupType, memberID); err != nil { return groups.Page{}, err } - gids, err := svc.auth.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ + gids, err := svc.policy.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ SubjectType: auth.GroupType, Permission: auth.ParentGroupRelation, ObjectType: auth.GroupType, @@ -174,7 +177,7 @@ func (svc service) ListGroups(ctx context.Context, token, memberKind, memberID s if _, err := svc.authorizeKind(ctx, res.GetDomainId(), auth.UserType, auth.UsersKind, res.GetId(), auth.AdminPermission, auth.DomainType, res.GetDomainId()); err != nil { return groups.Page{}, err } - gids, err := svc.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + gids, err := svc.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: auth.EncodeDomainUserID(res.GetDomainId(), memberID), Permission: gm.Permission, @@ -239,7 +242,7 @@ func (svc service) retrievePermissions(ctx context.Context, userID string, group } func (svc service) listUserGroupPermission(ctx context.Context, userID, groupID string) ([]string, error) { - lp, err := svc.auth.ListPermissions(ctx, &magistrala.ListPermissionsReq{ + lp, err := svc.policy.ListPermissions(ctx, &magistrala.ListPermissionsReq{ SubjectType: auth.UserType, Subject: userID, Object: groupID, @@ -279,7 +282,7 @@ func (svc service) ListMembers(ctx context.Context, token, groupID, permission, } switch memberKind { case auth.ThingsKind: - tids, err := svc.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + tids, err := svc.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.GroupType, Subject: groupID, Relation: auth.GroupRelation, @@ -304,7 +307,7 @@ func (svc service) ListMembers(ctx context.Context, token, groupID, permission, Members: members, }, nil case auth.UsersKind: - uids, err := svc.auth.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ + uids, err := svc.policy.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ SubjectType: auth.UserType, Permission: permission, Object: groupID, @@ -423,7 +426,7 @@ func (svc service) Assign(ctx context.Context, token, groupID, relation, memberK return errMemberKind } - if _, err := svc.auth.AddPolicies(ctx, &policies); err != nil { + if _, err := svc.policy.AddPolicies(ctx, &policies); err != nil { return errors.Wrap(svcerr.ErrAddPolicies, err) } @@ -462,12 +465,12 @@ func (svc service) assignParentGroup(ctx context.Context, domain, parentGroupID }) } - if _, err := svc.auth.AddPolicies(ctx, &addPolicies); err != nil { + if _, err := svc.policy.AddPolicies(ctx, &addPolicies); err != nil { return errors.Wrap(svcerr.ErrAddPolicies, err) } defer func() { if err != nil { - if _, errRollback := svc.auth.DeletePolicies(ctx, &deletePolicies); errRollback != nil { + if _, errRollback := svc.policy.DeletePolicies(ctx, &deletePolicies); errRollback != nil { err = errors.Wrap(err, errors.Wrap(apiutil.ErrRollbackTx, errRollback)) } } @@ -508,12 +511,12 @@ func (svc service) unassignParentGroup(ctx context.Context, domain, parentGroupI }) } - if _, err := svc.auth.DeletePolicies(ctx, &deletePolicies); err != nil { + if _, err := svc.policy.DeletePolicies(ctx, &deletePolicies); err != nil { return errors.Wrap(svcerr.ErrDeletePolicies, err) } defer func() { if err != nil { - if _, errRollback := svc.auth.AddPolicies(ctx, &addPolicies); errRollback != nil { + if _, errRollback := svc.policy.AddPolicies(ctx, &addPolicies); errRollback != nil { err = errors.Wrap(err, errors.Wrap(apiutil.ErrRollbackTx, errRollback)) } } @@ -574,7 +577,7 @@ func (svc service) Unassign(ctx context.Context, token, groupID, relation, membe return errMemberKind } - if _, err := svc.auth.DeletePolicies(ctx, &policies); err != nil { + if _, err := svc.policy.DeletePolicies(ctx, &policies); err != nil { return errors.Wrap(svcerr.ErrDeletePolicies, err) } return nil @@ -589,7 +592,7 @@ func (svc service) DeleteGroup(ctx context.Context, token, id string) error { return err } - deleteRes, err := svc.auth.DeleteEntityPolicies(ctx, &magistrala.DeleteEntityPoliciesReq{ + deleteRes, err := svc.policy.DeleteEntityPolicies(ctx, &magistrala.DeleteEntityPoliciesReq{ EntityType: auth.GroupType, Id: id, }) @@ -625,7 +628,7 @@ func (svc service) filterAllowedGroupIDsOfUserID(ctx context.Context, userID, pe } func (svc service) listAllGroupsOfUserID(ctx context.Context, userID, permission string) ([]string, error) { - allowedIDs, err := svc.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + allowedIDs, err := svc.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: userID, Permission: permission, @@ -734,7 +737,7 @@ func (svc service) addGroupPolicy(ctx context.Context, userID, domainID, id, par Object: id, }) } - if _, err := svc.auth.AddPolicies(ctx, &policies); err != nil { + if _, err := svc.policy.AddPolicies(ctx, &policies); err != nil { return errors.Wrap(svcerr.ErrAddPolicies, err) } @@ -771,7 +774,7 @@ func (svc service) addGroupPolicyRollback(ctx context.Context, userID, domainID, Object: id, }) } - if _, err := svc.auth.DeletePolicies(ctx, &policies); err != nil { + if _, err := svc.policy.DeletePolicies(ctx, &policies); err != nil { return errors.Wrap(svcerr.ErrDeletePolicies, err) } diff --git a/internal/groups/service_test.go b/internal/groups/service_test.go index 5031b8e724..4b39460248 100644 --- a/internal/groups/service_test.go +++ b/internal/groups/service_test.go @@ -48,8 +48,9 @@ var ( func TestCreateGroup(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -287,8 +288,8 @@ func TestCreateGroup(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) - authcall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) + authCall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: auth.UserType, SubjectKind: auth.UsersKind, Subject: tc.idResp.GetId(), @@ -296,7 +297,7 @@ func TestCreateGroup(t *testing.T) { Object: tc.idResp.GetDomainId(), ObjectType: auth.DomainType, }).Return(tc.authzResp, tc.authzErr) - authcall2 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall2 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: auth.UserType, SubjectKind: auth.TokenKind, Subject: tc.token, @@ -304,9 +305,9 @@ func TestCreateGroup(t *testing.T) { Object: tc.group.Parent, ObjectType: auth.GroupType, }).Return(tc.authzTknResp, tc.authzTknErr) - repocall := repo.On("Save", context.Background(), mock.Anything).Return(tc.repoResp, tc.repoErr) - authcall3 := authsvc.On("AddPolicies", context.Background(), mock.Anything).Return(tc.addPolResp, tc.addPolErr) - authCall4 := authsvc.On("DeletePolicies", mock.Anything, mock.Anything).Return(tc.deletePolResp, tc.deletePolErr) + repoCall := repo.On("Save", context.Background(), mock.Anything).Return(tc.repoResp, tc.repoErr) + authCall3 := policy.On("AddPolicies", context.Background(), mock.Anything).Return(tc.addPolResp, tc.addPolErr) + authCall4 := policy.On("DeletePolicies", mock.Anything, mock.Anything).Return(tc.deletePolResp, tc.deletePolErr) got, err := svc.CreateGroup(context.Background(), tc.token, tc.kind, tc.group) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) if err == nil { @@ -314,14 +315,14 @@ func TestCreateGroup(t *testing.T) { assert.NotEmpty(t, got.CreatedAt) assert.NotEmpty(t, got.Domain) assert.WithinDuration(t, time.Now(), got.CreatedAt, 2*time.Second) - ok := repocall.Parent.AssertCalled(t, "Save", context.Background(), mock.Anything) + ok := repoCall.Parent.AssertCalled(t, "Save", context.Background(), mock.Anything) assert.True(t, ok, fmt.Sprintf("Save was not called on %s", tc.desc)) } - authcall.Unset() - authcall1.Unset() - authcall2.Unset() - repocall.Unset() - authcall3.Unset() + authCall.Unset() + authCall1.Unset() + authCall2.Unset() + repoCall.Unset() + authCall3.Unset() authCall4.Unset() }) } @@ -329,8 +330,9 @@ func TestCreateGroup(t *testing.T) { func TestViewGroup(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -375,7 +377,7 @@ func TestViewGroup(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: auth.UserType, SubjectKind: auth.TokenKind, Subject: tc.token, @@ -383,7 +385,7 @@ func TestViewGroup(t *testing.T) { Object: tc.id, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - repo.On("RetrieveByID", context.Background(), tc.id).Return(tc.repoResp, tc.repoErr) + repoCall := repo.On("RetrieveByID", context.Background(), tc.id).Return(tc.repoResp, tc.repoErr) got, err := svc.ViewGroup(context.Background(), tc.token, tc.id) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) if err == nil { @@ -391,14 +393,17 @@ func TestViewGroup(t *testing.T) { ok := repo.AssertCalled(t, "RetrieveByID", context.Background(), tc.id) assert.True(t, ok, fmt.Sprintf("RetrieveByID was not called on %s", tc.desc)) } + authCall.Unset() + repoCall.Unset() }) } } func TestViewGroupPerms(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -461,8 +466,8 @@ func TestViewGroupPerms(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) - authcall1 := authsvc.On("ListPermissions", context.Background(), &magistrala.ListPermissionsReq{ + authCall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) + authCall1 := policy.On("ListPermissions", context.Background(), &magistrala.ListPermissionsReq{ SubjectType: auth.UserType, Subject: tc.idResp.GetId(), Object: tc.id, @@ -473,16 +478,17 @@ func TestViewGroupPerms(t *testing.T) { if err == nil { assert.Equal(t, tc.listResp.Permissions, got) } - authcall.Unset() - authcall1.Unset() + authCall.Unset() + authCall1.Unset() }) } } func TestUpdateGroup(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -536,7 +542,7 @@ func TestUpdateGroup(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: auth.UserType, SubjectKind: auth.TokenKind, Subject: tc.token, @@ -544,7 +550,7 @@ func TestUpdateGroup(t *testing.T) { Object: tc.group.ID, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - repo.On("Update", context.Background(), mock.Anything).Return(tc.repoResp, tc.repoErr) + repoCall := repo.On("Update", context.Background(), mock.Anything).Return(tc.repoResp, tc.repoErr) got, err := svc.UpdateGroup(context.Background(), tc.token, tc.group) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) if err == nil { @@ -552,14 +558,17 @@ func TestUpdateGroup(t *testing.T) { ok := repo.AssertCalled(t, "Update", context.Background(), mock.Anything) assert.True(t, ok, fmt.Sprintf("Update was not called on %s", tc.desc)) } + authCall.Unset() + repoCall.Unset() }) } } func TestEnableGroup(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -632,7 +641,7 @@ func TestEnableGroup(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: auth.UserType, SubjectKind: auth.TokenKind, Subject: tc.token, @@ -640,8 +649,8 @@ func TestEnableGroup(t *testing.T) { Object: tc.id, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - repocall := repo.On("RetrieveByID", context.Background(), tc.id).Return(tc.retrieveResp, tc.retrieveErr) - repocall1 := repo.On("ChangeStatus", context.Background(), mock.Anything).Return(tc.changeResp, tc.changeErr) + repoCall := repo.On("RetrieveByID", context.Background(), tc.id).Return(tc.retrieveResp, tc.retrieveErr) + repoCall1 := repo.On("ChangeStatus", context.Background(), mock.Anything).Return(tc.changeResp, tc.changeErr) got, err := svc.EnableGroup(context.Background(), tc.token, tc.id) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) if err == nil { @@ -649,17 +658,18 @@ func TestEnableGroup(t *testing.T) { ok := repo.AssertCalled(t, "RetrieveByID", context.Background(), tc.id) assert.True(t, ok, fmt.Sprintf("RetrieveByID was not called on %s", tc.desc)) } - authcall.Unset() - repocall.Unset() - repocall1.Unset() + authCall.Unset() + repoCall.Unset() + repoCall1.Unset() }) } } func TestDisableGroup(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -732,7 +742,7 @@ func TestDisableGroup(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: auth.UserType, SubjectKind: auth.TokenKind, Subject: tc.token, @@ -740,8 +750,8 @@ func TestDisableGroup(t *testing.T) { Object: tc.id, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - repocall := repo.On("RetrieveByID", context.Background(), tc.id).Return(tc.retrieveResp, tc.retrieveErr) - repocall1 := repo.On("ChangeStatus", context.Background(), mock.Anything).Return(tc.changeResp, tc.changeErr) + repoCall := repo.On("RetrieveByID", context.Background(), tc.id).Return(tc.retrieveResp, tc.retrieveErr) + repoCall1 := repo.On("ChangeStatus", context.Background(), mock.Anything).Return(tc.changeResp, tc.changeErr) got, err := svc.DisableGroup(context.Background(), tc.token, tc.id) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) if err == nil { @@ -749,17 +759,18 @@ func TestDisableGroup(t *testing.T) { ok := repo.AssertCalled(t, "RetrieveByID", context.Background(), tc.id) assert.True(t, ok, fmt.Sprintf("RetrieveByID was not called on %s", tc.desc)) } - authcall.Unset() - repocall.Unset() - repocall1.Unset() + authCall.Unset() + repoCall.Unset() + repoCall1.Unset() }) } } func TestListMembers(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -860,7 +871,7 @@ func TestListMembers(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ SubjectType: auth.UserType, SubjectKind: auth.TokenKind, Subject: tc.token, @@ -868,13 +879,13 @@ func TestListMembers(t *testing.T) { Object: tc.groupID, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - authcall1 := authsvc.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + authCall1 := policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: auth.GroupType, Subject: tc.groupID, Relation: auth.GroupRelation, ObjectType: auth.ThingType, }).Return(tc.listObjectResp, tc.listObjectErr) - authcall2 := authsvc.On("ListAllSubjects", context.Background(), &magistrala.ListSubjectsReq{ + authCall2 := policy.On("ListAllSubjects", context.Background(), &magistrala.ListSubjectsReq{ SubjectType: auth.UserType, Permission: tc.permission, Object: tc.groupID, @@ -885,17 +896,18 @@ func TestListMembers(t *testing.T) { if err == nil { assert.NotEmpty(t, got) } - authcall.Unset() - authcall1.Unset() - authcall2.Unset() + authCall.Unset() + authCall1.Unset() + authCall2.Unset() }) } } func TestListGroups(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -1513,14 +1525,14 @@ func TestListGroups(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) - authcall1 := &mock.Call{} - authcall2 := &mock.Call{} - authcall3 := &mock.Call{} + authCall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) + authCall1 := &mock.Call{} + authCall2 := &mock.Call{} + authCall3 := &mock.Call{} adminCheck := &mock.Call{} switch tc.memberKind { case auth.ThingsKind: - authcall1 = authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall1 = authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ Domain: tc.idResp.GetDomainId(), SubjectType: auth.UserType, SubjectKind: auth.UsersKind, @@ -1529,20 +1541,20 @@ func TestListGroups(t *testing.T) { Object: tc.memberID, ObjectType: auth.ThingType, }).Return(tc.authzResp, tc.authzErr) - authcall2 = authsvc.On("ListAllSubjects", context.Background(), &magistrala.ListSubjectsReq{ + authCall2 = policy.On("ListAllSubjects", context.Background(), &magistrala.ListSubjectsReq{ SubjectType: auth.GroupType, Permission: auth.GroupRelation, ObjectType: auth.ThingType, Object: tc.memberID, }).Return(tc.listSubjectResp, tc.listSubjectErr) - authcall3 = authsvc.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + authCall3 = policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: tc.idResp.GetId(), Permission: tc.page.Permission, ObjectType: auth.GroupType, }).Return(tc.listObjectFilterResp, tc.listObjectFilterErr) case auth.GroupsKind: - authcall1 = authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall1 = authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ Domain: tc.idResp.GetDomainId(), SubjectType: auth.UserType, SubjectKind: auth.UsersKind, @@ -1551,20 +1563,20 @@ func TestListGroups(t *testing.T) { Object: tc.memberID, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - authcall2 = authsvc.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + authCall2 = policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: auth.GroupType, Subject: tc.memberID, Permission: auth.ParentGroupRelation, ObjectType: auth.GroupType, }).Return(tc.listObjectResp, tc.listObjectErr) - authcall3 = authsvc.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + authCall3 = policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: tc.idResp.GetId(), Permission: tc.page.Permission, ObjectType: auth.GroupType, }).Return(tc.listObjectFilterResp, tc.listObjectFilterErr) case auth.ChannelsKind: - authcall1 = authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall1 = authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ Domain: tc.idResp.GetDomainId(), SubjectType: auth.UserType, SubjectKind: auth.UsersKind, @@ -1573,13 +1585,13 @@ func TestListGroups(t *testing.T) { Object: tc.memberID, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - authcall2 = authsvc.On("ListAllSubjects", context.Background(), &magistrala.ListSubjectsReq{ + authCall2 = policy.On("ListAllSubjects", context.Background(), &magistrala.ListSubjectsReq{ SubjectType: auth.GroupType, Permission: auth.ParentGroupRelation, ObjectType: auth.GroupType, Object: tc.memberID, }).Return(tc.listSubjectResp, tc.listSubjectErr) - authcall3 = authsvc.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + authCall3 = policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: tc.idResp.GetId(), Permission: tc.page.Permission, @@ -1607,35 +1619,35 @@ func TestListGroups(t *testing.T) { authReq.Domain = "" authReq.Permission = auth.MembershipPermission } - authcall1 = authsvc.On("Authorize", context.Background(), authReq).Return(tc.authzResp, tc.authzErr) - authcall2 = authsvc.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + authCall1 = authsvc.On("Authorize", context.Background(), authReq).Return(tc.authzResp, tc.authzErr) + authCall2 = policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: auth.EncodeDomainUserID(tc.idResp.GetDomainId(), tc.memberID), Permission: tc.page.Permission, ObjectType: auth.GroupType, }).Return(tc.listObjectResp, tc.listObjectErr) - authcall3 = authsvc.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + authCall3 = policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: tc.idResp.GetId(), Permission: tc.page.Permission, ObjectType: auth.GroupType, }).Return(tc.listObjectFilterResp, tc.listObjectFilterErr) } - repocall := repo.On("RetrieveByIDs", context.Background(), mock.Anything, mock.Anything).Return(tc.repoResp, tc.repoErr) - authcall4 := authsvc.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermResp, tc.listPermErr) + repoCall := repo.On("RetrieveByIDs", context.Background(), mock.Anything, mock.Anything).Return(tc.repoResp, tc.repoErr) + authCall4 := policy.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermResp, tc.listPermErr) got, err := svc.ListGroups(context.Background(), tc.token, tc.memberKind, tc.memberID, tc.page) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) if err == nil { assert.NotEmpty(t, got) } - authcall.Unset() - repocall.Unset() + authCall.Unset() + repoCall.Unset() switch tc.memberKind { case auth.ThingsKind, auth.GroupsKind, auth.ChannelsKind, auth.UsersKind: - authcall1.Unset() - authcall2.Unset() - authcall3.Unset() - authcall4.Unset() + authCall1.Unset() + authCall2.Unset() + authCall3.Unset() + authCall4.Unset() if tc.memberID == "" { adminCheck.Unset() } @@ -1646,8 +1658,9 @@ func TestListGroups(t *testing.T) { func TestAssign(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -1965,8 +1978,8 @@ func TestAssign(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) - authcall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) + authCall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ Domain: tc.idResp.GetDomainId(), SubjectType: auth.UserType, SubjectKind: auth.UsersKind, @@ -2013,7 +2026,7 @@ func TestAssign(t *testing.T) { Object: group.ID, }) } - deletePoliciesCall = authsvc.On("DeletePolicies", context.Background(), &deletePolicies).Return(tc.deleteParentPoliciesRes, tc.deleteParentPoliciesErr) + deletePoliciesCall = policy.On("DeletePolicies", context.Background(), &deletePolicies).Return(tc.deleteParentPoliciesRes, tc.deleteParentPoliciesErr) assignParentCall = repo.On("AssignParentGroup", context.Background(), tc.groupID, tc.memberIDs).Return(tc.repoParentGroupErr) case auth.ChannelsKind: for _, memberID := range tc.memberIDs { @@ -2038,12 +2051,12 @@ func TestAssign(t *testing.T) { }) } } - authcall2 := authsvc.On("AddPolicies", context.Background(), &policies).Return(tc.addPoliciesRes, tc.addPoliciesErr) + authCall2 := policy.On("AddPolicies", context.Background(), &policies).Return(tc.addPoliciesRes, tc.addPoliciesErr) err := svc.Assign(context.Background(), tc.token, tc.groupID, tc.relation, tc.memberKind, tc.memberIDs...) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) - authcall.Unset() - authcall1.Unset() - authcall2.Unset() + authCall.Unset() + authCall1.Unset() + authCall2.Unset() if tc.memberKind == auth.GroupsKind { retrieveByIDsCall.Unset() deletePoliciesCall.Unset() @@ -2055,8 +2068,9 @@ func TestAssign(t *testing.T) { func TestUnassign(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -2374,8 +2388,8 @@ func TestUnassign(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) - authcall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) + authCall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ Domain: tc.idResp.GetDomainId(), SubjectType: auth.UserType, SubjectKind: auth.UsersKind, @@ -2422,7 +2436,7 @@ func TestUnassign(t *testing.T) { Object: group.ID, }) } - addPoliciesCall = authsvc.On("AddPolicies", context.Background(), &addPolicies).Return(tc.addParentPoliciesRes, tc.addParentPoliciesErr) + addPoliciesCall = policy.On("AddPolicies", context.Background(), &addPolicies).Return(tc.addParentPoliciesRes, tc.addParentPoliciesErr) assignParentCall = repo.On("UnassignParentGroup", context.Background(), tc.groupID, tc.memberIDs).Return(tc.repoParentGroupErr) case auth.ChannelsKind: for _, memberID := range tc.memberIDs { @@ -2447,12 +2461,12 @@ func TestUnassign(t *testing.T) { }) } } - authcall2 := authsvc.On("DeletePolicies", context.Background(), &policies).Return(tc.deletePoliciesRes, tc.deletePoliciesErr) + authCall2 := policy.On("DeletePolicies", context.Background(), &policies).Return(tc.deletePoliciesRes, tc.deletePoliciesErr) err := svc.Unassign(context.Background(), tc.token, tc.groupID, tc.relation, tc.memberKind, tc.memberIDs...) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) - authcall.Unset() - authcall1.Unset() - authcall2.Unset() + authCall.Unset() + authCall1.Unset() + authCall2.Unset() if tc.memberKind == auth.GroupsKind { retrieveByIDsCall.Unset() addPoliciesCall.Unset() @@ -2464,8 +2478,9 @@ func TestUnassign(t *testing.T) { func TestDeleteGroup(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) - svc := groups.NewService(repo, idProvider, authsvc) + authsvc := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) + svc := groups.NewService(repo, idProvider, authsvc, policy) cases := []struct { desc string @@ -2557,8 +2572,8 @@ func TestDeleteGroup(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { - authcall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) - authcall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ + authCall := authsvc.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.idResp, tc.idErr) + authCall1 := authsvc.On("Authorize", context.Background(), &magistrala.AuthorizeReq{ Domain: tc.idResp.GetDomainId(), SubjectType: auth.UserType, SubjectKind: auth.UsersKind, @@ -2567,17 +2582,17 @@ func TestDeleteGroup(t *testing.T) { Object: tc.groupID, ObjectType: auth.GroupType, }).Return(tc.authzResp, tc.authzErr) - authcall2 := authsvc.On("DeleteEntityPolicies", context.Background(), &magistrala.DeleteEntityPoliciesReq{ + authCall2 := policy.On("DeleteEntityPolicies", context.Background(), &magistrala.DeleteEntityPoliciesReq{ EntityType: auth.GroupType, Id: tc.groupID, }).Return(tc.deletePoliciesRes, tc.deletePoliciesErr) - repocall := repo.On("Delete", context.Background(), tc.groupID).Return(tc.repoErr) + repoCall := repo.On("Delete", context.Background(), tc.groupID).Return(tc.repoErr) err := svc.DeleteGroup(context.Background(), tc.token, tc.groupID) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("expected error %v to contain %v", err, tc.err)) - authcall.Unset() - authcall1.Unset() - authcall2.Unset() - repocall.Unset() + authCall.Unset() + authCall1.Unset() + authCall2.Unset() + repoCall.Unset() }) } } diff --git a/invitations/service.go b/invitations/service.go index 29bb5ebbc4..466ba287b9 100644 --- a/invitations/service.go +++ b/invitations/service.go @@ -9,6 +9,7 @@ import ( "github.com/absmach/magistrala" "github.com/absmach/magistrala/auth" + grpcclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/pkg/errors" svcerr "github.com/absmach/magistrala/pkg/errors/service" mgsdk "github.com/absmach/magistrala/pkg/sdk/go" @@ -16,14 +17,14 @@ import ( type service struct { repo Repository - auth magistrala.AuthServiceClient + auth grpcclient.AuthServiceClient sdk mgsdk.SDK } // ErrMemberExist indicates that the user is already a member of the domain. var ErrMemberExist = errors.New("user is already a member of the domain") -func NewService(repo Repository, authClient magistrala.AuthServiceClient, sdk mgsdk.SDK) Service { +func NewService(repo Repository, authClient grpcclient.AuthServiceClient, sdk mgsdk.SDK) Service { return &service{ repo: repo, auth: authClient, diff --git a/invitations/service_test.go b/invitations/service_test.go index 4baff01097..35db1289e7 100644 --- a/invitations/service_test.go +++ b/invitations/service_test.go @@ -34,7 +34,7 @@ var ( func TestSendInvitation(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) + authsvc := new(authmocks.AuthServiceClient) svc := invitations.NewService(repo, authsvc, nil) cases := []struct { @@ -221,7 +221,7 @@ func TestSendInvitation(t *testing.T) { func TestViewInvitation(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) + authsvc := new(authmocks.AuthServiceClient) svc := invitations.NewService(repo, authsvc, nil) validInvitation := invitations.Invitation{ @@ -398,7 +398,7 @@ func TestViewInvitation(t *testing.T) { func TestListInvitations(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) + authsvc := new(authmocks.AuthServiceClient) svc := invitations.NewService(repo, authsvc, nil) validPage := invitations.Page{ @@ -576,7 +576,7 @@ func TestListInvitations(t *testing.T) { func TestAcceptInvitation(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) + authsvc := new(authmocks.AuthServiceClient) svc := invitations.NewService(repo, authsvc, nil) userID := testsutil.GenerateUUID(t) @@ -649,7 +649,7 @@ func TestAcceptInvitation(t *testing.T) { func TestDeleteInvitation(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) + authsvc := new(authmocks.AuthServiceClient) svc := invitations.NewService(repo, authsvc, nil) cases := []struct { diff --git a/journal/service.go b/journal/service.go index 4f72bca205..0d2830c991 100644 --- a/journal/service.go +++ b/journal/service.go @@ -8,17 +8,18 @@ import ( "github.com/absmach/magistrala" "github.com/absmach/magistrala/auth" + grpcclient "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/pkg/errors" svcerr "github.com/absmach/magistrala/pkg/errors/service" ) type service struct { idProvider magistrala.IDProvider - auth magistrala.AuthServiceClient + auth grpcclient.AuthServiceClient repository Repository } -func NewService(idp magistrala.IDProvider, repository Repository, authClient magistrala.AuthServiceClient) Service { +func NewService(idp magistrala.IDProvider, repository Repository, authClient grpcclient.AuthServiceClient) Service { return &service{ idProvider: idp, auth: authClient, diff --git a/journal/service_test.go b/journal/service_test.go index b1520e995e..820a58e938 100644 --- a/journal/service_test.go +++ b/journal/service_test.go @@ -41,7 +41,7 @@ var ( func TestSave(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) + authsvc := new(authmocks.AuthServiceClient) svc := journal.NewService(idProvider, repo, authsvc) cases := []struct { @@ -75,7 +75,7 @@ func TestSave(t *testing.T) { func TestReadAll(t *testing.T) { repo := new(mocks.Repository) - authsvc := new(authmocks.AuthClient) + authsvc := new(authmocks.AuthServiceClient) svc := journal.NewService(idProvider, repo, authsvc) validToken := "token" diff --git a/mqtt/handler.go b/mqtt/handler.go index b9b89a784c..13070826ea 100644 --- a/mqtt/handler.go +++ b/mqtt/handler.go @@ -58,18 +58,18 @@ var channelRegExp = regexp.MustCompile(`^\/?channels\/([\w\-]+)\/messages(\/[^?] // Event implements events.Event interface. type handler struct { publisher messaging.Publisher - auth magistrala.AuthzServiceClient + things magistrala.AuthzServiceClient logger *slog.Logger es events.EventStore } // NewHandler creates new Handler entity. -func NewHandler(publisher messaging.Publisher, es events.EventStore, logger *slog.Logger, authClient magistrala.AuthzServiceClient) session.Handler { +func NewHandler(publisher messaging.Publisher, es events.EventStore, logger *slog.Logger, thingsClient magistrala.AuthzServiceClient) session.Handler { return &handler{ es: es, logger: logger, publisher: publisher, - auth: authClient, + things: thingsClient, } } @@ -231,7 +231,7 @@ func (h *handler) authAccess(ctx context.Context, password, topic, action string Object: chanID, ObjectType: auth.GroupType, } - res, err := h.auth.Authorize(ctx, ar) + res, err := h.things.Authorize(ctx, ar) if err != nil { return err } diff --git a/mqtt/handler_test.go b/mqtt/handler_test.go index 2beb3f4bdb..f455f42a0e 100644 --- a/mqtt/handler_test.go +++ b/mqtt/handler_test.go @@ -11,13 +11,13 @@ import ( "testing" "github.com/absmach/magistrala" - authmocks "github.com/absmach/magistrala/auth/mocks" "github.com/absmach/magistrala/internal/testsutil" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/mqtt" "github.com/absmach/magistrala/mqtt/mocks" "github.com/absmach/magistrala/pkg/errors" svcerr "github.com/absmach/magistrala/pkg/errors/service" + thmocks "github.com/absmach/magistrala/things/mocks" "github.com/absmach/mproxy/pkg/session" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -121,7 +121,7 @@ func TestAuthConnect(t *testing.T) { } func TestAuthPublish(t *testing.T) { - handler, auth, _ := newHandler() + handler, things, _ := newHandler() cases := []struct { desc string @@ -161,7 +161,7 @@ func TestAuthPublish(t *testing.T) { } for _, tc := range cases { - repocall := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true, Id: testsutil.GenerateUUID(t)}, tc.err) + repocall := things.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true, Id: testsutil.GenerateUUID(t)}, tc.err) ctx := context.TODO() if tc.session != nil { ctx = session.NewContext(ctx, tc.session) @@ -173,7 +173,7 @@ func TestAuthPublish(t *testing.T) { } func TestAuthSubscribe(t *testing.T) { - handler, auth, _ := newHandler() + handler, things, _ := newHandler() cases := []struct { desc string @@ -214,7 +214,7 @@ func TestAuthSubscribe(t *testing.T) { } for _, tc := range cases { - repocall := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true, Id: testsutil.GenerateUUID(t)}, tc.err) + repocall := things.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true, Id: testsutil.GenerateUUID(t)}, tc.err) ctx := context.TODO() if tc.session != nil { ctx = session.NewContext(ctx, tc.session) @@ -450,12 +450,12 @@ func TestDisconnect(t *testing.T) { } } -func newHandler() (session.Handler, *authmocks.AuthClient, *mocks.EventStore) { +func newHandler() (session.Handler, *thmocks.AuthzServiceClient, *mocks.EventStore) { logger, err := mglog.New(&logBuffer, "debug") if err != nil { log.Fatalf("failed to create logger: %s", err) } - auth := new(authmocks.AuthClient) + things := new(thmocks.AuthzServiceClient) eventStore := new(mocks.EventStore) - return mqtt.NewHandler(mocks.NewPublisher(), eventStore, logger, auth), auth, eventStore + return mqtt.NewHandler(mocks.NewPublisher(), eventStore, logger, things), things, eventStore } diff --git a/pkg/auth/client.go b/pkg/auth/client.go deleted file mode 100644 index 10982e8974..0000000000 --- a/pkg/auth/client.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) Abstract Machines -// SPDX-License-Identifier: Apache-2.0 - -package auth - -import ( - "context" - - "github.com/absmach/magistrala" - authgrpc "github.com/absmach/magistrala/auth/api/grpc" - "github.com/absmach/magistrala/pkg/errors" - thingsauth "github.com/absmach/magistrala/things/api/grpc" - grpchealth "google.golang.org/grpc/health/grpc_health_v1" -) - -var errSvcNotServing = errors.New("service is not serving") - -// Setup loads Auth gRPC configuration and creates new Auth gRPC client. -// -// For example: -// -// authClient, authHandler, err := auth.Setup(ctx, auth.Config{}) -func Setup(ctx context.Context, cfg Config) (magistrala.AuthServiceClient, Handler, error) { - client, err := newHandler(cfg) - if err != nil { - return nil, nil, err - } - - health := grpchealth.NewHealthClient(client.Connection()) - resp, err := health.Check(ctx, &grpchealth.HealthCheckRequest{ - Service: "auth", - }) - if err != nil || resp.GetStatus() != grpchealth.HealthCheckResponse_SERVING { - return nil, nil, errSvcNotServing - } - - return authgrpc.NewClient(client.Connection(), cfg.Timeout), client, nil -} - -// Setup loads Authz gRPC configuration and creates new Authz gRPC client. -// -// For example: -// -// authzClient, authzHandler, err := auth.Setup(ctx, auth.Config{}) -func SetupAuthz(ctx context.Context, cfg Config) (magistrala.AuthzServiceClient, Handler, error) { - client, err := newHandler(cfg) - if err != nil { - return nil, nil, err - } - - health := grpchealth.NewHealthClient(client.Connection()) - resp, err := health.Check(ctx, &grpchealth.HealthCheckRequest{ - Service: "things", - }) - if err != nil || resp.GetStatus() != grpchealth.HealthCheckResponse_SERVING { - return nil, nil, errSvcNotServing - } - - return thingsauth.NewClient(client.Connection(), cfg.Timeout), client, nil -} diff --git a/pkg/grpcclient/client.go b/pkg/grpcclient/client.go new file mode 100644 index 0000000000..699f7808dc --- /dev/null +++ b/pkg/grpcclient/client.go @@ -0,0 +1,82 @@ +// Copyright (c) Abstract Machines +// SPDX-License-Identifier: Apache-2.0 + +package grpcclient + +import ( + "context" + + "github.com/absmach/magistrala" + authgrpc "github.com/absmach/magistrala/auth/api/grpc" + "github.com/absmach/magistrala/pkg/errors" + thingsauth "github.com/absmach/magistrala/things/api/grpc" + grpchealth "google.golang.org/grpc/health/grpc_health_v1" +) + +var errSvcNotServing = errors.New("service is not serving") + +// SetupAuthClient loads Auth gRPC configuration and creates new Auth gRPC client. +// +// For example: +// +// authClient, authHandler, err := auth.SetupAuth(ctx, auth.Config{}). +func SetupAuthClient(ctx context.Context, cfg Config) (authgrpc.AuthServiceClient, Handler, error) { + client, err := newHandler(cfg) + if err != nil { + return nil, nil, err + } + + health := grpchealth.NewHealthClient(client.Connection()) + resp, err := health.Check(ctx, &grpchealth.HealthCheckRequest{ + Service: "auth", + }) + if err != nil || resp.GetStatus() != grpchealth.HealthCheckResponse_SERVING { + return nil, nil, errSvcNotServing + } + + return authgrpc.NewAuthClient(client.Connection(), cfg.Timeout), client, nil +} + +// SetupPolicyClient loads Policy gRPC configuration and creates a new Policy gRPC client. +// +// For example: +// +// policyClient, policyHandler, err := auth.SetupPolicyClient(ctx, auth.Config{}). +func SetupPolicyClient(ctx context.Context, cfg Config) (magistrala.PolicyServiceClient, Handler, error) { + client, err := newHandler(cfg) + if err != nil { + return nil, nil, err + } + + health := grpchealth.NewHealthClient(client.Connection()) + resp, err := health.Check(ctx, &grpchealth.HealthCheckRequest{ + Service: "auth", + }) + if err != nil || resp.GetStatus() != grpchealth.HealthCheckResponse_SERVING { + return nil, nil, errSvcNotServing + } + + return authgrpc.NewPolicyClient(client.Connection(), cfg.Timeout), client, nil +} + +// SetupThingsClient loads things gRPC configuration and creates new things gRPC client. +// +// For example: +// +// thingClient, thingHandler, err := auth.SetupThings(ctx, auth.Config{}). +func SetupThingsClient(ctx context.Context, cfg Config) (magistrala.AuthzServiceClient, Handler, error) { + client, err := newHandler(cfg) + if err != nil { + return nil, nil, err + } + + health := grpchealth.NewHealthClient(client.Connection()) + resp, err := health.Check(ctx, &grpchealth.HealthCheckRequest{ + Service: "things", + }) + if err != nil || resp.GetStatus() != grpchealth.HealthCheckResponse_SERVING { + return nil, nil, errSvcNotServing + } + + return thingsauth.NewClient(client.Connection(), cfg.Timeout), client, nil +} diff --git a/pkg/auth/client_test.go b/pkg/grpcclient/client_test.go similarity index 56% rename from pkg/auth/client_test.go rename to pkg/grpcclient/client_test.go index 918ec3fc0d..36c3207afe 100644 --- a/pkg/auth/client_test.go +++ b/pkg/grpcclient/client_test.go @@ -1,7 +1,7 @@ // Copyright (c) Abstract Machines // SPDX-License-Identifier: Apache-2.0 -package auth_test +package grpcclient_test import ( "context" @@ -13,8 +13,8 @@ import ( authgrpcapi "github.com/absmach/magistrala/auth/api/grpc" "github.com/absmach/magistrala/auth/mocks" mglog "github.com/absmach/magistrala/logger" - "github.com/absmach/magistrala/pkg/auth" "github.com/absmach/magistrala/pkg/errors" + "github.com/absmach/magistrala/pkg/grpcclient" "github.com/absmach/magistrala/pkg/server" grpcserver "github.com/absmach/magistrala/pkg/server/grpc" thingsgrpcapi "github.com/absmach/magistrala/things/api/grpc" @@ -27,7 +27,8 @@ func TestSetupAuth(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() registerAuthServiceServer := func(srv *grpc.Server) { - magistrala.RegisterAuthServiceServer(srv, authgrpcapi.NewServer(new(mocks.Service))) + magistrala.RegisterAuthzServiceServer(srv, authgrpcapi.NewAuthzServer(new(mocks.Service))) + magistrala.RegisterAuthnServiceServer(srv, authgrpcapi.NewAuthnServer(new(mocks.Service))) } gs := grpcserver.NewServer(ctx, cancel, "auth", server.Config{Port: "12345"}, registerAuthServiceServer, mglog.NewMock()) go func() { @@ -41,12 +42,12 @@ func TestSetupAuth(t *testing.T) { cases := []struct { desc string - config auth.Config + config grpcclient.Config err error }{ { desc: "successful", - config: auth.Config{ + config: grpcclient.Config{ URL: "localhost:12345", Timeout: time.Second, }, @@ -54,7 +55,7 @@ func TestSetupAuth(t *testing.T) { }, { desc: "failed with empty URL", - config: auth.Config{ + config: grpcclient.Config{ URL: "", Timeout: time.Second, }, @@ -64,7 +65,7 @@ func TestSetupAuth(t *testing.T) { for _, c := range cases { t.Run(c.desc, func(t *testing.T) { - client, handler, err := auth.Setup(context.Background(), c.config) + client, handler, err := grpcclient.SetupAuthClient(context.Background(), c.config) assert.True(t, errors.Contains(err, c.err), fmt.Sprintf("expected %s to contain %s", err, c.err)) if err == nil { assert.NotNil(t, client) @@ -74,13 +75,13 @@ func TestSetupAuth(t *testing.T) { } } -func TestSetupAuthz(t *testing.T) { +func TestSetupThingsClient(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - registerAuthaServiceServer := func(srv *grpc.Server) { + registerThingsServiceServer := func(srv *grpc.Server) { magistrala.RegisterAuthzServiceServer(srv, thingsgrpcapi.NewServer(new(thmocks.Service))) } - gs := grpcserver.NewServer(ctx, cancel, "things", server.Config{Port: "12345"}, registerAuthaServiceServer, mglog.NewMock()) + gs := grpcserver.NewServer(ctx, cancel, "things", server.Config{Port: "12345"}, registerThingsServiceServer, mglog.NewMock()) go func() { err := gs.Start() assert.Nil(t, err, fmt.Sprintf(`"Unexpected error creating server %s"`, err)) @@ -92,12 +93,12 @@ func TestSetupAuthz(t *testing.T) { cases := []struct { desc string - config auth.Config + config grpcclient.Config err error }{ { desc: "successful", - config: auth.Config{ + config: grpcclient.Config{ URL: "localhost:12345", Timeout: time.Second, }, @@ -105,7 +106,7 @@ func TestSetupAuthz(t *testing.T) { }, { desc: "failed with empty URL", - config: auth.Config{ + config: grpcclient.Config{ URL: "", Timeout: time.Second, }, @@ -115,7 +116,58 @@ func TestSetupAuthz(t *testing.T) { for _, c := range cases { t.Run(c.desc, func(t *testing.T) { - client, handler, err := auth.SetupAuthz(context.Background(), c.config) + client, handler, err := grpcclient.SetupThingsClient(context.Background(), c.config) + assert.True(t, errors.Contains(err, c.err), fmt.Sprintf("expected %s to contain %s", err, c.err)) + if err == nil { + assert.NotNil(t, client) + assert.NotNil(t, handler) + } + }) + } +} + +func TestSetupPolicyClient(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + registerPolicyServiceServer := func(srv *grpc.Server) { + magistrala.RegisterPolicyServiceServer(srv, authgrpcapi.NewPolicyServer(new(mocks.Service))) + } + gs := grpcserver.NewServer(ctx, cancel, "auth", server.Config{Port: "12345"}, registerPolicyServiceServer, mglog.NewMock()) + go func() { + err := gs.Start() + assert.Nil(t, err, fmt.Sprintf("Unexpected error creating server %s", err)) + }() + defer func() { + err := gs.Stop() + assert.Nil(t, err, fmt.Sprintf("Unexpected error stopping server %s", err)) + }() + + cases := []struct { + desc string + config grpcclient.Config + err error + }{ + { + desc: "successfully", + config: grpcclient.Config{ + URL: "localhost:12345", + Timeout: time.Second, + }, + err: nil, + }, + { + desc: "failed with empty URL", + config: grpcclient.Config{ + URL: "", + Timeout: time.Second, + }, + err: errors.New("service is not serving"), + }, + } + + for _, c := range cases { + t.Run(c.desc, func(t *testing.T) { + client, handler, err := grpcclient.SetupPolicyClient(context.Background(), c.config) assert.True(t, errors.Contains(err, c.err), fmt.Sprintf("expected %s to contain %s", err, c.err)) if err == nil { assert.NotNil(t, client) diff --git a/pkg/auth/connect.go b/pkg/grpcclient/connect.go similarity index 99% rename from pkg/auth/connect.go rename to pkg/grpcclient/connect.go index c63f6ed1c0..ab6e4f0551 100644 --- a/pkg/auth/connect.go +++ b/pkg/grpcclient/connect.go @@ -1,7 +1,7 @@ // Copyright (c) Abstract Machines // SPDX-License-Identifier: Apache-2.0 -package auth +package grpcclient import ( "crypto/tls" diff --git a/pkg/auth/connect_test.go b/pkg/grpcclient/connect_test.go similarity index 99% rename from pkg/auth/connect_test.go rename to pkg/grpcclient/connect_test.go index 6e8cc1dab3..97287556e1 100644 --- a/pkg/auth/connect_test.go +++ b/pkg/grpcclient/connect_test.go @@ -1,7 +1,7 @@ // Copyright (c) Abstract Machines // SPDX-License-Identifier: Apache-2.0 -package auth +package grpcclient import ( "fmt" diff --git a/pkg/auth/doc.go b/pkg/grpcclient/doc.go similarity index 90% rename from pkg/auth/doc.go rename to pkg/grpcclient/doc.go index ba8d891925..1d9ce2fe58 100644 --- a/pkg/auth/doc.go +++ b/pkg/grpcclient/doc.go @@ -3,4 +3,4 @@ // Package auth contains the domain concept definitions needed to support // Magistrala auth functionality. -package auth +package grpcclient diff --git a/pkg/sdk/go/message_test.go b/pkg/sdk/go/message_test.go index ccf13fbb4a..967d82f041 100644 --- a/pkg/sdk/go/message_test.go +++ b/pkg/sdk/go/message_test.go @@ -30,8 +30,8 @@ import ( "github.com/stretchr/testify/mock" ) -func setupMessages() (*httptest.Server, *authmocks.AuthClient, *pubsub.PubSub) { - auth := new(authmocks.AuthClient) +func setupMessages() (*httptest.Server, *authmocks.AuthServiceClient, *pubsub.PubSub) { + auth := new(authmocks.AuthServiceClient) pub := new(pubsub.PubSub) handler := adapter.NewHandler(pub, mglog.NewMock(), auth) @@ -50,10 +50,10 @@ func setupMessages() (*httptest.Server, *authmocks.AuthClient, *pubsub.PubSub) { return httptest.NewServer(http.HandlerFunc(mp.ServeHTTP)), auth, pub } -func setupReader() (*httptest.Server, *authmocks.AuthClient, *readersmocks.MessageRepository) { +func setupReader() (*httptest.Server, *authmocks.AuthServiceClient, *readersmocks.MessageRepository) { repo := new(readersmocks.MessageRepository) - auth := new(authmocks.AuthClient) - tauth := new(thmocks.ThingAuthzService) + auth := new(authmocks.AuthServiceClient) + tauth := new(thmocks.AuthzServiceClient) mux := readersapi.MakeHandler(repo, auth, tauth, "test", "") return httptest.NewServer(mux), auth, repo diff --git a/readers/api/endpoint.go b/readers/api/endpoint.go index 846e81d3c7..2727f34240 100644 --- a/readers/api/endpoint.go +++ b/readers/api/endpoint.go @@ -14,14 +14,14 @@ import ( "github.com/go-kit/kit/endpoint" ) -func listMessagesEndpoint(svc readers.MessageRepository, uauth magistrala.AuthServiceClient, taauth magistrala.AuthzServiceClient) endpoint.Endpoint { +func listMessagesEndpoint(svc readers.MessageRepository, authClient magistrala.AuthzServiceClient, thingsClient magistrala.AuthzServiceClient) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(listMessagesReq) if err := req.validate(); err != nil { return nil, errors.Wrap(apiutil.ErrValidation, err) } - if err := authorize(ctx, req, uauth, taauth); err != nil { + if err := authorize(ctx, req, authClient, thingsClient); err != nil { return nil, errors.Wrap(svcerr.ErrAuthorization, err) } diff --git a/readers/api/endpoint_test.go b/readers/api/endpoint_test.go index 87e7f2d330..3eb67c44a9 100644 --- a/readers/api/endpoint_test.go +++ b/readers/api/endpoint_test.go @@ -50,8 +50,8 @@ var ( sum float64 = 42 ) -func newServer(repo *mocks.MessageRepository, ac *authmocks.AuthClient, tc *thmocks.ThingAuthzService) *httptest.Server { - mux := api.MakeHandler(repo, ac, tc, svcName, instanceID) +func newServer(repo *mocks.MessageRepository, authClient *authmocks.AuthServiceClient, thingsAuthzClient *thmocks.AuthzServiceClient) *httptest.Server { + mux := api.MakeHandler(repo, authClient, thingsAuthzClient, svcName, instanceID) return httptest.NewServer(mux) } @@ -129,9 +129,9 @@ func TestReadAll(t *testing.T) { } repo := new(mocks.MessageRepository) - auth := new(authmocks.AuthClient) - tauth := new(thmocks.ThingAuthzService) - ts := newServer(repo, auth, tauth) + auth := new(authmocks.AuthServiceClient) + things := new(thmocks.AuthzServiceClient) + ts := newServer(repo, auth, things) defer ts.Close() cases := []struct { @@ -981,7 +981,7 @@ func TestReadAll(t *testing.T) { authCall := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: tc.authResponse}, tc.err) repo.On("ReadAll", chanID, tc.res.PageMetadata).Return(readers.MessagesPage{Total: tc.res.Total, Messages: fromSenml(tc.res.Messages)}, nil) if tc.key != "" { - repoCall = tauth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: tc.authResponse}, tc.err) + repoCall = things.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: tc.authResponse}, tc.err) } req := testRequest{ client: ts.Client(), diff --git a/readers/api/transport.go b/readers/api/transport.go index c604e33471..c6000ca97b 100644 --- a/readers/api/transport.go +++ b/readers/api/transport.go @@ -54,14 +54,14 @@ const ( var errUserAccess = errors.New("user has no permission") // MakeHandler returns a HTTP handler for API endpoints. -func MakeHandler(svc readers.MessageRepository, uauth magistrala.AuthServiceClient, taauth magistrala.AuthzServiceClient, svcName, instanceID string) http.Handler { +func MakeHandler(svc readers.MessageRepository, auth magistrala.AuthzServiceClient, things magistrala.AuthzServiceClient, svcName, instanceID string) http.Handler { opts := []kithttp.ServerOption{ kithttp.ServerErrorEncoder(encodeError), } mux := chi.NewRouter() mux.Get("/channels/{chanID}/messages", kithttp.NewServer( - listMessagesEndpoint(svc, uauth, taauth), + listMessagesEndpoint(svc, auth, things), decodeList, encodeResponse, opts..., @@ -241,10 +241,10 @@ func encodeError(_ context.Context, err error, w http.ResponseWriter) { } } -func authorize(ctx context.Context, req listMessagesReq, uauth magistrala.AuthServiceClient, taauth magistrala.AuthzServiceClient) (err error) { +func authorize(ctx context.Context, req listMessagesReq, auth magistrala.AuthzServiceClient, things magistrala.AuthzServiceClient) (err error) { switch { case req.token != "": - if _, err = uauth.Authorize(ctx, &magistrala.AuthorizeReq{ + if _, err = auth.Authorize(ctx, &magistrala.AuthorizeReq{ SubjectType: userType, SubjectKind: tokenKind, Subject: req.token, @@ -260,7 +260,7 @@ func authorize(ctx context.Context, req listMessagesReq, uauth magistrala.AuthSe } return nil case req.key != "": - if _, err = taauth.Authorize(ctx, &magistrala.AuthorizeReq{ + if _, err = things.Authorize(ctx, &magistrala.AuthorizeReq{ SubjectType: groupType, Subject: req.key, ObjectType: thingType, diff --git a/things/mocks/auth.go b/things/mocks/auth.go deleted file mode 100644 index 24c84a593c..0000000000 --- a/things/mocks/auth.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Abstract Machines -// SPDX-License-Identifier: Apache-2.0 - -package mocks - -import ( - "context" - - "github.com/absmach/magistrala" - svcerr "github.com/absmach/magistrala/pkg/errors/service" - "github.com/stretchr/testify/mock" - "google.golang.org/grpc" -) - -const WrongID = "wrongID" - -var _ magistrala.AuthzServiceClient = (*ThingAuthzService)(nil) - -type ThingAuthzService struct { - mock.Mock -} - -func (m *ThingAuthzService) Authorize(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption) (*magistrala.AuthorizeRes, error) { - ret := m.Called(ctx, in) - if in.GetSubject() == WrongID || in.GetSubject() == "" { - return &magistrala.AuthorizeRes{}, svcerr.ErrAuthorization - } - if in.GetObject() == WrongID || in.GetObject() == "" { - return &magistrala.AuthorizeRes{}, svcerr.ErrAuthorization - } - - return ret.Get(0).(*magistrala.AuthorizeRes), ret.Error(1) -} diff --git a/things/mocks/authz_client.go b/things/mocks/authz_client.go new file mode 100644 index 0000000000..41b9d9d922 --- /dev/null +++ b/things/mocks/authz_client.go @@ -0,0 +1,118 @@ +// Copyright (c) Abstract Machines + +// SPDX-License-Identifier: Apache-2.0 + +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mocks + +import ( + context "context" + + grpc "google.golang.org/grpc" + + magistrala "github.com/absmach/magistrala" + + mock "github.com/stretchr/testify/mock" +) + +// AuthzServiceClient is an autogenerated mock type for the AuthzServiceClient type +type AuthzServiceClient struct { + mock.Mock +} + +type AuthzServiceClient_Expecter struct { + mock *mock.Mock +} + +func (_m *AuthzServiceClient) EXPECT() *AuthzServiceClient_Expecter { + return &AuthzServiceClient_Expecter{mock: &_m.Mock} +} + +// Authorize provides a mock function with given fields: ctx, in, opts +func (_m *AuthzServiceClient) Authorize(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption) (*magistrala.AuthorizeRes, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Authorize") + } + + var r0 *magistrala.AuthorizeRes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) (*magistrala.AuthorizeRes, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) *magistrala.AuthorizeRes); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*magistrala.AuthorizeRes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AuthzServiceClient_Authorize_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Authorize' +type AuthzServiceClient_Authorize_Call struct { + *mock.Call +} + +// Authorize is a helper method to define mock.On call +// - ctx context.Context +// - in *magistrala.AuthorizeReq +// - opts ...grpc.CallOption +func (_e *AuthzServiceClient_Expecter) Authorize(ctx interface{}, in interface{}, opts ...interface{}) *AuthzServiceClient_Authorize_Call { + return &AuthzServiceClient_Authorize_Call{Call: _e.mock.On("Authorize", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *AuthzServiceClient_Authorize_Call) Run(run func(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption)) *AuthzServiceClient_Authorize_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*magistrala.AuthorizeReq), variadicArgs...) + }) + return _c +} + +func (_c *AuthzServiceClient_Authorize_Call) Return(_a0 *magistrala.AuthorizeRes, _a1 error) *AuthzServiceClient_Authorize_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AuthzServiceClient_Authorize_Call) RunAndReturn(run func(context.Context, *magistrala.AuthorizeReq, ...grpc.CallOption) (*magistrala.AuthorizeRes, error)) *AuthzServiceClient_Authorize_Call { + _c.Call.Return(run) + return _c +} + +// NewAuthzServiceClient creates a new instance of AuthzServiceClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAuthzServiceClient(t interface { + mock.TestingT + Cleanup(func()) +}) *AuthzServiceClient { + mock := &AuthzServiceClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/things/service.go b/things/service.go index 5c85f4da5a..67cc016e3c 100644 --- a/things/service.go +++ b/things/service.go @@ -8,6 +8,7 @@ import ( "github.com/absmach/magistrala" "github.com/absmach/magistrala/auth" + grpcclient "github.com/absmach/magistrala/auth/api/grpc" mgclients "github.com/absmach/magistrala/pkg/clients" "github.com/absmach/magistrala/pkg/errors" svcerr "github.com/absmach/magistrala/pkg/errors/service" @@ -17,7 +18,8 @@ import ( ) type service struct { - auth magistrala.AuthServiceClient + auth grpcclient.AuthServiceClient + policy magistrala.PolicyServiceClient clients postgres.Repository clientCache Cache idProvider magistrala.IDProvider @@ -25,9 +27,10 @@ type service struct { } // NewService returns a new Clients service implementation. -func NewService(uauth magistrala.AuthServiceClient, c postgres.Repository, grepo mggroups.Repository, tcache Cache, idp magistrala.IDProvider) Service { +func NewService(auth grpcclient.AuthServiceClient, policy magistrala.PolicyServiceClient, c postgres.Repository, grepo mggroups.Repository, tcache Cache, idp magistrala.IDProvider) Service { return service{ - auth: uauth, + auth: auth, + policy: policy, clients: c, grepo: grepo, clientCache: tcache, @@ -217,7 +220,7 @@ func (svc service) retrievePermissions(ctx context.Context, userID string, clien } func (svc service) listUserThingPermission(ctx context.Context, userID, thingID string) ([]string, error) { - lp, err := svc.auth.ListPermissions(ctx, &magistrala.ListPermissionsReq{ + lp, err := svc.policy.ListPermissions(ctx, &magistrala.ListPermissionsReq{ SubjectType: auth.UserType, Subject: userID, Object: thingID, @@ -230,7 +233,7 @@ func (svc service) listUserThingPermission(ctx context.Context, userID, thingID } func (svc service) listClientIDs(ctx context.Context, userID, permission string) ([]string, error) { - tids, err := svc.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + tids, err := svc.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: userID, Permission: permission, @@ -244,7 +247,7 @@ func (svc service) listClientIDs(ctx context.Context, userID, permission string) func (svc service) filterAllowedThingIDs(ctx context.Context, userID, permission string, thingIDs []string) ([]string, error) { var ids []string - tids, err := svc.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + tids, err := svc.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.UserType, Subject: userID, Permission: permission, @@ -392,7 +395,7 @@ func (svc service) Share(ctx context.Context, token, id, relation string, userid Object: id, }) } - res, err := svc.auth.AddPolicies(ctx, &policies) + res, err := svc.policy.AddPolicies(ctx, &policies) if err != nil { return errors.Wrap(svcerr.ErrUpdateEntity, err) } @@ -421,7 +424,7 @@ func (svc service) Unshare(ctx context.Context, token, id, relation string, user Object: id, }) } - res, err := svc.auth.DeletePolicies(ctx, &policies) + res, err := svc.policy.DeletePolicies(ctx, &policies) if err != nil { return errors.Wrap(svcerr.ErrUpdateEntity, err) } @@ -444,7 +447,7 @@ func (svc service) DeleteClient(ctx context.Context, token, id string) error { return errors.Wrap(svcerr.ErrRemoveEntity, err) } - deleteRes, err := svc.auth.DeleteEntityPolicies(ctx, &magistrala.DeleteEntityPoliciesReq{ + deleteRes, err := svc.policy.DeleteEntityPolicies(ctx, &magistrala.DeleteEntityPoliciesReq{ EntityType: auth.ThingType, Id: id, }) @@ -493,7 +496,7 @@ func (svc service) ListClientsByGroup(ctx context.Context, token, groupID string return mgclients.MembersPage{}, err } - tids, err := svc.auth.ListAllObjects(ctx, &magistrala.ListObjectsReq{ + tids, err := svc.policy.ListAllObjects(ctx, &magistrala.ListObjectsReq{ SubjectType: auth.GroupType, Subject: groupID, Permission: auth.GroupRelation, @@ -603,7 +606,7 @@ func (svc service) addThingPolicies(ctx context.Context, userID, domainID string }) } - if _, err := svc.auth.AddPolicies(ctx, &policies); err != nil { + if _, err := svc.policy.AddPolicies(ctx, &policies); err != nil { return errors.Wrap(svcerr.ErrCreateEntity, err) } @@ -632,7 +635,7 @@ func (svc service) addThingPoliciesRollback(ctx context.Context, userID, domainI }) } - if _, err := svc.auth.DeletePolicies(ctx, &policies); err != nil { + if _, err := svc.policy.DeletePolicies(ctx, &policies); err != nil { return errors.Wrap(svcerr.ErrRemoveEntity, err) } diff --git a/things/service_test.go b/things/service_test.go index 61256cd2bd..d1717825f3 100644 --- a/things/service_test.go +++ b/things/service_test.go @@ -46,18 +46,19 @@ var ( errRemovePolicies = errors.New("failed to delete policies") ) -func newService() (things.Service, *mocks.Repository, *authmocks.AuthClient, *mocks.Cache) { - auth := new(authmocks.AuthClient) +func newService() (things.Service, *mocks.Repository, *authmocks.AuthServiceClient, *authmocks.PolicyServiceClient, *mocks.Cache) { + auth := new(authmocks.AuthServiceClient) + policyClient := new(authmocks.PolicyServiceClient) thingCache := new(mocks.Cache) idProvider := uuid.NewMock() cRepo := new(mocks.Repository) gRepo := new(gmocks.Repository) - return things.NewService(auth, cRepo, gRepo, thingCache, idProvider), cRepo, auth, thingCache + return things.NewService(auth, policyClient, cRepo, gRepo, thingCache, idProvider), cRepo, auth, policyClient, thingCache } func TestCreateThings(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, policy, _ := newService() cases := []struct { desc string @@ -330,8 +331,8 @@ func TestCreateThings(t *testing.T) { repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(&magistrala.IdentityRes{Id: validID, DomainId: testsutil.GenerateUUID(t)}, tc.identifyErr) authcall := auth.On("Authorize", mock.Anything, mock.Anything).Return(tc.authResponse, tc.authorizeErr) repoCall1 := cRepo.On("Save", context.Background(), mock.Anything).Return([]mgclients.Client{tc.thing}, tc.saveErr) - authCall1 := auth.On("AddPolicies", mock.Anything, mock.Anything).Return(tc.addPolicyResponse, tc.addPolicyErr) - authCall2 := auth.On("DeletePolicies", mock.Anything, mock.Anything).Return(tc.deletePolicyRes, tc.deletePolicyErr) + authCall1 := policy.On("AddPolicies", mock.Anything, mock.Anything).Return(tc.addPolicyResponse, tc.addPolicyErr) + authCall2 := policy.On("DeletePolicies", mock.Anything, mock.Anything).Return(tc.deletePolicyRes, tc.deletePolicyErr) expected, err := svc.CreateThings(context.Background(), tc.token, tc.thing) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) if err == nil { @@ -352,7 +353,7 @@ func TestCreateThings(t *testing.T) { } func TestViewClient(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, _, _ := newService() cases := []struct { desc string @@ -413,7 +414,7 @@ func TestViewClient(t *testing.T) { } func TestListClients(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, policy, _ := newService() adminID := testsutil.GenerateUUID(t) domainID := testsutil.GenerateUUID(t) @@ -622,9 +623,9 @@ func TestListClients(t *testing.T) { ObjectType: "domain", Object: tc.identifyResponse.DomainId, }).Return(tc.authorizeResponse1, tc.authorizeErr1) - listAllObjectsCall := auth.On("ListAllObjects", mock.Anything, mock.Anything).Return(tc.listObjectsResponse, tc.listObjectsErr) + listAllObjectsCall := policy.On("ListAllObjects", mock.Anything, mock.Anything).Return(tc.listObjectsResponse, tc.listObjectsErr) retrieveAllCall := cRepo.On("SearchClients", mock.Anything, mock.Anything).Return(tc.retrieveAllResponse, tc.retrieveAllErr) - listPermissionsCall := auth.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionsErr) + listPermissionsCall := policy.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionsErr) page, err := svc.ListClients(context.Background(), tc.token, tc.id, tc.page) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) @@ -797,20 +798,20 @@ func TestListClients(t *testing.T) { for _, tc := range cases2 { repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) authorizeCall := auth.On("Authorize", mock.Anything, mock.Anything).Return(tc.authorizeResponse, tc.authorizeErr) - listAllObjectsCall := auth.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + listAllObjectsCall := policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: authsvc.UserType, Subject: tc.identifyResponse.DomainId + "_" + adminID, Permission: "", ObjectType: authsvc.ThingType, }).Return(tc.listObjectsResponse, tc.listObjectsErr) - listAllObjectsCall2 := auth.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ + listAllObjectsCall2 := policy.On("ListAllObjects", context.Background(), &magistrala.ListObjectsReq{ SubjectType: authsvc.UserType, Subject: tc.identifyResponse.Id, Permission: "", ObjectType: authsvc.ThingType, }).Return(tc.listObjectsResponse1, tc.listObjectsErr1) retrieveAllCall := cRepo.On("SearchClients", mock.Anything, mock.Anything).Return(tc.retrieveAllResponse, tc.retrieveAllErr) - listPermissionsCall := auth.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionsErr) + listPermissionsCall := policy.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionsErr) page, err := svc.ListClients(context.Background(), tc.token, tc.id, tc.page) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) @@ -825,7 +826,7 @@ func TestListClients(t *testing.T) { } func TestUpdateClient(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, _, _ := newService() client1 := client client2 := client @@ -920,7 +921,7 @@ func TestUpdateClient(t *testing.T) { } func TestUpdateClientTags(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, _, _ := newService() client.Tags = []string{"updated"} @@ -986,7 +987,7 @@ func TestUpdateClientTags(t *testing.T) { } func TestUpdateClientSecret(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, _, _ := newService() cases := []struct { desc string @@ -1060,7 +1061,7 @@ func TestUpdateClientSecret(t *testing.T) { } func TestEnableClient(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, policy, _ := newService() enabledClient1 := mgclients.Client{ID: ID, Credentials: mgclients.Credentials{Identity: "client1@example.com", Secret: "password"}, Status: mgclients.EnabledStatus} disabledClient1 := mgclients.Client{ID: ID, Credentials: mgclients.Credentials{Identity: "client3@example.com", Secret: "password"}, Status: mgclients.DisabledStatus} @@ -1202,7 +1203,7 @@ func TestEnableClient(t *testing.T) { } repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: validToken}).Return(&magistrala.IdentityRes{Id: validID, DomainId: testsutil.GenerateUUID(t)}, nil) repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true}, nil) - repoCall2 := auth.On("ListAllObjects", mock.Anything, mock.Anything).Return(&magistrala.ListObjectsRes{Policies: getIDs(tc.response.Clients)}, nil) + repoCall2 := policy.On("ListAllObjects", mock.Anything, mock.Anything).Return(&magistrala.ListObjectsRes{Policies: getIDs(tc.response.Clients)}, nil) repoCall3 := cRepo.On("SearchClients", context.Background(), mock.Anything).Return(tc.response, nil) page, err := svc.ListClients(context.Background(), validToken, "", pm) require.Nil(t, err, fmt.Sprintf("unexpected error: %s", err)) @@ -1216,7 +1217,7 @@ func TestEnableClient(t *testing.T) { } func TestDisableClient(t *testing.T) { - svc, cRepo, auth, cache := newService() + svc, cRepo, auth, policy, cache := newService() enabledClient1 := mgclients.Client{ID: ID, Credentials: mgclients.Credentials{Identity: "client1@example.com", Secret: "password"}, Status: mgclients.EnabledStatus} disabledClient1 := mgclients.Client{ID: ID, Credentials: mgclients.Credentials{Identity: "client3@example.com", Secret: "password"}, Status: mgclients.DisabledStatus} @@ -1372,7 +1373,7 @@ func TestDisableClient(t *testing.T) { } repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: validToken}).Return(&magistrala.IdentityRes{Id: validID, DomainId: testsutil.GenerateUUID(t)}, nil) repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true}, nil) - repoCall2 := auth.On("ListAllObjects", mock.Anything, mock.Anything).Return(&magistrala.ListObjectsRes{Policies: getIDs(tc.response.Clients)}, nil) + repoCall2 := policy.On("ListAllObjects", mock.Anything, mock.Anything).Return(&magistrala.ListObjectsRes{Policies: getIDs(tc.response.Clients)}, nil) repoCall3 := cRepo.On("SearchClients", context.Background(), mock.Anything).Return(tc.response, nil) page, err := svc.ListClients(context.Background(), validToken, "", pm) require.Nil(t, err, fmt.Sprintf("unexpected error: %s", err)) @@ -1386,7 +1387,7 @@ func TestDisableClient(t *testing.T) { } func TestListMembers(t *testing.T) { - svc, cRepo, auth, _ := newService() + svc, cRepo, auth, policy, _ := newService() nClients := uint64(10) aClients := []mgclients.Client{} @@ -1589,9 +1590,9 @@ func TestListMembers(t *testing.T) { for _, tc := range cases { repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(tc.authorizeResponse, tc.authorizeErr) - repoCall2 := auth.On("ListAllObjects", mock.Anything, mock.Anything).Return(tc.listObjectsResponse, tc.listObjectsErr) + repoCall2 := policy.On("ListAllObjects", mock.Anything, mock.Anything).Return(tc.listObjectsResponse, tc.listObjectsErr) repoCall3 := cRepo.On("RetrieveAllByIDs", context.Background(), tc.page).Return(tc.retreiveAllByIDsResponse, tc.retreiveAllByIDsErr) - repoCall4 := auth.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionsErr) + repoCall4 := policy.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionsErr) page, err := svc.ListClientsByGroup(context.Background(), tc.token, tc.groupID, tc.page) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) assert.Equal(t, tc.response, page, fmt.Sprintf("%s: expected %v got %v\n", tc.desc, tc.response, page)) @@ -1604,20 +1605,12 @@ func TestListMembers(t *testing.T) { } func TestDeleteClient(t *testing.T) { - svc, cRepo, auth, cache := newService() + svc, cRepo, auth, policy, cache := newService() client := mgclients.Client{ - ID: testsutil.GenerateUUID(t), - Name: "TestClient", - Credentials: mgclients.Credentials{ - Identity: "TestClient@example.com", - Secret: "password", - }, - Tags: []string{"tag1", "tag2"}, - Metadata: mgclients.Metadata{"role": "client"}, + ID: testsutil.GenerateUUID(t), } - invalidClientID := "invalidClientID" - _ = invalidClientID + cases := []struct { desc string token string @@ -1693,7 +1686,7 @@ func TestDeleteClient(t *testing.T) { repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(tc.authorizeResponse, tc.authorizeErr) repoCall2 := cache.On("Remove", mock.Anything, tc.clientID).Return(tc.removeErr) - repoCall3 := auth.On("DeleteEntityPolicies", context.Background(), &magistrala.DeleteEntityPoliciesReq{ + repoCall3 := policy.On("DeleteEntityPolicies", context.Background(), &magistrala.DeleteEntityPoliciesReq{ EntityType: authsvc.ThingType, Id: tc.clientID, }).Return(tc.deletePolicyResponse, tc.deletePolicyErr) @@ -1709,7 +1702,7 @@ func TestDeleteClient(t *testing.T) { } func TestShare(t *testing.T) { - svc, _, auth, _ := newService() + svc, _, auth, policy, _ := newService() clientID := "clientID" @@ -1777,7 +1770,7 @@ func TestShare(t *testing.T) { for _, tc := range cases { repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(tc.authorizeResponse, tc.authorizeErr) - repoCall2 := auth.On("AddPolicies", mock.Anything, mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesErr) + repoCall2 := policy.On("AddPolicies", mock.Anything, mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesErr) err := svc.Share(context.Background(), tc.token, tc.clientID, tc.relation, tc.userID) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) repoCall.Unset() @@ -1787,7 +1780,7 @@ func TestShare(t *testing.T) { } func TestUnShare(t *testing.T) { - svc, _, auth, _ := newService() + svc, _, auth, policy, _ := newService() clientID := "clientID" @@ -1855,7 +1848,7 @@ func TestUnShare(t *testing.T) { for _, tc := range cases { repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(tc.authorizeResponse, tc.authorizeErr) - repoCall2 := auth.On("DeletePolicies", mock.Anything, mock.Anything).Return(tc.deletePoliciesResponse, tc.deletePoliciesErr) + repoCall2 := policy.On("DeletePolicies", mock.Anything, mock.Anything).Return(tc.deletePoliciesResponse, tc.deletePoliciesErr) err := svc.Unshare(context.Background(), tc.token, tc.clientID, tc.relation, tc.userID) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) repoCall.Unset() @@ -1865,7 +1858,7 @@ func TestUnShare(t *testing.T) { } func TestViewClientPerms(t *testing.T) { - svc, _, auth, _ := newService() + svc, _, auth, policy, _ := newService() validID := valid @@ -1927,7 +1920,7 @@ func TestViewClientPerms(t *testing.T) { for _, tc := range cases { repoCall := auth.On("Identify", mock.Anything, &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) repoCall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(tc.authorizeResponse, tc.authorizeErr) - repoCall2 := auth.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermResponse, tc.listPermErr) + repoCall2 := policy.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermResponse, tc.listPermErr) _, err := svc.ViewClientPerms(context.Background(), tc.token, tc.thingID) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) repoCall.Unset() @@ -1937,7 +1930,7 @@ func TestViewClientPerms(t *testing.T) { } func TestIdentify(t *testing.T) { - svc, cRepo, _, cache := newService() + svc, cRepo, _, _, cache := newService() valid := valid @@ -1998,7 +1991,7 @@ func TestIdentify(t *testing.T) { } func TestAuthorize(t *testing.T) { - svc, cRepo, auth, cache := newService() + svc, cRepo, auth, _, cache := newService() cases := []struct { desc string diff --git a/things/standalone/standalone.go b/things/standalone/standalone.go index adaab18bb6..b64f70ac0e 100644 --- a/things/standalone/standalone.go +++ b/things/standalone/standalone.go @@ -7,38 +7,42 @@ import ( "context" "github.com/absmach/magistrala" + grpcclient "github.com/absmach/magistrala/auth/api/grpc" svcerr "github.com/absmach/magistrala/pkg/errors/service" "google.golang.org/grpc" ) -var _ magistrala.AuthServiceClient = (*singleUserRepo)(nil) +var ( + _ grpcclient.AuthServiceClient = (*singleUserAuth)(nil) + _ magistrala.PolicyServiceClient = (*singleUserPolicyClient)(nil) +) -type singleUserRepo struct { +type singleUserAuth struct { id string token string } // NewAuthService creates single user repository for constrained environments. -func NewAuthService(id, token string) magistrala.AuthServiceClient { - return singleUserRepo{ +func NewAuthService(id, token string) grpcclient.AuthServiceClient { + return singleUserAuth{ id: id, token: token, } } -func (repo singleUserRepo) Login(ctx context.Context, in *magistrala.IssueReq, opts ...grpc.CallOption) (*magistrala.Token, error) { +func (repo singleUserAuth) Login(ctx context.Context, in *magistrala.IssueReq, opts ...grpc.CallOption) (*magistrala.Token, error) { return nil, nil } -func (repo singleUserRepo) Refresh(ctx context.Context, in *magistrala.RefreshReq, opts ...grpc.CallOption) (*magistrala.Token, error) { +func (repo singleUserAuth) Refresh(ctx context.Context, in *magistrala.RefreshReq, opts ...grpc.CallOption) (*magistrala.Token, error) { return nil, nil } -func (repo singleUserRepo) Issue(ctx context.Context, in *magistrala.IssueReq, opts ...grpc.CallOption) (*magistrala.Token, error) { +func (repo singleUserAuth) Issue(ctx context.Context, in *magistrala.IssueReq, opts ...grpc.CallOption) (*magistrala.Token, error) { return nil, nil } -func (repo singleUserRepo) Identify(ctx context.Context, in *magistrala.IdentityReq, opts ...grpc.CallOption) (*magistrala.IdentityRes, error) { +func (repo singleUserAuth) Identify(ctx context.Context, in *magistrala.IdentityReq, opts ...grpc.CallOption) (*magistrala.IdentityRes, error) { if repo.token != in.GetToken() { return nil, svcerr.ErrAuthentication } @@ -46,7 +50,7 @@ func (repo singleUserRepo) Identify(ctx context.Context, in *magistrala.Identity return &magistrala.IdentityRes{Id: repo.id}, nil } -func (repo singleUserRepo) Authorize(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption) (*magistrala.AuthorizeRes, error) { +func (repo singleUserAuth) Authorize(ctx context.Context, in *magistrala.AuthorizeReq, opts ...grpc.CallOption) (*magistrala.AuthorizeRes, error) { if repo.id != in.Subject { return &magistrala.AuthorizeRes{Authorized: false}, svcerr.ErrAuthorization } @@ -54,50 +58,63 @@ func (repo singleUserRepo) Authorize(ctx context.Context, in *magistrala.Authori return &magistrala.AuthorizeRes{Authorized: true}, nil } -func (repo singleUserRepo) AddPolicy(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption) (*magistrala.AddPolicyRes, error) { +type singleUserPolicyClient struct { + id string + token string +} + +// NewPolicyService creates single user policy service for constrained environments. +func NewPolicyService(id, token string) magistrala.PolicyServiceClient { + return singleUserPolicyClient{ + id: id, + token: token, + } +} + +func (repo singleUserPolicyClient) AddPolicy(ctx context.Context, in *magistrala.AddPolicyReq, opts ...grpc.CallOption) (*magistrala.AddPolicyRes, error) { return nil, nil } -func (repo singleUserRepo) AddPolicies(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption) (*magistrala.AddPoliciesRes, error) { +func (repo singleUserPolicyClient) AddPolicies(ctx context.Context, in *magistrala.AddPoliciesReq, opts ...grpc.CallOption) (*magistrala.AddPoliciesRes, error) { return nil, nil } -func (repo singleUserRepo) DeletePolicyFilter(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { +func (repo singleUserPolicyClient) DeletePolicyFilter(ctx context.Context, in *magistrala.DeletePolicyFilterReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { return nil, nil } -func (repo singleUserRepo) DeletePolicies(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { +func (repo singleUserPolicyClient) DeletePolicies(ctx context.Context, in *magistrala.DeletePoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { return nil, nil } -func (repo singleUserRepo) ListObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { +func (repo singleUserPolicyClient) ListObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { return nil, nil } -func (repo singleUserRepo) ListAllObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { +func (repo singleUserPolicyClient) ListAllObjects(ctx context.Context, in *magistrala.ListObjectsReq, opts ...grpc.CallOption) (*magistrala.ListObjectsRes, error) { return nil, nil } -func (repo singleUserRepo) CountObjects(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption) (*magistrala.CountObjectsRes, error) { +func (repo singleUserPolicyClient) CountObjects(ctx context.Context, in *magistrala.CountObjectsReq, opts ...grpc.CallOption) (*magistrala.CountObjectsRes, error) { return nil, nil } -func (repo singleUserRepo) ListSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { +func (repo singleUserPolicyClient) ListSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { return nil, nil } -func (repo singleUserRepo) ListAllSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { +func (repo singleUserPolicyClient) ListAllSubjects(ctx context.Context, in *magistrala.ListSubjectsReq, opts ...grpc.CallOption) (*magistrala.ListSubjectsRes, error) { return nil, nil } -func (repo singleUserRepo) CountSubjects(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption) (*magistrala.CountSubjectsRes, error) { +func (repo singleUserPolicyClient) CountSubjects(ctx context.Context, in *magistrala.CountSubjectsReq, opts ...grpc.CallOption) (*magistrala.CountSubjectsRes, error) { return nil, nil } -func (repo singleUserRepo) ListPermissions(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption) (*magistrala.ListPermissionsRes, error) { +func (repo singleUserPolicyClient) ListPermissions(ctx context.Context, in *magistrala.ListPermissionsReq, opts ...grpc.CallOption) (*magistrala.ListPermissionsRes, error) { return nil, nil } -func (repo singleUserRepo) DeleteEntityPolicies(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { +func (repo singleUserPolicyClient) DeleteEntityPolicies(ctx context.Context, in *magistrala.DeleteEntityPoliciesReq, opts ...grpc.CallOption) (*magistrala.DeletePolicyRes, error) { return nil, nil } diff --git a/tools/config/mockery.yaml b/tools/config/mockery.yaml index 7de20b2236..82b6e4359f 100644 --- a/tools/config/mockery.yaml +++ b/tools/config/mockery.yaml @@ -8,8 +8,13 @@ boilerplate-file: "./tools/config/boilerplate.txt" packages: github.com/absmach/magistrala: interfaces: - AuthServiceClient: + AuthzServiceClient: + config: + dir: "./things/mocks" + mockname: "AuthzServiceClient" + filename: "authz_client.go" + PolicyServiceClient: config: dir: "./auth/mocks" - mockname: "AuthClient" - filename: "auth_client.go" + mockname: "PolicyServiceClient" + filename: "policy_client.go" diff --git a/users/delete_handler.go b/users/delete_handler.go index e61eadf091..6b8bc1fe58 100644 --- a/users/delete_handler.go +++ b/users/delete_handler.go @@ -25,16 +25,16 @@ const defLimit = uint64(100) type handler struct { clients postgres.Repository - auth magistrala.AuthServiceClient + policy magistrala.PolicyServiceClient checkInterval time.Duration deleteAfter time.Duration logger *slog.Logger } -func NewDeleteHandler(ctx context.Context, clients postgres.Repository, auth magistrala.AuthServiceClient, defCheckInterval, deleteAfter time.Duration, logger *slog.Logger) { +func NewDeleteHandler(ctx context.Context, clients postgres.Repository, policyClient magistrala.PolicyServiceClient, defCheckInterval, deleteAfter time.Duration, logger *slog.Logger) { handler := &handler{ clients: clients, - auth: auth, + policy: policyClient, checkInterval: defCheckInterval, deleteAfter: deleteAfter, logger: logger, @@ -73,7 +73,7 @@ func (h *handler) handle(ctx context.Context) { continue } - deleteRes, err := h.auth.DeleteEntityPolicies(ctx, &magistrala.DeleteEntityPoliciesReq{ + deleteRes, err := h.policy.DeleteEntityPolicies(ctx, &magistrala.DeleteEntityPoliciesReq{ Id: u.ID, EntityType: auth.UserType, }) diff --git a/users/service.go b/users/service.go index dfc1ebeb8c..7a499f1592 100644 --- a/users/service.go +++ b/users/service.go @@ -9,6 +9,7 @@ import ( "github.com/absmach/magistrala" "github.com/absmach/magistrala/auth" + grpcclient "github.com/absmach/magistrala/auth/api/grpc" mgclients "github.com/absmach/magistrala/pkg/clients" "github.com/absmach/magistrala/pkg/errors" repoerr "github.com/absmach/magistrala/pkg/errors/repository" @@ -27,17 +28,19 @@ var ( type service struct { clients postgres.Repository idProvider magistrala.IDProvider - auth magistrala.AuthServiceClient + auth grpcclient.AuthServiceClient + policy magistrala.PolicyServiceClient hasher Hasher email Emailer selfRegister bool } // NewService returns a new Users service implementation. -func NewService(crepo postgres.Repository, authClient magistrala.AuthServiceClient, emailer Emailer, hasher Hasher, idp magistrala.IDProvider, selfRegister bool) Service { +func NewService(crepo postgres.Repository, authClient grpcclient.AuthServiceClient, policyClient magistrala.PolicyServiceClient, emailer Emailer, hasher Hasher, idp magistrala.IDProvider, selfRegister bool) Service { return service{ clients: crepo, auth: authClient, + policy: policyClient, hasher: hasher, email: emailer, idProvider: idp, @@ -500,7 +503,7 @@ func (svc service) ListMembers(ctx context.Context, token, objectKind, objectID if _, err := svc.authorize(ctx, auth.UserType, auth.TokenKind, token, authzPerm, objectType, objectID); err != nil { return mgclients.MembersPage{}, errors.Wrap(svcerr.ErrAuthorization, err) } - duids, err := svc.auth.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ + duids, err := svc.policy.ListAllSubjects(ctx, &magistrala.ListSubjectsReq{ SubjectType: auth.UserType, Permission: pm.Permission, Object: objectID, @@ -571,7 +574,7 @@ func (svc service) retrieveObjectUsersPermissions(ctx context.Context, domainID, } func (svc service) listObjectUserPermission(ctx context.Context, userID, objectType, objectID string) ([]string, error) { - lp, err := svc.auth.ListPermissions(ctx, &magistrala.ListPermissionsReq{ + lp, err := svc.policy.ListPermissions(ctx, &magistrala.ListPermissionsReq{ SubjectType: auth.UserType, Subject: userID, Object: objectID, @@ -678,7 +681,7 @@ func (svc service) addClientPolicy(ctx context.Context, userID string, role mgcl Object: auth.MagistralaObject, }) } - resp, err := svc.auth.AddPolicies(ctx, &policies) + resp, err := svc.policy.AddPolicies(ctx, &policies) if err != nil { return errors.Wrap(svcerr.ErrAddPolicies, err) } @@ -708,7 +711,7 @@ func (svc service) addClientPolicyRollback(ctx context.Context, userID string, r Object: auth.MagistralaObject, }) } - resp, err := svc.auth.DeletePolicies(ctx, &policies) + resp, err := svc.policy.DeletePolicies(ctx, &policies) if err != nil { return errors.Wrap(svcerr.ErrDeletePolicies, err) } @@ -721,7 +724,7 @@ func (svc service) addClientPolicyRollback(ctx context.Context, userID string, r func (svc service) updateClientPolicy(ctx context.Context, userID string, role mgclients.Role) error { switch role { case mgclients.AdminRole: - resp, err := svc.auth.AddPolicy(ctx, &magistrala.AddPolicyReq{ + resp, err := svc.policy.AddPolicy(ctx, &magistrala.AddPolicyReq{ SubjectType: auth.UserType, Subject: userID, Relation: auth.AdministratorRelation, @@ -738,7 +741,7 @@ func (svc service) updateClientPolicy(ctx context.Context, userID string, role m case mgclients.UserRole: fallthrough default: - resp, err := svc.auth.DeletePolicyFilter(ctx, &magistrala.DeletePolicyFilterReq{ + resp, err := svc.policy.DeletePolicyFilter(ctx, &magistrala.DeletePolicyFilterReq{ SubjectType: auth.UserType, Subject: userID, Relation: auth.AdministratorRelation, diff --git a/users/service_test.go b/users/service_test.go index ae9c6febe2..382c863094 100644 --- a/users/service_test.go +++ b/users/service_test.go @@ -50,15 +50,16 @@ var ( errHashPassword = errors.New("generate hash from password failed") ) -func newService(selfRegister bool) (users.Service, *mocks.Repository, *authmocks.AuthClient, *mocks.Emailer) { +func newService(selfRegister bool) (users.Service, *mocks.Repository, *authmocks.AuthServiceClient, *authmocks.PolicyServiceClient, *mocks.Emailer) { cRepo := new(mocks.Repository) - auth := new(authmocks.AuthClient) + auth := new(authmocks.AuthServiceClient) + policy := new(authmocks.PolicyServiceClient) e := new(mocks.Emailer) - return users.NewService(cRepo, auth, e, phasher, idProvider, selfRegister), cRepo, auth, e + return users.NewService(cRepo, auth, policy, e, phasher, idProvider, selfRegister), cRepo, auth, policy, e } func TestRegisterClient(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, _, policy, _ := newService(true) cases := []struct { desc string @@ -263,8 +264,8 @@ func TestRegisterClient(t *testing.T) { } for _, tc := range cases { - authCall := auth.On("AddPolicies", context.Background(), mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesResponseErr) - authCall1 := auth.On("DeletePolicies", context.Background(), mock.Anything).Return(tc.deletePoliciesResponse, tc.deletePoliciesResponseErr) + authCall := policy.On("AddPolicies", context.Background(), mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesResponseErr) + authCall1 := policy.On("DeletePolicies", context.Background(), mock.Anything).Return(tc.deletePoliciesResponse, tc.deletePoliciesResponseErr) repoCall := cRepo.On("Save", context.Background(), mock.Anything).Return(tc.client, tc.saveErr) expected, err := svc.RegisterClient(context.Background(), tc.token, tc.client) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) @@ -283,7 +284,7 @@ func TestRegisterClient(t *testing.T) { authCall.Unset() } - svc, cRepo, auth, _ = newService(false) + svc, cRepo, auth, policy, _ := newService(false) cases2 := []struct { desc string @@ -340,8 +341,8 @@ func TestRegisterClient(t *testing.T) { authCall := auth.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) authCall1 := auth.On("Authorize", context.Background(), mock.Anything).Return(tc.authorizeResponse, tc.authorizeErr) repoCall := cRepo.On("CheckSuperAdmin", context.Background(), mock.Anything).Return(tc.checkSuperAdminErr) - authCall2 := auth.On("AddPolicies", context.Background(), mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesResponseErr) - authCall3 := auth.On("DeletePolicies", context.Background(), mock.Anything).Return(tc.deletePoliciesResponse, tc.deletePoliciesResponseErr) + authCall2 := policy.On("AddPolicies", context.Background(), mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesResponseErr) + authCall3 := policy.On("DeletePolicies", context.Background(), mock.Anything).Return(tc.deletePoliciesResponse, tc.deletePoliciesResponseErr) repoCall1 := cRepo.On("Save", context.Background(), mock.Anything).Return(tc.client, tc.saveErr) expected, err := svc.RegisterClient(context.Background(), tc.token, tc.client) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) @@ -366,7 +367,7 @@ func TestRegisterClient(t *testing.T) { } func TestViewClient(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) adminID := testsutil.GenerateUUID(t) cases := []struct { @@ -477,7 +478,7 @@ func TestViewClient(t *testing.T) { } func TestListClients(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) cases := []struct { desc string @@ -593,7 +594,7 @@ func TestListClients(t *testing.T) { } func TestSearchUsers(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) cases := []struct { desc string token string @@ -675,7 +676,7 @@ func TestSearchUsers(t *testing.T) { } func TestUpdateClient(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) client1 := client client2 := client @@ -805,7 +806,7 @@ func TestUpdateClient(t *testing.T) { } func TestUpdateClientTags(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) client.Tags = []string{"updated"} adminID := testsutil.GenerateUUID(t) @@ -915,7 +916,7 @@ func TestUpdateClientTags(t *testing.T) { } func TestUpdateClientIdentity(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) client2 := client client2.Credentials.Identity = "updated@example.com" @@ -1035,7 +1036,7 @@ func TestUpdateClientIdentity(t *testing.T) { } func TestUpdateClientRole(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, policy, _ := newService(true) client2 := client client.Role = mgclients.AdminRole @@ -1239,8 +1240,8 @@ func TestUpdateClientRole(t *testing.T) { authCall1 := auth.On("Authorize", context.Background(), tc.superAdminAuthReq).Return(tc.superAdminAuthRes, tc.authorizeErr) repoCall := cRepo.On("CheckSuperAdmin", context.Background(), mock.Anything).Return(tc.checkSuperAdminErr) authCall2 := auth.On("Authorize", context.Background(), tc.membershipAuthReq).Return(tc.membershipAuthRes, tc.membershipAuthErr) - authCall3 := auth.On("AddPolicy", context.Background(), mock.Anything).Return(tc.addPolicyResponse, tc.addPolicyErr) - authCall4 := auth.On("DeletePolicyFilter", context.Background(), mock.Anything).Return(tc.deletePolicyFilterResponse, tc.deletePolicyErr) + authCall3 := policy.On("AddPolicy", context.Background(), mock.Anything).Return(tc.addPolicyResponse, tc.addPolicyErr) + authCall4 := policy.On("DeletePolicyFilter", context.Background(), mock.Anything).Return(tc.deletePolicyFilterResponse, tc.deletePolicyErr) repoCall1 := cRepo.On("UpdateRole", context.Background(), mock.Anything).Return(tc.updateRoleResponse, tc.updateRoleErr) updatedClient, err := svc.UpdateClientRole(context.Background(), tc.token, tc.client) @@ -1261,7 +1262,7 @@ func TestUpdateClientRole(t *testing.T) { } func TestUpdateClientSecret(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) newSecret := "newstrongSecret" rClient := client @@ -1391,7 +1392,7 @@ func TestUpdateClientSecret(t *testing.T) { } func TestEnableClient(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) enabledClient1 := mgclients.Client{ID: testsutil.GenerateUUID(t), Credentials: mgclients.Credentials{Identity: "client1@example.com", Secret: "password"}, Status: mgclients.EnabledStatus} disabledClient1 := mgclients.Client{ID: testsutil.GenerateUUID(t), Credentials: mgclients.Credentials{Identity: "client3@example.com", Secret: "password"}, Status: mgclients.DisabledStatus} @@ -1515,7 +1516,7 @@ func TestEnableClient(t *testing.T) { } func TestDisableClient(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) enabledClient1 := mgclients.Client{ID: testsutil.GenerateUUID(t), Credentials: mgclients.Credentials{Identity: "client1@example.com", Secret: "password"}, Status: mgclients.EnabledStatus} disabledClient1 := mgclients.Client{ID: testsutil.GenerateUUID(t), Credentials: mgclients.Credentials{Identity: "client3@example.com", Secret: "password"}, Status: mgclients.DisabledStatus} @@ -1639,7 +1640,7 @@ func TestDisableClient(t *testing.T) { } func TestDeleteClient(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) enabledClient1 := mgclients.Client{ID: testsutil.GenerateUUID(t), Credentials: mgclients.Credentials{Identity: "client1@example.com", Secret: "password"}, Status: mgclients.EnabledStatus} deletedClient1 := mgclients.Client{ID: testsutil.GenerateUUID(t), Credentials: mgclients.Credentials{Identity: "client3@example.com", Secret: "password"}, Status: mgclients.DeletedStatus} @@ -1762,7 +1763,7 @@ func TestDeleteClient(t *testing.T) { } func TestListMembers(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, policy, _ := newService(true) validPolicy := fmt.Sprintf("%s_%s", validID, client.ID) permissionsClient := basicClient @@ -2214,9 +2215,9 @@ func TestListMembers(t *testing.T) { for _, tc := range cases { authCall := auth.On("Identify", context.Background(), &magistrala.IdentityReq{Token: tc.token}).Return(tc.identifyResponse, tc.identifyErr) authCall1 := auth.On("Authorize", context.Background(), tc.authorizeReq).Return(tc.authorizeResponse, tc.authorizeErr) - authCall2 := auth.On("ListAllSubjects", context.Background(), tc.listAllSubjectsReq).Return(tc.listAllSubjectsResponse, tc.listAllSubjectsErr) + authCall2 := policy.On("ListAllSubjects", context.Background(), tc.listAllSubjectsReq).Return(tc.listAllSubjectsResponse, tc.listAllSubjectsErr) repoCall := cRepo.On("RetrieveAll", context.Background(), mock.Anything).Return(tc.retrieveAllResponse, tc.retrieveAllErr) - authCall3 := auth.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionErr) + authCall3 := policy.On("ListPermissions", mock.Anything, mock.Anything).Return(tc.listPermissionsResponse, tc.listPermissionErr) page, err := svc.ListMembers(context.Background(), tc.token, tc.objectKind, tc.objectID, tc.page) assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) @@ -2231,7 +2232,7 @@ func TestListMembers(t *testing.T) { } func TestIssueToken(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) rClient := client rClient2 := client @@ -2315,7 +2316,7 @@ func TestIssueToken(t *testing.T) { } func TestRefreshToken(t *testing.T) { - svc, crepo, auth, _ := newService(true) + svc, crepo, auth, _, _ := newService(true) rClient := client rClient.Credentials.Secret, _ = phasher.Hash(client.Credentials.Secret) @@ -2417,7 +2418,7 @@ func TestRefreshToken(t *testing.T) { } func TestGenerateResetToken(t *testing.T) { - svc, cRepo, auth, e := newService(true) + svc, cRepo, auth, _, e := newService(true) cases := []struct { desc string @@ -2476,7 +2477,7 @@ func TestGenerateResetToken(t *testing.T) { } func TestResetSecret(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) client := mgclients.Client{ ID: "clientID", @@ -2581,7 +2582,7 @@ func TestResetSecret(t *testing.T) { } func TestViewProfile(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, _, _ := newService(true) client := mgclients.Client{ ID: "clientID", @@ -2642,7 +2643,7 @@ func TestViewProfile(t *testing.T) { } func TestOAuthCallback(t *testing.T) { - svc, cRepo, auth, _ := newService(true) + svc, cRepo, auth, policy, _ := newService(true) cases := []struct { desc string @@ -2794,7 +2795,7 @@ func TestOAuthCallback(t *testing.T) { repoCall := cRepo.On("RetrieveByIdentity", context.Background(), tc.client.Credentials.Identity).Return(tc.retrieveByIdentityResponse, tc.retrieveByIdentityErr) repoCall1 := cRepo.On("Save", context.Background(), mock.Anything).Return(tc.saveResponse, tc.saveErr) authCall := auth.On("Issue", mock.Anything, mock.Anything).Return(tc.issueResponse, tc.issueErr) - authCall1 := auth.On("AddPolicies", mock.Anything, mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesErr) + authCall1 := policy.On("AddPolicies", mock.Anything, mock.Anything).Return(tc.addPoliciesResponse, tc.addPoliciesErr) authCall2 := auth.On("Authorize", mock.Anything, authReq).Return(tc.authorizeResponse, tc.authorizeErr) token, err := svc.OAuthCallback(context.Background(), tc.client) if err == nil { diff --git a/ws/adapter.go b/ws/adapter.go index c8cc577dc7..a922160bf8 100644 --- a/ws/adapter.go +++ b/ws/adapter.go @@ -41,14 +41,14 @@ type Service interface { var _ Service = (*adapterService)(nil) type adapterService struct { - auth magistrala.AuthzServiceClient + things magistrala.AuthzServiceClient pubsub messaging.PubSub } // New instantiates the WS adapter implementation. -func New(authClient magistrala.AuthzServiceClient, pubsub messaging.PubSub) Service { +func New(thingsClient magistrala.AuthzServiceClient, pubsub messaging.PubSub) Service { return &adapterService{ - auth: authClient, + things: thingsClient, pubsub: pubsub, } } @@ -92,7 +92,7 @@ func (svc *adapterService) authorize(ctx context.Context, thingKey, chanID, acti Object: chanID, ObjectType: auth.GroupType, } - res, err := svc.auth.Authorize(ctx, ar) + res, err := svc.things.Authorize(ctx, ar) if err != nil { return "", errors.Wrap(svcerr.ErrAuthorization, err) } diff --git a/ws/adapter_test.go b/ws/adapter_test.go index 4bccf87f62..fac81f003b 100644 --- a/ws/adapter_test.go +++ b/ws/adapter_test.go @@ -9,11 +9,11 @@ import ( "testing" "github.com/absmach/magistrala" - authmocks "github.com/absmach/magistrala/auth/mocks" "github.com/absmach/magistrala/internal/testsutil" svcerr "github.com/absmach/magistrala/pkg/errors/service" "github.com/absmach/magistrala/pkg/messaging" "github.com/absmach/magistrala/pkg/messaging/mocks" + thmocks "github.com/absmach/magistrala/things/mocks" "github.com/absmach/magistrala/ws" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -37,15 +37,15 @@ var msg = messaging.Message{ Payload: []byte(`[{"n":"current","t":-5,"v":1.2}]`), } -func newService() (ws.Service, *mocks.PubSub, *authmocks.AuthClient) { +func newService() (ws.Service, *mocks.PubSub, *thmocks.AuthzServiceClient) { pubsub := new(mocks.PubSub) - auth := new(authmocks.AuthClient) + things := new(thmocks.AuthzServiceClient) - return ws.New(auth, pubsub), pubsub, auth + return ws.New(things, pubsub), pubsub, things } func TestSubscribe(t *testing.T) { - svc, pubsub, auth := newService() + svc, pubsub, things := newService() c := ws.NewClient(nil) @@ -115,7 +115,7 @@ func TestSubscribe(t *testing.T) { Handler: c, } repocall := pubsub.On("Subscribe", mock.Anything, subConfig).Return(tc.err) - repocall1 := auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true, Id: thingID}, nil) + repocall1 := things.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: true, Id: thingID}, nil) err := svc.Subscribe(context.Background(), tc.thingKey, tc.chanID, tc.subtopic, c) assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err)) repocall1.Parent.AssertCalled(t, "Authorize", mock.Anything, mock.Anything) diff --git a/ws/api/endpoint_test.go b/ws/api/endpoint_test.go index 25963522d1..370ae72ce2 100644 --- a/ws/api/endpoint_test.go +++ b/ws/api/endpoint_test.go @@ -13,9 +13,9 @@ import ( "testing" "github.com/absmach/magistrala" - authmocks "github.com/absmach/magistrala/auth/mocks" mglog "github.com/absmach/magistrala/logger" "github.com/absmach/magistrala/pkg/messaging/mocks" + thmocks "github.com/absmach/magistrala/things/mocks" "github.com/absmach/magistrala/ws" "github.com/absmach/magistrala/ws/api" "github.com/absmach/mproxy/pkg/session" @@ -36,9 +36,9 @@ const ( var msg = []byte(`[{"n":"current","t":-1,"v":1.6}]`) -func newService(auth magistrala.AuthzServiceClient) (ws.Service, *mocks.PubSub) { +func newService(things magistrala.AuthzServiceClient) (ws.Service, *mocks.PubSub) { pubsub := new(mocks.PubSub) - return ws.New(auth, pubsub), pubsub + return ws.New(things, pubsub), pubsub } func newHTTPServer(svc ws.Service) *httptest.Server { @@ -90,17 +90,17 @@ func handshake(tsURL, chanID, subtopic, thingKey string, addHeader bool) (*webso } func TestHandshake(t *testing.T) { - auth := new(authmocks.AuthClient) - svc, pubsub := newService(auth) + things := new(thmocks.AuthzServiceClient) + svc, pubsub := newService(things) target := newHTTPServer(svc) defer target.Close() - handler := ws.NewHandler(pubsub, mglog.NewMock(), auth) + handler := ws.NewHandler(pubsub, mglog.NewMock(), things) ts, err := newProxyHTPPServer(handler, target) require.Nil(t, err) defer ts.Close() - auth.On("Authorize", mock.Anything, &magistrala.AuthorizeReq{Subject: thingKey, Object: id, Domain: "", SubjectType: "thing", Permission: "publish", ObjectType: "group"}).Return(&magistrala.AuthorizeRes{Authorized: true, Id: "1"}, nil) - auth.On("Authorize", mock.Anything, &magistrala.AuthorizeReq{Subject: thingKey, Object: id, Domain: "", SubjectType: "thing", Permission: "subscribe", ObjectType: "group"}).Return(&magistrala.AuthorizeRes{Authorized: true, Id: "2"}, nil) - auth.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: false, Id: "3"}, nil) + things.On("Authorize", mock.Anything, &magistrala.AuthorizeReq{Subject: thingKey, Object: id, Domain: "", SubjectType: "thing", Permission: "publish", ObjectType: "group"}).Return(&magistrala.AuthorizeRes{Authorized: true, Id: "1"}, nil) + things.On("Authorize", mock.Anything, &magistrala.AuthorizeReq{Subject: thingKey, Object: id, Domain: "", SubjectType: "thing", Permission: "subscribe", ObjectType: "group"}).Return(&magistrala.AuthorizeRes{Authorized: true, Id: "2"}, nil) + things.On("Authorize", mock.Anything, mock.Anything).Return(&magistrala.AuthorizeRes{Authorized: false, Id: "3"}, nil) pubsub.On("Subscribe", mock.Anything, mock.Anything).Return(nil) pubsub.On("Publish", mock.Anything, mock.Anything, mock.Anything).Return(nil) diff --git a/ws/handler.go b/ws/handler.go index c2b8b89b5f..d95643ab20 100644 --- a/ws/handler.go +++ b/ws/handler.go @@ -51,16 +51,16 @@ var channelRegExp = regexp.MustCompile(`^\/?channels\/([\w\-]+)\/messages(\/[^?] // Event implements events.Event interface. type handler struct { pubsub messaging.PubSub - auth magistrala.AuthzServiceClient + things magistrala.AuthzServiceClient logger *slog.Logger } // NewHandler creates new Handler entity. -func NewHandler(pubsub messaging.PubSub, logger *slog.Logger, authClient magistrala.AuthzServiceClient) session.Handler { +func NewHandler(pubsub messaging.PubSub, logger *slog.Logger, thingsClient magistrala.AuthzServiceClient) session.Handler { return &handler{ logger: logger, pubsub: pubsub, - auth: authClient, + things: thingsClient, } } @@ -167,7 +167,7 @@ func (h *handler) Publish(ctx context.Context, topic *string, payload *[]byte) e Object: chanID, ObjectType: auth.GroupType, } - res, err := h.auth.Authorize(ctx, ar) + res, err := h.things.Authorize(ctx, ar) if err != nil { return err } @@ -238,7 +238,7 @@ func (h *handler) authAccess(ctx context.Context, password, topic, action string Object: chanID, ObjectType: auth.GroupType, } - res, err := h.auth.Authorize(ctx, ar) + res, err := h.things.Authorize(ctx, ar) if err != nil { return errors.Wrap(svcerr.ErrAuthorization, err) }