Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3c65cbc
feat: provider framework to pass creds to k8s/helm provider
ishanarya0 Mar 30, 2022
4519305
chore: err var name restored
ishanarya0 Mar 30, 2022
ac55169
feat: pass providers in resource payload
ishanarya0 Mar 31, 2022
0f13db9
feat: add provider service
ishanarya0 Apr 4, 2022
3fd60ab
chore: remove unused constants
ishanarya0 Apr 4, 2022
d9789c3
chore: error variable name changed (#28)
ishanarya0 Apr 4, 2022
6376aaa
feat: provider framework to pass creds to k8s/helm provider
ishanarya0 Mar 30, 2022
9a1c26e
chore: err var name restored
ishanarya0 Mar 30, 2022
f77b96a
feat: pass providers in resource payload
ishanarya0 Mar 31, 2022
ee8518d
feat: add provider service
ishanarya0 Apr 4, 2022
096fff5
chore: remove unused constants
ishanarya0 Apr 4, 2022
c59c9d0
Merge branch 'provider-cred-framework' of https://github.com/odpf/ent…
ishanarya0 Apr 5, 2022
98258cf
chore: resolve merge conflicts
ishanarya0 Apr 5, 2022
ed442ec
chore: err var name restored
ishanarya0 Mar 30, 2022
cc825ad
chore: resolve merge conflicts
ishanarya0 Apr 5, 2022
d04d4f5
Merge branch 'provider-cred-framework' of https://github.com/odpf/ent…
ishanarya0 Apr 5, 2022
35c2592
chore: proton version update
ishanarya0 Apr 5, 2022
c5d68eb
chore: remove log statements
ishanarya0 Apr 5, 2022
c9ec39b
refactor: improved map-struct-value conversion
ishanarya0 Apr 5, 2022
bf14a3c
feat: validate full resource config
ishanarya0 Apr 6, 2022
cbb88eb
fix: remove unnecessary error block
ishanarya0 Apr 6, 2022
8103c3e
fix: move firehose defaults to module
ishanarya0 Apr 7, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 118 additions & 14 deletions api/handlers/v1/resource.go → api/handlers/v1/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/odpf/entropy/domain"
"github.com/odpf/entropy/pkg/module"
"github.com/odpf/entropy/pkg/provider"
"github.com/odpf/entropy/pkg/resource"
"github.com/odpf/entropy/store"
entropyv1beta1 "go.buf.build/odpf/gwv/odpf/proton/odpf/entropy/v1beta1"
Expand All @@ -19,14 +20,17 @@ var ErrInternal = status.Error(codes.Internal, "internal server error")

type APIServer struct {
entropyv1beta1.UnimplementedResourceServiceServer
entropyv1beta1.UnimplementedProviderServiceServer
resourceService resource.ServiceInterface
moduleService module.ServiceInterface
providerService provider.ServiceInterface
}

func NewApiServer(resourceService resource.ServiceInterface, moduleService module.ServiceInterface) *APIServer {
func NewApiServer(resourceService resource.ServiceInterface, moduleService module.ServiceInterface, providerService provider.ServiceInterface) *APIServer {
return &APIServer{
resourceService: resourceService,
moduleService: moduleService,
providerService: providerService,
}
}

Expand All @@ -39,7 +43,7 @@ func (server APIServer) CreateResource(ctx context.Context, request *entropyv1be
}
createdResource, err := server.resourceService.CreateResource(ctx, res)
if err != nil {
if errors.Is(err, store.ResourceAlreadyExistsError) {
if errors.Is(err, store.ErrResourceAlreadyExists) {
return nil, status.Error(codes.AlreadyExists, "resource already exists")
}
return nil, ErrInternal
Expand All @@ -61,7 +65,7 @@ func (server APIServer) CreateResource(ctx context.Context, request *entropyv1be
func (server APIServer) UpdateResource(ctx context.Context, request *entropyv1beta1.UpdateResourceRequest) (*entropyv1beta1.UpdateResourceResponse, error) {
res, err := server.resourceService.GetResource(ctx, request.GetUrn())
if err != nil {
if errors.Is(err, store.ResourceNotFoundError) {
if errors.Is(err, store.ErrResourceNotFound) {
return nil, status.Error(codes.NotFound, "could not find resource with given urn")
}
return nil, ErrInternal
Expand Down Expand Up @@ -93,7 +97,7 @@ func (server APIServer) UpdateResource(ctx context.Context, request *entropyv1be
func (server APIServer) GetResource(ctx context.Context, request *entropyv1beta1.GetResourceRequest) (*entropyv1beta1.GetResourceResponse, error) {
res, err := server.resourceService.GetResource(ctx, request.GetUrn())
if err != nil {
if errors.Is(err, store.ResourceNotFoundError) {
if errors.Is(err, store.ErrResourceNotFound) {
return nil, status.Error(codes.NotFound, "could not find resource with given urn")
}
return nil, ErrInternal
Expand Down Expand Up @@ -134,7 +138,7 @@ func (server APIServer) DeleteResource(ctx context.Context, request *entropyv1be
urn := request.GetUrn()
_, err := server.resourceService.GetResource(ctx, urn)
if err != nil {
if errors.Is(err, store.ResourceNotFoundError) {
if errors.Is(err, store.ErrResourceNotFound) {
return nil, status.Error(codes.NotFound, "could not find resource with given urn")
}
return nil, ErrInternal
Expand All @@ -152,7 +156,7 @@ func (server APIServer) DeleteResource(ctx context.Context, request *entropyv1be
func (server APIServer) ApplyAction(ctx context.Context, request *entropyv1beta1.ApplyActionRequest) (*entropyv1beta1.ApplyActionResponse, error) {
res, err := server.resourceService.GetResource(ctx, request.GetUrn())
if err != nil {
if errors.Is(err, store.ResourceNotFoundError) {
if errors.Is(err, store.ErrResourceNotFound) {
return nil, status.Error(codes.NotFound, "could not find resource with given urn")
}
return nil, ErrInternal
Expand All @@ -178,6 +182,50 @@ func (server APIServer) ApplyAction(ctx context.Context, request *entropyv1beta1
return response, nil
}

func (server APIServer) CreateProvider(ctx context.Context, request *entropyv1beta1.CreateProviderRequest) (*entropyv1beta1.CreateProviderResponse, error) {
pro := providerFromProto(request.Provider)
pro.Urn = domain.GenerateProviderUrn(pro)
// TODO: add provider validation

createdProvider, err := server.providerService.CreateProvider(ctx, pro)
if err != nil {
if errors.Is(err, store.ErrProviderAlreadyExists) {
return nil, status.Error(codes.AlreadyExists, "provider already exists")
}
return nil, ErrInternal
}

responseProvider, err := providerToProto(createdProvider)
if err != nil {
return nil, ErrInternal
}
response := entropyv1beta1.CreateProviderResponse{
Provider: responseProvider,
}
return &response, nil
}

func (server APIServer) ListProviders(ctx context.Context, request *entropyv1beta1.ListProvidersRequest) (*entropyv1beta1.ListProvidersResponse, error) {
var responseProviders []*entropyv1beta1.Provider
providers, err := server.providerService.ListProviders(ctx, request.GetParent(), request.GetKind())
if err != nil {
return nil, ErrInternal
}

for _, pro := range providers {
responseProvider, err := providerToProto(pro)
if err != nil {
return nil, ErrInternal
}
responseProviders = append(responseProviders, responseProvider)
}

response := entropyv1beta1.ListProvidersResponse{
Providers: responseProviders,
}
return &response, nil
}

func (server APIServer) syncResource(ctx context.Context, updatedResource *domain.Resource) (*domain.Resource, error) {
syncedResource, err := server.moduleService.Sync(ctx, updatedResource)
if err != nil {
Expand All @@ -193,10 +241,10 @@ func (server APIServer) syncResource(ctx context.Context, updatedResource *domai
func (server APIServer) validateResource(ctx context.Context, res *domain.Resource) error {
err := server.moduleService.Validate(ctx, res)
if err != nil {
if errors.Is(err, store.ModuleNotFoundError) {
if errors.Is(err, store.ErrModuleNotFound) {
return status.Errorf(codes.InvalidArgument, "failed to find module to deploy this kind")
}
if errors.Is(err, domain.ModuleConfigParseFailed) {
if errors.Is(err, domain.ErrModuleConfigParseFailed) {
return status.Errorf(codes.InvalidArgument, "failed to parse configs")
}
return status.Errorf(codes.InvalidArgument, err.Error())
Expand All @@ -216,12 +264,43 @@ func resourceToProto(res *domain.Resource) (*entropyv1beta1.Resource, error) {
Kind: res.Kind,
Configs: conf,
Labels: res.Labels,
Providers: resourceProvidersToProto(res.Providers),
Status: resourceStatusToProto(string(res.Status)),
CreatedAt: timestamppb.New(res.CreatedAt),
UpdatedAt: timestamppb.New(res.UpdatedAt),
}, nil
}

func resourceProvidersToProto(ps []domain.ProviderSelector) []*entropyv1beta1.ProviderSelector {
var providerSelectors []*entropyv1beta1.ProviderSelector

for _, p := range ps {
selector := &entropyv1beta1.ProviderSelector{
Urn: p.Urn,
Target: p.Target,
}
providerSelectors = append(providerSelectors, selector)
}
return providerSelectors
}

func providerToProto(pro *domain.Provider) (*entropyv1beta1.Provider, error) {
conf, err := structpb.NewValue(pro.Configs)
if err != nil {
return nil, err
}
return &entropyv1beta1.Provider{
Urn: pro.Urn,
Name: pro.Name,
Parent: pro.Parent,
Kind: pro.Kind,
Configs: conf,
Labels: pro.Labels,
CreatedAt: timestamppb.New(pro.CreatedAt),
UpdatedAt: timestamppb.New(pro.UpdatedAt),
}, nil
}

func resourceStatusToProto(status string) entropyv1beta1.Resource_Status {
if resourceStatus, ok := entropyv1beta1.Resource_Status_value[status]; ok {
return entropyv1beta1.Resource_Status(resourceStatus)
Expand All @@ -231,11 +310,36 @@ func resourceStatusToProto(status string) entropyv1beta1.Resource_Status {

func resourceFromProto(res *entropyv1beta1.Resource) *domain.Resource {
return &domain.Resource{
Urn: res.GetUrn(),
Name: res.GetName(),
Parent: res.GetParent(),
Kind: res.GetKind(),
Configs: res.GetConfigs().GetStructValue().AsMap(),
Labels: res.GetLabels(),
Urn: res.GetUrn(),
Name: res.GetName(),
Parent: res.GetParent(),
Kind: res.GetKind(),
Configs: res.GetConfigs().GetStructValue().AsMap(),
Labels: res.GetLabels(),
Providers: providerSelectorFromProto(res.GetProviders()),
}
}

func providerSelectorFromProto(ps []*entropyv1beta1.ProviderSelector) []domain.ProviderSelector {
var providerSelectors []domain.ProviderSelector

for _, p := range ps {
selector := domain.ProviderSelector{
Urn: p.GetUrn(),
Target: p.GetTarget(),
}
providerSelectors = append(providerSelectors, selector)
}
return providerSelectors
}

func providerFromProto(pro *entropyv1beta1.Provider) *domain.Provider {
return &domain.Provider{
Urn: pro.GetUrn(),
Name: pro.GetName(),
Parent: pro.GetParent(),
Kind: pro.GetKind(),
Configs: pro.GetConfigs().GetStructValue().AsMap(),
Labels: pro.GetLabels(),
}
}
48 changes: 29 additions & 19 deletions api/handlers/v1/resource_test.go → api/handlers/v1/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ func TestAPIServer_CreateResource(t *testing.T) {
UpdatedAt: createdAt,
}, nil)

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.CreateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("CreateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -135,13 +136,14 @@ func TestAPIServer_CreateResource(t *testing.T) {

resourceService.EXPECT().
CreateResource(mock.Anything, mock.Anything).
Return(nil, store.ResourceAlreadyExistsError).
Return(nil, store.ErrResourceAlreadyExists).
Once()

moduleService := &mocks.ModuleService{}
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(nil)

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.CreateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("CreateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -189,9 +191,10 @@ func TestAPIServer_CreateResource(t *testing.T) {
}, nil).Once()

moduleService := &mocks.ModuleService{}
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(store.ModuleNotFoundError)
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(store.ErrModuleNotFound)

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.CreateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("CreateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -239,9 +242,10 @@ func TestAPIServer_CreateResource(t *testing.T) {
}, nil).Once()

moduleService := &mocks.ModuleService{}
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(domain.ModuleConfigParseFailed)
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(domain.ErrModuleConfigParseFailed)

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.CreateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("CreateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -352,7 +356,8 @@ func TestAPIServer_UpdateResource(t *testing.T) {
UpdatedAt: updatedAt,
}, nil)

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.UpdateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("UpdateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -380,11 +385,12 @@ func TestAPIServer_UpdateResource(t *testing.T) {

resourceService.EXPECT().
GetResource(mock.Anything, mock.Anything).
Return(nil, store.ResourceNotFoundError).Once()
Return(nil, store.ErrResourceNotFound).Once()

moduleService := &mocks.ModuleService{}

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.UpdateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("UpdateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -421,9 +427,10 @@ func TestAPIServer_UpdateResource(t *testing.T) {
}, nil).Once()

moduleService := &mocks.ModuleService{}
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(store.ModuleNotFoundError)
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(store.ErrModuleNotFound)

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.UpdateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("UpdateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -460,9 +467,10 @@ func TestAPIServer_UpdateResource(t *testing.T) {
}, nil).Once()

moduleService := &mocks.ModuleService{}
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(domain.ModuleConfigParseFailed)
moduleService.EXPECT().Validate(mock.Anything, mock.Anything).Return(domain.ErrModuleConfigParseFailed)

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.UpdateResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("UpdateResource() error = %v, wantErr %v", err, wantErr)
Expand Down Expand Up @@ -523,7 +531,7 @@ func TestAPIServer_GetResource(t *testing.T) {
wantErr := status.Error(codes.NotFound, "could not find resource with given urn")

mockResourceService := &mocks.ResourceService{}
mockResourceService.EXPECT().GetResource(mock.Anything, mock.Anything).Return(nil, store.ResourceNotFoundError).Once()
mockResourceService.EXPECT().GetResource(mock.Anything, mock.Anything).Return(nil, store.ErrResourceNotFound).Once()

mockModuleService := &mocks.ModuleService{}

Expand Down Expand Up @@ -620,7 +628,8 @@ func TestAPIServer_DeleteResource(t *testing.T) {

moduleService := &mocks.ModuleService{}

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.DeleteResource(ctx, request)
if !errors.Is(err, wantErr) {
t.Errorf("DeleteResource() error = %v, wantErr %v", err, wantErr)
Expand All @@ -640,11 +649,12 @@ func TestAPIServer_DeleteResource(t *testing.T) {
resourceService := &mocks.ResourceService{}
resourceService.EXPECT().
GetResource(mock.Anything, "p-testdata-gl-testname-log").
Return(nil, store.ResourceNotFoundError).Once()
Return(nil, store.ErrResourceNotFound).Once()

moduleService := &mocks.ModuleService{}

server := NewApiServer(resourceService, moduleService)
providerService := &mocks.ProviderService{}
server := NewApiServer(resourceService, moduleService, providerService)
got, err := server.DeleteResource(ctx, request)
if errors.Is(err, nil) {
t.Errorf("DeleteResource() got nil error")
Expand Down Expand Up @@ -751,7 +761,7 @@ func TestAPIServer_ApplyAction(t *testing.T) {
resourceService := &mocks.ResourceService{}
resourceService.EXPECT().
GetResource(mock.Anything, "p-testdata-gl-testname-log").
Return(nil, store.ResourceNotFoundError).Once()
Return(nil, store.ErrResourceNotFound).Once()

moduleService := &mocks.ModuleService{}

Expand Down
Loading