Skip to content

Commit 1bea63e

Browse files
authored
NOISSUE - Remove Magistrala dependencies
* First implementation Signed-off-by: nyagamunene <[email protected]> * Fix postgres and service test Signed-off-by: nyagamunene <[email protected]> * Fix tests and docker compose Signed-off-by: nyagamunene <[email protected]> * Remove debugging statements Signed-off-by: nyagamunene <[email protected]> * Handle error logs Signed-off-by: nyagamunene <[email protected]> * Add license to each file Signed-off-by: nyagamunene <[email protected]> * Add jaeger Signed-off-by: nyagamunene <[email protected]> * Add marshaljson error Signed-off-by: nyagamunene <[email protected]> * grpc refactor Signed-off-by: nyagamunene <[email protected]> * Remove userId Signed-off-by: nyagamunene <[email protected]> * Add more fields in certificate template Signed-off-by: nyagamunene <[email protected]> * Add certs download encode response Signed-off-by: nyagamunene <[email protected]> * Add mockery.yaml file Signed-off-by: nyagamunene <[email protected]> * Generate root CA when service is intialized Signed-off-by: nyagamunene <[email protected]> * Remove mount volume Signed-off-by: nyagamunene <[email protected]> * Remove packages folder Signed-off-by: nyagamunene <[email protected]> * Remove web leftovers Signed-off-by: nyagamunene <[email protected]> --------- Signed-off-by: nyagamunene <[email protected]>
1 parent 967eff3 commit 1bea63e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+2279
-978
lines changed

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Copyright (c) Abstract Machines
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
# build dirs
5+
build
6+
7+
# coverage files
8+
coverage

Makefile

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
AM_DOCKER_IMAGE_NAME_PREFIX ?= absamach
1+
# Copyright (c) Abstract Machines
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
AM_DOCKER_IMAGE_NAME_PREFIX ?= absmach
25
BUILD_DIR = build
36
SERVICES = certs
47
DOCKERS = $(addprefix docker_,$(SERVICES))
@@ -16,7 +19,7 @@ define compile_service
1619
-X 'github.com/absmach/certs/http.BuildTime=$(TIME)' \
1720
-X 'github.com/absmach/certs/internal/http.Version=$(VERSION)' \
1821
-X 'github.com/absmach/certs/internal/http.Commit=$(COMMIT)'" \
19-
-o ${BUILD_DIR}/cers-$(1) cmd/$(1)/main.go
22+
-o ${BUILD_DIR}/$(1) cmd/main.go
2023
endef
2124

2225
define make_docker
@@ -67,7 +70,7 @@ mocks:
6770
@which mockery > /dev/null || go install github.com/vektra/mockery/v2@$(MOCKERY_VERSION)
6871
mockery --config ./mockery.yaml
6972

70-
test:mocks
73+
test: mocks
7174
go test -v -race -count 1 -tags test $(shell go list ./... | grep -v 'vendor\|cmd')
7275

7376
proto:

api/grpc/endpoint.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// Copyright (c) Ultraviolet
1+
// Copyright (c) Abstract Machines
2+
// SPDX-License-Identifier: Apache-2.0
3+
24
package grpc
35

46
import (

api/grpc/server.go

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
// Copyright (c) Ultraviolet
1+
// Copyright (c) Abstract Machines
2+
// SPDX-License-Identifier: Apache-2.0
3+
24
package grpc
35

46
import (
57
"context"
68

79
"github.com/absmach/certs"
8-
"github.com/absmach/magistrala/pkg/apiutil"
9-
"github.com/absmach/magistrala/pkg/errors"
10-
"github.com/absmach/magistrala/pkg/errors/service"
11-
"github.com/go-kit/kit/otelkit"
10+
errors "github.com/absmach/certs"
11+
"github.com/absmach/certs/api/http"
1212
kitgrpc "github.com/go-kit/kit/transport/grpc"
1313
"google.golang.org/grpc/codes"
1414
"google.golang.org/grpc/status"
@@ -24,7 +24,7 @@ type grpcServer struct {
2424
func NewServer(svc certs.Service) certs.CertsServiceServer {
2525
return &grpcServer{
2626
getEntity: kitgrpc.NewServer(
27-
otelkit.EndpointMiddleware(otelkit.WithOperation("get_entity"))(getEntityEndpoint(svc)),
27+
(getEntityEndpoint(svc)),
2828
decodeGetEntityReq,
2929
encodeGetEntityRes,
3030
),
@@ -52,29 +52,16 @@ func encodeError(err error) error {
5252
switch {
5353
case errors.Contains(err, nil):
5454
return nil
55-
case errors.Contains(err, errors.ErrMalformedEntity),
56-
errors.Contains(err, apiutil.ErrMissingID),
57-
errors.Contains(err, apiutil.ErrEmptyList),
58-
errors.Contains(err, apiutil.ErrNameSize),
59-
errors.Contains(err, apiutil.ErrMalformedPolicy),
60-
errors.Contains(err, apiutil.ErrMissingUser),
61-
errors.Contains(err, apiutil.ErrMissingComputation),
62-
errors.Contains(err, apiutil.ErrInvalidRole):
55+
case errors.Contains(err, certs.ErrMalformedEntity),
56+
errors.Contains(err, http.ErrMissingID):
6357
return status.Error(codes.InvalidArgument, err.Error())
64-
case errors.Contains(err, service.ErrAuthentication):
65-
return status.Error(codes.Unauthenticated, err.Error())
66-
case errors.Contains(err, service.ErrAuthorization):
67-
return status.Error(codes.PermissionDenied, err.Error())
68-
case errors.Contains(err, service.ErrNotFound):
58+
case errors.Contains(err, certs.ErrNotFound):
6959
return status.Error(codes.NotFound, err.Error())
70-
case errors.Contains(err, service.ErrConflict):
60+
case errors.Contains(err, certs.ErrConflict):
7161
return status.Error(codes.AlreadyExists, err.Error())
72-
case errors.Contains(err, errors.ErrUnsupportedContentType):
73-
return status.Error(codes.Unimplemented, err.Error())
74-
case errors.Contains(err, service.ErrCreateEntity),
75-
errors.Contains(err, service.ErrUpdateEntity),
76-
errors.Contains(err, service.ErrViewEntity),
77-
errors.Contains(err, service.ErrRemoveEntity):
62+
case errors.Contains(err, certs.ErrCreateEntity),
63+
errors.Contains(err, certs.ErrUpdateEntity),
64+
errors.Contains(err, certs.ErrViewEntity):
7865
return status.Error(codes.Internal, err.Error())
7966
default:
8067
return status.Error(codes.Internal, "internal server error")

api/http/common.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// Copyright (c) Abstract Machines
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package http
5+
6+
import (
7+
"context"
8+
"encoding/json"
9+
"net/http"
10+
11+
"github.com/absmach/certs"
12+
errors "github.com/absmach/certs"
13+
)
14+
15+
const (
16+
// ContentType represents JSON content type.
17+
ContentType = "application/json"
18+
)
19+
20+
// Response contains HTTP response specific methods.
21+
type Response interface {
22+
// Code returns HTTP response code.
23+
Code() int
24+
25+
// Headers returns map of HTTP headers with their values.
26+
Headers() map[string]string
27+
28+
// Empty indicates if HTTP response has content.
29+
Empty() bool
30+
}
31+
32+
// EncodeError encodes an error response.
33+
func EncodeError(_ context.Context, err error, w http.ResponseWriter) {
34+
var wrapper error
35+
if errors.Contains(err, ErrValidation) {
36+
wrapper, err = errors.Unwrap(err)
37+
}
38+
39+
w.Header().Set("Content-Type", ContentType)
40+
switch {
41+
case errors.Contains(err, certs.ErrCertExpired):
42+
err = unwrap(err)
43+
w.WriteHeader(http.StatusForbidden)
44+
45+
case errors.Contains(err, certs.ErrCertRevoked):
46+
err = unwrap(err)
47+
w.WriteHeader(http.StatusUnauthorized)
48+
case errors.Contains(err, certs.ErrMalformedEntity),
49+
errors.Contains(err, ErrMissingID),
50+
errors.Contains(err, ErrInvalidQueryParams),
51+
errors.Contains(err, ErrValidation),
52+
errors.Contains(err, ErrInvalidRequest),
53+
errors.Contains(err, certs.ErrViewEntity):
54+
err = unwrap(err)
55+
w.WriteHeader(http.StatusBadRequest)
56+
57+
case errors.Contains(err, certs.ErrCreateEntity),
58+
errors.Contains(err, certs.ErrUpdateEntity):
59+
err = unwrap(err)
60+
w.WriteHeader(http.StatusUnprocessableEntity)
61+
62+
case errors.Contains(err, certs.ErrNotFound),
63+
errors.Contains(err, certs.ErrRootCANotFound):
64+
err = unwrap(err)
65+
w.WriteHeader(http.StatusNotFound)
66+
67+
case errors.Contains(err, certs.ErrConflict):
68+
err = unwrap(err)
69+
w.WriteHeader(http.StatusConflict)
70+
71+
default:
72+
w.WriteHeader(http.StatusInternalServerError)
73+
}
74+
75+
if wrapper != nil {
76+
err = errors.Wrap(wrapper, err)
77+
}
78+
79+
if errorVal, ok := err.(errors.Error); ok {
80+
if err := json.NewEncoder(w).Encode(errorVal); err != nil {
81+
w.WriteHeader(http.StatusInternalServerError)
82+
}
83+
}
84+
}
85+
86+
func unwrap(err error) error {
87+
wrapper, err := errors.Unwrap(err)
88+
if wrapper != nil {
89+
return wrapper
90+
}
91+
return err
92+
}

api/http/endpoint.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// Copyright (c) Ultraviolet
1+
// Copyright (c) Abstract Machines
2+
// SPDX-License-Identifier: Apache-2.0
3+
24
package http
35

46
import (
@@ -22,7 +24,7 @@ func renewCertEndpoint(svc certs.Service) endpoint.Endpoint {
2224
return renewCertRes{}, err
2325
}
2426

25-
if err = svc.RenewCert(ctx, req.token, req.id); err != nil {
27+
if err = svc.RenewCert(ctx, req.id); err != nil {
2628
return renewCertRes{}, err
2729
}
2830

@@ -37,7 +39,7 @@ func revokeCertEndpoint(svc certs.Service) endpoint.Endpoint {
3739
return revokeCertRes{}, err
3840
}
3941

40-
if err = svc.RevokeCert(ctx, req.token, req.id); err != nil {
42+
if err = svc.RevokeCert(ctx, req.id); err != nil {
4143
return revokeCertRes{}, err
4244
}
4345

@@ -52,7 +54,7 @@ func requestCertDownloadTokenEndpoint(svc certs.Service) endpoint.Endpoint {
5254
return requestCertDownloadTokenRes{}, err
5355
}
5456

55-
token, err := svc.RetrieveCertDownloadToken(ctx, req.token, req.id)
57+
token, err := svc.RetrieveCertDownloadToken(ctx, req.id)
5658
if err != nil {
5759
return requestCertDownloadTokenRes{}, err
5860
}
@@ -63,17 +65,23 @@ func requestCertDownloadTokenEndpoint(svc certs.Service) endpoint.Endpoint {
6365

6466
func downloadCertEndpoint(svc certs.Service) endpoint.Endpoint {
6567
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
66-
req := request.(viewReq)
68+
req := request.(downloadReq)
6769
if err := req.validate(); err != nil {
6870
return downloadCertRes{}, err
6971
}
7072

7173
cert, ca, err := svc.RetrieveCert(ctx, req.token, req.id)
7274
if err != nil {
73-
return downloadCertRes{}, err
75+
return fileDownloadRes{}, err
7476
}
7577

76-
return downloadCertRes{Certificate: cert.Certificate, PrivateKey: cert.Key, CA: ca}, nil
78+
return fileDownloadRes{
79+
Certificate: cert.Certificate,
80+
PrivateKey: cert.Key,
81+
CA: ca,
82+
Filename: "certificates.zip",
83+
ContentType: "application/zip",
84+
}, nil
7785
}
7886
}
7987

@@ -84,7 +92,7 @@ func issueCertEndpoint(svc certs.Service) endpoint.Endpoint {
8492
return issueCertRes{}, err
8593
}
8694

87-
serialNumber, err := svc.IssueCert(ctx, req.token, req.entityID, certs.EntityType(req.entityType), req.IpAddrs)
95+
serialNumber, err := svc.IssueCert(ctx, req.entityID, certs.EntityType(req.entityType), req.IpAddrs)
8896
if err != nil {
8997
return issueCertRes{}, err
9098
}
@@ -100,7 +108,7 @@ func listCertsEndpoint(svc certs.Service) endpoint.Endpoint {
100108
return listCertsRes{}, err
101109
}
102110

103-
certPage, err := svc.ListCerts(ctx, req.token, req.pm)
111+
certPage, err := svc.ListCerts(ctx, req.pm)
104112
if err != nil {
105113
return listCertsRes{}, err
106114
}

api/http/errors.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) Abstract Machines
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package http
5+
6+
import errors "github.com/absmach/certs"
7+
8+
var (
9+
// ErrMissingID indicates missing entity ID.
10+
ErrMissingID = errors.New("missing entity id")
11+
12+
// ErrEmptyList indicates that entity data is empty.
13+
ErrEmptyList = errors.New("empty list provided")
14+
15+
// ErrMissingEntityID indicates missing entity ID.
16+
ErrMissingEntityID = errors.New("missing entity ID")
17+
18+
// ErrMissingEntityType indicates missing entity type.
19+
ErrMissingEntityType = errors.New("missing entity type")
20+
21+
// ErrUnsupportedContentType indicates unacceptable or lack of Content-Type.
22+
ErrUnsupportedContentType = errors.New("unsupported content type")
23+
24+
// ErrValidation indicates that an error was returned by the API.
25+
ErrValidation = errors.New("something went wrong with the request")
26+
27+
// ErrInvalidQueryParams indicates invalid query parameters.
28+
ErrInvalidQueryParams = errors.New("invalid query parameters")
29+
30+
// ErrInvalidRequest indicates that the request is invalid.
31+
ErrInvalidRequest = errors.New("invalid request")
32+
)

0 commit comments

Comments
 (0)