Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement GetProject endpoint in FlyteAdmin #4825

Merged
merged 17 commits into from
Mar 20, 2024
Merged
10 changes: 10 additions & 0 deletions flyteadmin/pkg/manager/impl/project_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,16 @@ func (m *ProjectManager) UpdateProject(ctx context.Context, projectUpdate admin.
return &response, nil
}

func (m *ProjectManager) GetProject(ctx context.Context, request admin.Project) (*admin.Project, error) {
projectModel, err := m.db.ProjectRepo().Get(ctx, request.Id)
RRap0so marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
return nil, err
}
projectResponse := transformers.FromProjectModel(projectModel, m.getDomains())

return &projectResponse, nil
}

func NewProjectManager(db repoInterfaces.Repository, config runtimeInterfaces.Configuration) interfaces.ProjectInterface {
return &ProjectManager{
db: db,
Expand Down
43 changes: 43 additions & 0 deletions flyteadmin/pkg/manager/impl/project_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,3 +278,46 @@ func TestProjectManager_UpdateProject_ErrorDueToInvalidProjectName(t *testing.T)
})
assert.EqualError(t, err, "project_name cannot exceed 64 characters")
}

func TestProjectManager_TestGetProject(t *testing.T) {
mockRepository := repositoryMocks.NewMockRepository()
mockedProject := &admin.Project{Id: project}
activeState := int32(admin.Project_ACTIVE)
mockRepository.ProjectRepo().(*repositoryMocks.MockProjectRepo).GetFunction = func(ctx context.Context, projectID string) (models.Project, error) {

return models.Project{
BaseModel: models.BaseModel{},
Identifier: projectID,
Name: "a-mocked-project",
Description: "A mocked project",
State: &activeState,
}, nil
}

projectManager := NewProjectManager(mockRepository, runtimeMocks.NewMockConfigurationProvider(
getMockApplicationConfigForProjectManagerTest(), nil, nil, nil, nil, nil))

resp, _ := projectManager.GetProject(context.Background(),
*mockedProject)

assert.Equal(t, mockedProject.Id, resp.Id)
assert.Equal(t, "a-mocked-project", resp.Name)
assert.Equal(t, "A mocked project", resp.Description)
assert.Equal(t, admin.Project_ProjectState(0), resp.State)
}

func TestProjectManager_TestGetProject_ErrorDueToProjectNotFound(t *testing.T) {
mockRepository := repositoryMocks.NewMockRepository()
mockedProject := &admin.Project{Id: project}
mockRepository.ProjectRepo().(*repositoryMocks.MockProjectRepo).GetFunction = func(ctx context.Context, projectID string) (models.Project, error) {
return models.Project{}, errors.New("project " + projectID + " not found")
}

projectManager := NewProjectManager(mockRepository, runtimeMocks.NewMockConfigurationProvider(
getMockApplicationConfigForProjectManagerTest(), nil, nil, nil, nil, nil))

_, err := projectManager.GetProject(context.Background(),
*mockedProject)

assert.Equal(t, errors.New("project "+project+" not found"), err)
}
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ func TestValidateSchedule_ArgNotFixed(t *testing.T) {
})
t.Run("with rate", func(t *testing.T) {
request := testutils.GetLaunchPlanRequestWithFixedRateSchedule(2, admin.FixedRateUnit_HOUR)

err := validateSchedule(request, inputMap)
assert.NotNil(t, err)
})
Expand Down
1 change: 1 addition & 0 deletions flyteadmin/pkg/manager/interfaces/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ type ProjectInterface interface {
CreateProject(ctx context.Context, request admin.ProjectRegisterRequest) (*admin.ProjectRegisterResponse, error)
ListProjects(ctx context.Context, request admin.ProjectListRequest) (*admin.Projects, error)
UpdateProject(ctx context.Context, request admin.Project) (*admin.ProjectUpdateResponse, error)
GetProject(ctx context.Context, request admin.Project) (*admin.Project, error)
}
13 changes: 13 additions & 0 deletions flyteadmin/pkg/manager/mocks/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import (
type CreateProjectFunc func(ctx context.Context, request admin.ProjectRegisterRequest) (*admin.ProjectRegisterResponse, error)
type ListProjectFunc func(ctx context.Context, request admin.ProjectListRequest) (*admin.Projects, error)
type UpdateProjectFunc func(ctx context.Context, request admin.Project) (*admin.ProjectUpdateResponse, error)
type GetProjectFunc func(ctx context.Context, request admin.Project) (*admin.Project, error)

type MockProjectManager struct {
listProjectFunc ListProjectFunc
createProjectFunc CreateProjectFunc
updateProjectFunc UpdateProjectFunc
getProjectFunc GetProjectFunc
}

func (m *MockProjectManager) SetCreateProject(createProjectFunc CreateProjectFunc) {
Expand Down Expand Up @@ -45,3 +47,14 @@ func (m *MockProjectManager) ListProjects(
}
return nil, nil
}

func (m *MockProjectManager) SetGetCallBack(getProjectFunc GetProjectFunc) {
m.getProjectFunc = getProjectFunc
}

func (m *MockProjectManager) GetProject(ctx context.Context, request admin.Project) (*admin.Project, error) {
if m.getProjectFunc != nil {
return m.getProjectFunc(ctx, request)
}
return nil, nil
}
2 changes: 2 additions & 0 deletions flyteadmin/pkg/rpc/adminservice/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ type projectEndpointMetrics struct {
register util.RequestMetrics
list util.RequestMetrics
update util.RequestMetrics
get util.RequestMetrics
}

type attributeEndpointMetrics struct {
Expand Down Expand Up @@ -176,6 +177,7 @@ func InitMetrics(adminScope promutils.Scope) AdminMetrics {
register: util.NewRequestMetrics(adminScope, "register_project"),
list: util.NewRequestMetrics(adminScope, "list_projects"),
update: util.NewRequestMetrics(adminScope, "update_project"),
get: util.NewRequestMetrics(adminScope, "get_project"),
},
projectAttributesEndpointMetrics: attributeEndpointMetrics{
scope: adminScope,
Expand Down
18 changes: 18 additions & 0 deletions flyteadmin/pkg/rpc/adminservice/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,21 @@

return response, nil
}

func (m *AdminService) GetProject(ctx context.Context, request *admin.Project) (*admin.Project, error) {
defer m.interceptPanic(ctx, request)
if request == nil {
return nil, status.Errorf(codes.InvalidArgument, "Incorrect request, nil requests not allowed")
}
var response *admin.Project
var err error
m.Metrics.projectEndpointMetrics.get.Time(func() {
response, err = m.ProjectManager.GetProject(ctx, *request)
})
if err != nil {
return nil, util.TransformAndRecordError(err, &m.Metrics.projectEndpointMetrics.list)
RRap0so marked this conversation as resolved.
Show resolved Hide resolved
}

Check warning on line 79 in flyteadmin/pkg/rpc/adminservice/project.go

View check run for this annotation

Codecov / codecov/patch

flyteadmin/pkg/rpc/adminservice/project.go#L67-L79

Added lines #L67 - L79 were not covered by tests

m.Metrics.projectEndpointMetrics.list.Success()
RRap0so marked this conversation as resolved.
Show resolved Hide resolved
return response, nil

Check warning on line 82 in flyteadmin/pkg/rpc/adminservice/project.go

View check run for this annotation

Codecov / codecov/patch

flyteadmin/pkg/rpc/adminservice/project.go#L81-L82

Added lines #L81 - L82 were not covered by tests
}
12 changes: 12 additions & 0 deletions flyteadmin/pkg/rpc/adminservice/tests/project_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,15 @@ func TestListProjects(t *testing.T) {
assert.Nil(t, err)
assert.True(t, proto.Equal(projects, resp))
}

func TestGetProject(t *testing.T) {
mockProjectManager := mocks.MockProjectManager{}
project := &admin.Project{Id: "project id", Name: "project"}
mockProjectManager.SetGetCallBack(func(ctx context.Context, request admin.Project) (*admin.Project, error) {
assert.NotNil(t, request)
return project, nil
})
resp, err := mockProjectManager.GetProject(context.Background(), admin.Project{})
assert.Nil(t, err)
assert.True(t, proto.Equal(project, resp))
}
48 changes: 48 additions & 0 deletions flyteidl/clients/go/admin/mocks/AdminServiceClient.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 41 additions & 0 deletions flyteidl/clients/go/admin/mocks/AdminServiceServer.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading