From 260be59a550c865ce5be6b127e198c40fb45714d Mon Sep 17 00:00:00 2001 From: Rajamohan Raj Date: Wed, 19 Feb 2020 19:35:38 +0000 Subject: Made changes to the Project API. Issue-ID: MULTICLOUD-875 Signed-off-by: Rajamohan Raj Change-Id: Ie1e9404069dae883ece8c6b1ca5eb07d284f96c0 --- src/orchestrator/api/projecthandler.go | 4 +-- src/orchestrator/api/projecthandler_test.go | 52 ++++++++++++++++++++--------- src/orchestrator/examples/example_module.go | 2 +- src/orchestrator/pkg/module/project.go | 45 ++++++++++++++++--------- src/orchestrator/pkg/module/project_test.go | 36 +++++++++++++++----- 5 files changed, 96 insertions(+), 43 deletions(-) (limited to 'src/orchestrator') diff --git a/src/orchestrator/api/projecthandler.go b/src/orchestrator/api/projecthandler.go index 1830b91d..1e78c676 100644 --- a/src/orchestrator/api/projecthandler.go +++ b/src/orchestrator/api/projecthandler.go @@ -49,7 +49,7 @@ func (h projectHandler) createHandler(w http.ResponseWriter, r *http.Request) { } // Name is required. - if p.ProjectName == "" { + if p.MetaData.Name == "" { http.Error(w, "Missing name in POST request", http.StatusBadRequest) return } @@ -70,7 +70,7 @@ func (h projectHandler) createHandler(w http.ResponseWriter, r *http.Request) { } // Get handles GET operations on a particular Project Name -// Returns a rb.Project +// Returns a Project func (h projectHandler) getHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["project-name"] diff --git a/src/orchestrator/api/projecthandler_test.go b/src/orchestrator/api/projecthandler_test.go index 41f515d0..ee6ed358 100644 --- a/src/orchestrator/api/projecthandler_test.go +++ b/src/orchestrator/api/projecthandler_test.go @@ -1,5 +1,5 @@ /* - * Copyright 2018 Intel Corporation, Inc + * Copyright 2020 Intel Corporation, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -77,20 +77,32 @@ func TestProjectCreateHandler(t *testing.T) { label: "Create Project", expectedCode: http.StatusCreated, reader: bytes.NewBuffer([]byte(`{ - "project-name":"testProject", - "description":"Test Project used for unit testing" - }`)), + "metadata" : { + "name": "testProject", + "description": "Test Project used for unit testing", + "userData1": "data1", + "userData2": "data2" + } + }`)), expected: moduleLib.Project{ - ProjectName: "testProject", - Description: "Test Project used for unit testing", + MetaData: moduleLib.ProjectMetaData{ + Name: "testProject", + Description: "Test Project used for unit testing", + UserData1: "data1", + UserData2: "data2", + }, }, projectClient: &mockProjectManager{ //Items that will be returned by the mocked Client Items: []moduleLib.Project{ - { - ProjectName: "testProject", - Description: "Test Project used for unit testing", - }, + moduleLib.Project{ + MetaData: moduleLib.ProjectMetaData{ + Name: "testProject", + Description: "Test Project used for unit testing", + UserData1: "data1", + UserData2: "data2", + }, + }, }, }, }, @@ -141,16 +153,24 @@ func TestProjectGetHandler(t *testing.T) { label: "Get Project", expectedCode: http.StatusOK, expected: moduleLib.Project{ - ProjectName: "testProject", - Description: "A Test project for unit testing", + MetaData: moduleLib.ProjectMetaData{ + Name: "testProject", + Description: "Test Project used for unit testing", + UserData1: "data1", + UserData2: "data2", + }, }, name: "testProject", projectClient: &mockProjectManager{ Items: []moduleLib.Project{ - { - ProjectName: "testProject", - Description: "A Test project for unit testing", - }, + moduleLib.Project{ + MetaData: moduleLib.ProjectMetaData{ + Name: "testProject", + Description: "Test Project used for unit testing", + UserData1: "data1", + UserData2: "data2", + }, + }, }, }, }, diff --git a/src/orchestrator/examples/example_module.go b/src/orchestrator/examples/example_module.go index 29ecdc23..9138b085 100644 --- a/src/orchestrator/examples/example_module.go +++ b/src/orchestrator/examples/example_module.go @@ -31,7 +31,7 @@ func ExampleClient_Project() { return } // Perform operations on Project Module - _, err := c.Project.CreateProject(moduleLib.Project{ProjectName: "test"}) + _, err := c.Project.CreateProject(moduleLib.Project{MetaData: moduleLib.ProjectMetaData{Name: "test", Description: "test", UserData1: "userData1", UserData2: "userData2"}}) if err != nil { log.Println(err) return diff --git a/src/orchestrator/pkg/module/project.go b/src/orchestrator/pkg/module/project.go index e44164f9..796e9e99 100644 --- a/src/orchestrator/pkg/module/project.go +++ b/src/orchestrator/pkg/module/project.go @@ -1,5 +1,5 @@ /* - * Copyright 2019 Intel Corporation, Inc + * Copyright 2020 Intel Corporation, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,22 +18,30 @@ package module import ( "encoding/json" - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db" pkgerrors "github.com/pkg/errors" ) -// Project contains the parameters needed for Projects -// It implements the interface for managing the Projects + +// Project contains the metaData for Projects type Project struct { - ProjectName string `json:"project-name"` + MetaData ProjectMetaData`json:"metadata"` +} + + +// ProjectMetaData contains the parameters for creating a project +type ProjectMetaData struct { + Name string `json:"name"` Description string `json:"description"` + UserData1 string `userData1:"userData1"` + UserData2 string `userData2:"userData2"` } + // ProjectKey is the key structure that is used in the database type ProjectKey struct { - ProjectName string `json:"rb-name"` + ProjectName string `json:"project"` } // We will use json marshalling to convert to string to @@ -47,43 +55,48 @@ func (pk ProjectKey) String() string { return string(out) } -// Manager is an interface exposes the Project functionality + +// ProjectManager is an interface exposes the Project functionality type ProjectManager interface { CreateProject(pr Project) (Project, error) GetProject(name string) (Project, error) DeleteProject(name string) error } -// ProjectClient implements the Manager + +// ProjectClient implements the ProjectManager // It will also be used to maintain some localized state type ProjectClient struct { storeName string tagMeta, tagContent string } + // NewProjectClient returns an instance of the ProjectClient -// which implements the Manager +// which implements the ProjectManager func NewProjectClient() *ProjectClient { return &ProjectClient{ + storeName: "orchestrator", tagMeta: "projectmetadata", } } + // CreateProject a new collection based on the project func (v *ProjectClient) CreateProject(p Project) (Project, error) { //Construct the composite key to select the entry key := ProjectKey{ - ProjectName: p.ProjectName, + ProjectName: p.MetaData.Name, } //Check if this Project already exists - _, err := v.GetProject(p.ProjectName) + _, err := v.GetProject(p.MetaData.Name) if err == nil { return Project{}, pkgerrors.New("Project already exists") } - err = db.DBconn.Create(p.ProjectName, key, v.tagMeta, p) + err = db.DBconn.Create(v.storeName, key, v.tagMeta, p) if err != nil { return Project{}, pkgerrors.Wrap(err, "Creating DB Entry") } @@ -91,6 +104,7 @@ func (v *ProjectClient) CreateProject(p Project) (Project, error) { return p, nil } + // GetProject returns the Project for corresponding name func (v *ProjectClient) GetProject(name string) (Project, error) { @@ -98,7 +112,7 @@ func (v *ProjectClient) GetProject(name string) (Project, error) { key := ProjectKey{ ProjectName: name, } - value, err := db.DBconn.Read(name, key, v.tagMeta) + value, err := db.DBconn.Read(v.storeName, key, v.tagMeta) if err != nil { return Project{}, pkgerrors.Wrap(err, "Get Project") } @@ -116,6 +130,7 @@ func (v *ProjectClient) GetProject(name string) (Project, error) { return Project{}, pkgerrors.New("Error getting Project") } + // DeleteProject the Project from database func (v *ProjectClient) DeleteProject(name string) error { @@ -123,11 +138,11 @@ func (v *ProjectClient) DeleteProject(name string) error { key := ProjectKey{ ProjectName: name, } - err := db.DBconn.Delete(name, key, v.tagMeta) + err := db.DBconn.Delete(v.storeName, key, v.tagMeta) if err != nil { return pkgerrors.Wrap(err, "Delete Project Entry;") } //TODO: Delete the collection when the project is deleted return nil -} +} \ No newline at end of file diff --git a/src/orchestrator/pkg/module/project_test.go b/src/orchestrator/pkg/module/project_test.go index 7f4d9b3e..90fe30bc 100644 --- a/src/orchestrator/pkg/module/project_test.go +++ b/src/orchestrator/pkg/module/project_test.go @@ -1,5 +1,5 @@ /* - * Copyright 2018 Intel Corporation, Inc + * Copyright 2020 Intel Corporation, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import ( "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db" + pkgerrors "github.com/pkg/errors" ) @@ -37,12 +38,20 @@ func TestCreateProject(t *testing.T) { { label: "Create Project", inp: Project{ - ProjectName: "testProject", - Description: "A sample Project used for unit testing", + MetaData: ProjectMetaData{ + Name: "testProject", + Description: "A sample Project used for unit testing", + UserData1: "data1", + UserData2: "data2", + }, }, expected: Project{ - ProjectName: "testProject", - Description: "A sample Project used for unit testing", + MetaData: ProjectMetaData{ + Name:"testProject", + Description: "A sample Project used for unit testing", + UserData1: "data1", + UserData2: "data2", + }, }, expectedError: "", mockdb: &db.MockDB{}, @@ -92,16 +101,25 @@ func TestGetProject(t *testing.T) { label: "Get Project", name: "testProject", expected: Project{ - ProjectName: "testProject", - Description: "Test project for unit testing", + MetaData: ProjectMetaData{ + Name: "testProject", + Description: "Test project for unit testing", + UserData1: "userData1", + UserData2: "userData2", + }, }, expectedError: "", mockdb: &db.MockDB{ Items: map[string]map[string][]byte{ ProjectKey{ProjectName: "testProject"}.String(): { "projectmetadata": []byte( - "{\"project-name\":\"testProject\"," + - "\"description\":\"Test project for unit testing\"}"), + "{" + + "\"metadata\" : {"+ + "\"Name\":\"testProject\"," + + "\"Description\":\"Test project for unit testing\"," + + "\"UserData1\": \"userData1\","+ + "\"UserData2\":\"userData2\"}"+ + "}"), }, }, }, -- cgit 1.2.3-korg