diff options
author | Victor Morales <victor.morales@intel.com> | 2019-01-24 17:46:43 -0800 |
---|---|---|
committer | Victor Morales <victor.morales@intel.com> | 2019-01-25 16:52:38 -0800 |
commit | 083465d10c8fdeaffa89aa7daa93def3eca77df1 (patch) | |
tree | 23135a724a1628e986f9c6748b82f275763cdf10 /src/k8splugin/rb | |
parent | 5c4e91705457dc4bdb5526e6f5210fa879ab659d (diff) |
Use a standard Go project layout
This project wasn't following some Standard Go Project Layout
guidelines(https://github.com/golang-standards/project-layout). This
change pretends to organize the source code and following those
guidelines.
Change-Id: I61085ac20f28069cede013f83034bed06892d87c
Signed-off-by: Victor Morales <victor.morales@intel.com>
Issue-ID: MULTICLOUD-301
Diffstat (limited to 'src/k8splugin/rb')
-rw-r--r-- | src/k8splugin/rb/archive.go | 65 | ||||
-rw-r--r-- | src/k8splugin/rb/archive_test.go | 66 | ||||
-rw-r--r-- | src/k8splugin/rb/definition.go | 164 | ||||
-rw-r--r-- | src/k8splugin/rb/definition_test.go | 420 | ||||
-rw-r--r-- | src/k8splugin/rb/profile.go | 185 | ||||
-rw-r--r-- | src/k8splugin/rb/profile_test.go | 426 |
6 files changed, 0 insertions, 1326 deletions
diff --git a/src/k8splugin/rb/archive.go b/src/k8splugin/rb/archive.go deleted file mode 100644 index 8eb0fbed..00000000 --- a/src/k8splugin/rb/archive.go +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2018 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rb - -import ( - "archive/tar" - "compress/gzip" - pkgerrors "github.com/pkg/errors" - "io" -) - -func isTarGz(r io.Reader) error { - //Check if it is a valid gz - gzf, err := gzip.NewReader(r) - if err != nil { - return pkgerrors.Errorf("Invalid gz format %s", err.Error()) - } - - //Check if it is a valid tar file - //Unfortunately this can only be done by inspecting all the tar contents - tarR := tar.NewReader(gzf) - first := true - - for true { - header, err := tarR.Next() - - if err == io.EOF { - //Check if we have just a gzip file without a tar archive inside - if first { - return pkgerrors.New("Empty or non-existant Tar file found") - } - //End of archive - break - } - - if err != nil { - return pkgerrors.Errorf("Error reading tar file %s", err.Error()) - } - - //Check if files are of type directory and regular file - if header.Typeflag != tar.TypeDir && - header.Typeflag != tar.TypeReg { - return pkgerrors.Errorf("Unknown header in tar %s, %s", - header.Name, string(header.Typeflag)) - } - - first = false - } - - return nil -} diff --git a/src/k8splugin/rb/archive_test.go b/src/k8splugin/rb/archive_test.go deleted file mode 100644 index a327dfd4..00000000 --- a/src/k8splugin/rb/archive_test.go +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2018 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rb - -import ( - "bytes" - "testing" -) - -func TestIsTarGz(t *testing.T) { - - t.Run("Valid tar.gz", func(t *testing.T) { - content := []byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xb0, 0x6b, 0xf4, 0x5b, - 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, - 0x61, 0x72, 0x00, 0xed, 0xce, 0x41, 0x0a, 0xc2, - 0x30, 0x10, 0x85, 0xe1, 0xac, 0x3d, 0x45, 0x4e, - 0x50, 0x12, 0xd2, 0xc4, 0xe3, 0x48, 0xa0, 0x01, - 0x4b, 0x52, 0x0b, 0xed, 0x88, 0x1e, 0xdf, 0x48, - 0x11, 0x5c, 0x08, 0xa5, 0x8b, 0x52, 0x84, 0xff, - 0xdb, 0xbc, 0x61, 0x66, 0x16, 0x4f, 0xd2, 0x2c, - 0x8d, 0x3c, 0x45, 0xed, 0xc8, 0x54, 0x21, 0xb4, - 0xef, 0xb4, 0x67, 0x6f, 0xbe, 0x73, 0x61, 0x9d, - 0xb2, 0xce, 0xd5, 0x55, 0xf0, 0xde, 0xd7, 0x3f, - 0xdb, 0xd6, 0x49, 0x69, 0xb3, 0x67, 0xa9, 0x8f, - 0xfb, 0x2c, 0x71, 0xd2, 0x5a, 0xc5, 0xee, 0x92, - 0x73, 0x8e, 0x43, 0x7f, 0x4b, 0x3f, 0xff, 0xd6, - 0xee, 0x7f, 0xea, 0x9a, 0x4a, 0x19, 0x1f, 0xe3, - 0x54, 0xba, 0xd3, 0xd1, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1b, 0xbc, 0x00, 0xb5, 0xe8, - 0x4a, 0xf9, 0x00, 0x28, 0x00, 0x00, - } - - err := isTarGz(bytes.NewBuffer(content)) - if err != nil { - t.Errorf("Error reading valid Zip file %s", err.Error()) - } - }) - - t.Run("Invalid tar.gz", func(t *testing.T) { - content := []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xf2, 0x48, 0xcd, - } - - err := isTarGz(bytes.NewBuffer(content)) - if err == nil { - t.Errorf("Error should NOT be nil") - } - }) -} diff --git a/src/k8splugin/rb/definition.go b/src/k8splugin/rb/definition.go deleted file mode 100644 index 084abe7b..00000000 --- a/src/k8splugin/rb/definition.go +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2018 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rb - -import ( - "bytes" - "encoding/base64" - "k8splugin/db" - "log" - - uuid "github.com/hashicorp/go-uuid" - pkgerrors "github.com/pkg/errors" -) - -// Definition contains the parameters needed for resource bundle (rb) definitions -// It implements the interface for managing the definitions -type Definition struct { - UUID string `json:"uuid,omitempty"` - Name string `json:"name"` - ChartName string `json:"chart-name"` - Description string `json:"description"` - ServiceType string `json:"service-type"` -} - -// DefinitionManager is an interface exposes the resource bundle definition functionality -type DefinitionManager interface { - Create(def Definition) (Definition, error) - List() ([]Definition, error) - Get(resID string) (Definition, error) - Delete(resID string) error - Upload(resID string, inp []byte) error -} - -// DefinitionClient implements the DefinitionManager -// It will also be used to maintain some localized state -type DefinitionClient struct { - storeName string - tagMeta, tagContent string -} - -// NewDefinitionClient returns an instance of the DefinitionClient -// which implements the DefinitionManager -// Uses rbdef collection in underlying db -func NewDefinitionClient() *DefinitionClient { - return &DefinitionClient{ - storeName: "rbdef", - tagMeta: "metadata", - tagContent: "content", - } -} - -// Create an entry for the resource in the database -func (v *DefinitionClient) Create(def Definition) (Definition, error) { - // If UUID is empty, we will generate one - if def.UUID == "" { - def.UUID, _ = uuid.GenerateUUID() - } - key := def.UUID - - err := db.DBconn.Create(v.storeName, key, v.tagMeta, def) - if err != nil { - return Definition{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return def, nil -} - -// List all resource entries in the database -func (v *DefinitionClient) List() ([]Definition, error) { - res, err := db.DBconn.ReadAll(v.storeName, v.tagMeta) - if err != nil || len(res) == 0 { - return []Definition{}, pkgerrors.Wrap(err, "Listing Resource Bundle Definitions") - } - - var results []Definition - for key, value := range res { - //value is a byte array - if len(value) > 0 { - def := Definition{} - err = db.DBconn.Unmarshal(value, &def) - if err != nil { - log.Printf("[Definition] Error Unmarshaling value for: %s", key) - continue - } - results = append(results, def) - } - } - - return results, nil -} - -// Get returns the Resource Bundle Definition for corresponding ID -func (v *DefinitionClient) Get(id string) (Definition, error) { - value, err := db.DBconn.Read(v.storeName, id, v.tagMeta) - if err != nil { - return Definition{}, pkgerrors.Wrap(err, "Get Resource Bundle definition") - } - - //value is a byte array - if value != nil { - def := Definition{} - err = db.DBconn.Unmarshal(value, &def) - if err != nil { - return Definition{}, pkgerrors.Wrap(err, "Unmarshaling Value") - } - return def, nil - } - - return Definition{}, pkgerrors.New("Error getting Resource Bundle Definition") -} - -// Delete the Resource Bundle definition from database -func (v *DefinitionClient) Delete(id string) error { - err := db.DBconn.Delete(v.storeName, id, v.tagMeta) - if err != nil { - return pkgerrors.Wrap(err, "Delete Resource Bundle Definition") - } - - //Delete the content when the delete operation happens - err = db.DBconn.Delete(v.storeName, id, v.tagContent) - if err != nil { - return pkgerrors.Wrap(err, "Delete Resource Bundle Definition Content") - } - - return nil -} - -// Upload the contents of resource bundle into database -func (v *DefinitionClient) Upload(id string, inp []byte) error { - - //ignore the returned data here - _, err := v.Get(id) - if err != nil { - return pkgerrors.Errorf("Invalid Definition ID provided: %s", err.Error()) - } - - err = isTarGz(bytes.NewBuffer(inp)) - if err != nil { - return pkgerrors.Errorf("Error in file format: %s", err.Error()) - } - - //Encode given byte stream to text for storage - encodedStr := base64.StdEncoding.EncodeToString(inp) - err = db.DBconn.Create(v.storeName, id, v.tagContent, encodedStr) - if err != nil { - return pkgerrors.Errorf("Error uploading data to db: %s", err.Error()) - } - - return nil -} diff --git a/src/k8splugin/rb/definition_test.go b/src/k8splugin/rb/definition_test.go deleted file mode 100644 index f1ec18ee..00000000 --- a/src/k8splugin/rb/definition_test.go +++ /dev/null @@ -1,420 +0,0 @@ -// +build unit - -/* - * Copyright 2018 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rb - -import ( - "k8splugin/db" - "reflect" - "sort" - "strings" - "testing" - - pkgerrors "github.com/pkg/errors" -) - -func TestCreateDefinition(t *testing.T) { - testCases := []struct { - label string - inp Definition - expectedError string - mockdb *db.MockDB - expected Definition - }{ - { - label: "Create Resource Bundle Definition", - inp: Definition{ - UUID: "123e4567-e89b-12d3-a456-426655440000", - Name: "testresourcebundle", - Description: "testresourcebundle", - ServiceType: "firewall", - }, - expected: Definition{ - UUID: "123e4567-e89b-12d3-a456-426655440000", - Name: "testresourcebundle", - Description: "testresourcebundle", - ServiceType: "firewall", - }, - expectedError: "", - mockdb: &db.MockDB{}, - }, - { - label: "Failed Create Resource Bundle Definition", - expectedError: "Error Creating Definition", - mockdb: &db.MockDB{ - Err: pkgerrors.New("Error Creating Definition"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewDefinitionClient() - got, err := impl.Create(testCase.inp) - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("Create returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("Create returned an unexpected error %s", err) - } - } else { - if reflect.DeepEqual(testCase.expected, got) == false { - t.Errorf("Create Resource Bundle returned unexpected body: got %v;"+ - " expected %v", got, testCase.expected) - } - } - }) - } -} - -func TestListDefinition(t *testing.T) { - - testCases := []struct { - label string - expectedError string - mockdb *db.MockDB - expected []Definition - }{ - { - label: "List Resource Bundle Definition", - expected: []Definition{ - { - UUID: "123e4567-e89b-12d3-a456-426655440000", - Name: "testresourcebundle", - Description: "testresourcebundle", - ServiceType: "firewall", - }, - { - UUID: "123e4567-e89b-12d3-a456-426655441111", - Name: "testresourcebundle2", - Description: "testresourcebundle2", - ServiceType: "dns", - }, - }, - expectedError: "", - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"description\":\"testresourcebundle\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"service-type\":\"firewall\"}"), - }, - "123e4567-e89b-12d3-a456-426655441111": { - "metadata": []byte( - "{\"name\":\"testresourcebundle2\"," + - "\"description\":\"testresourcebundle2\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655441111\"," + - "\"service-type\":\"dns\"}"), - }, - }, - }, - }, - { - label: "List Error", - expectedError: "DB Error", - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewDefinitionClient() - got, err := impl.List() - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("List returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("List returned an unexpected error %s", err) - } - } else { - // Since the order of returned slice is not guaranteed - // Check both and return error if both don't match - sort.Slice(got, func(i, j int) bool { - return got[i].UUID < got[j].UUID - }) - // Sort both as it is not expected that testCase.expected - // is sorted - sort.Slice(testCase.expected, func(i, j int) bool { - return testCase.expected[i].UUID < testCase.expected[j].UUID - }) - - if reflect.DeepEqual(testCase.expected, got) == false { - t.Errorf("List Resource Bundle returned unexpected body: got %v;"+ - " expected %v", got, testCase.expected) - } - } - }) - } -} - -func TestGetDefinition(t *testing.T) { - - testCases := []struct { - label string - expectedError string - mockdb *db.MockDB - inp string - expected Definition - }{ - { - label: "Get Resource Bundle Definition", - inp: "123e4567-e89b-12d3-a456-426655440000", - expected: Definition{ - UUID: "123e4567-e89b-12d3-a456-426655440000", - Name: "testresourcebundle", - Description: "testresourcebundle", - ServiceType: "firewall", - }, - expectedError: "", - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"description\":\"testresourcebundle\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"service-type\":\"firewall\"}"), - }, - }, - }, - }, - { - label: "Get Error", - expectedError: "DB Error", - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewDefinitionClient() - got, err := impl.Get(testCase.inp) - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("Get returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("Get returned an unexpected error %s", err) - } - } else { - if reflect.DeepEqual(testCase.expected, got) == false { - t.Errorf("Get Resource Bundle returned unexpected body: got %v;"+ - " expected %v", got, testCase.expected) - } - } - }) - } -} - -func TestDeleteDefinition(t *testing.T) { - - testCases := []struct { - label string - inp string - expectedError string - mockdb *db.MockDB - }{ - { - label: "Delete Resource Bundle Definition", - inp: "123e4567-e89b-12d3-a456-426655440000", - mockdb: &db.MockDB{}, - }, - { - label: "Delete Error", - expectedError: "DB Error", - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewDefinitionClient() - err := impl.Delete(testCase.inp) - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("Delete returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("Delete returned an unexpected error %s", err) - } - } - }) - } -} - -func TestUploadDefinition(t *testing.T) { - testCases := []struct { - label string - inp string - content []byte - expectedError string - mockdb *db.MockDB - }{ - { - label: "Upload Resource Bundle Definition", - inp: "123e4567-e89b-12d3-a456-426655440000", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xb0, 0x6b, 0xf4, 0x5b, - 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, - 0x61, 0x72, 0x00, 0xed, 0xce, 0x41, 0x0a, 0xc2, - 0x30, 0x10, 0x85, 0xe1, 0xac, 0x3d, 0x45, 0x4e, - 0x50, 0x12, 0xd2, 0xc4, 0xe3, 0x48, 0xa0, 0x01, - 0x4b, 0x52, 0x0b, 0xed, 0x88, 0x1e, 0xdf, 0x48, - 0x11, 0x5c, 0x08, 0xa5, 0x8b, 0x52, 0x84, 0xff, - 0xdb, 0xbc, 0x61, 0x66, 0x16, 0x4f, 0xd2, 0x2c, - 0x8d, 0x3c, 0x45, 0xed, 0xc8, 0x54, 0x21, 0xb4, - 0xef, 0xb4, 0x67, 0x6f, 0xbe, 0x73, 0x61, 0x9d, - 0xb2, 0xce, 0xd5, 0x55, 0xf0, 0xde, 0xd7, 0x3f, - 0xdb, 0xd6, 0x49, 0x69, 0xb3, 0x67, 0xa9, 0x8f, - 0xfb, 0x2c, 0x71, 0xd2, 0x5a, 0xc5, 0xee, 0x92, - 0x73, 0x8e, 0x43, 0x7f, 0x4b, 0x3f, 0xff, 0xd6, - 0xee, 0x7f, 0xea, 0x9a, 0x4a, 0x19, 0x1f, 0xe3, - 0x54, 0xba, 0xd3, 0xd1, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1b, 0xbc, 0x00, 0xb5, 0xe8, - 0x4a, 0xf9, 0x00, 0x28, 0x00, 0x00, - }, - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"description\":\"testresourcebundle\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"service-type\":\"firewall\"}"), - }, - }, - }, - }, - { - label: "Upload with an Invalid Resource Bundle Definition", - inp: "123e4567-e89b-12d3-a456-426655440000", - expectedError: "Invalid Definition ID provided", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xb0, 0x6b, 0xf4, 0x5b, - 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, - 0x61, 0x72, 0x00, 0xed, 0xce, 0x41, 0x0a, 0xc2, - 0x30, 0x10, 0x85, 0xe1, 0xac, 0x3d, 0x45, 0x4e, - 0x50, 0x12, 0xd2, 0xc4, 0xe3, 0x48, 0xa0, 0x01, - 0x4b, 0x52, 0x0b, 0xed, 0x88, 0x1e, 0xdf, 0x48, - 0x11, 0x5c, 0x08, 0xa5, 0x8b, 0x52, 0x84, 0xff, - 0xdb, 0xbc, 0x61, 0x66, 0x16, 0x4f, 0xd2, 0x2c, - 0x8d, 0x3c, 0x45, 0xed, 0xc8, 0x54, 0x21, 0xb4, - 0xef, 0xb4, 0x67, 0x6f, 0xbe, 0x73, 0x61, 0x9d, - 0xb2, 0xce, 0xd5, 0x55, 0xf0, 0xde, 0xd7, 0x3f, - 0xdb, 0xd6, 0x49, 0x69, 0xb3, 0x67, 0xa9, 0x8f, - 0xfb, 0x2c, 0x71, 0xd2, 0x5a, 0xc5, 0xee, 0x92, - 0x73, 0x8e, 0x43, 0x7f, 0x4b, 0x3f, 0xff, 0xd6, - 0xee, 0x7f, 0xea, 0x9a, 0x4a, 0x19, 0x1f, 0xe3, - 0x54, 0xba, 0xd3, 0xd1, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1b, 0xbc, 0x00, 0xb5, 0xe8, - 0x4a, 0xf9, 0x00, 0x28, 0x00, 0x00, - }, - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655441111": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"description\":\"testresourcebundle\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655441111\"," + - "\"service-type\":\"firewall\"}"), - }, - }, - }, - }, - { - label: "Invalid File Format Error", - inp: "123e4567-e89b-12d3-a456-426655440000", - expectedError: "Error in file format", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xf2, 0x48, 0xcd, - }, - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"description\":\"testresourcebundle\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"service-type\":\"firewall\"}"), - }, - }, - }, - }, - { - label: "Upload Error", - expectedError: "DB Error", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xb0, 0x6b, 0xf4, 0x5b, - 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, - 0x61, 0x72, 0x00, 0xed, 0xce, 0x41, 0x0a, 0xc2, - 0x30, 0x10, 0x85, 0xe1, 0xac, 0x3d, 0x45, 0x4e, - 0x50, 0x12, 0xd2, 0xc4, 0xe3, 0x48, 0xa0, 0x01, - 0x4b, 0x52, 0x0b, 0xed, 0x88, 0x1e, 0xdf, 0x48, - 0x11, 0x5c, 0x08, 0xa5, 0x8b, 0x52, 0x84, 0xff, - 0xdb, 0xbc, 0x61, 0x66, 0x16, 0x4f, 0xd2, 0x2c, - 0x8d, 0x3c, 0x45, 0xed, 0xc8, 0x54, 0x21, 0xb4, - 0xef, 0xb4, 0x67, 0x6f, 0xbe, 0x73, 0x61, 0x9d, - 0xb2, 0xce, 0xd5, 0x55, 0xf0, 0xde, 0xd7, 0x3f, - 0xdb, 0xd6, 0x49, 0x69, 0xb3, 0x67, 0xa9, 0x8f, - 0xfb, 0x2c, 0x71, 0xd2, 0x5a, 0xc5, 0xee, 0x92, - 0x73, 0x8e, 0x43, 0x7f, 0x4b, 0x3f, 0xff, 0xd6, - 0xee, 0x7f, 0xea, 0x9a, 0x4a, 0x19, 0x1f, 0xe3, - 0x54, 0xba, 0xd3, 0xd1, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1b, 0xbc, 0x00, 0xb5, 0xe8, - 0x4a, 0xf9, 0x00, 0x28, 0x00, 0x00, - }, - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewDefinitionClient() - err := impl.Upload(testCase.inp, testCase.content) - if err != nil { - if testCase.expectedError == "" { - t.Errorf("Upload returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Errorf("Upload returned an unexpected error %s", err) - } - } - }) - } -} diff --git a/src/k8splugin/rb/profile.go b/src/k8splugin/rb/profile.go deleted file mode 100644 index bbd43fea..00000000 --- a/src/k8splugin/rb/profile.go +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright 2018 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rb - -import ( - "bytes" - "encoding/base64" - "k8splugin/db" - "log" - - uuid "github.com/hashicorp/go-uuid" - pkgerrors "github.com/pkg/errors" -) - -// Profile contains the parameters needed for resource bundle (rb) profiles -// It implements the interface for managing the profiles -type Profile struct { - UUID string `json:"uuid,omitempty"` - RBDID string `json:"rbdid"` - Name string `json:"name"` - Namespace string `json:"namespace"` - KubernetesVersion string `json:"kubernetesversion"` -} - -// ProfileManager is an interface exposes the resource bundle profile functionality -type ProfileManager interface { - Create(def Profile) (Profile, error) - List() ([]Profile, error) - Get(resID string) (Profile, error) - Help() map[string]string - Delete(resID string) error - Upload(resID string, inp []byte) error -} - -// ProfileClient implements the ProfileManager -// It will also be used to maintain some localized state -type ProfileClient struct { - storeName string - tagMeta, tagContent string -} - -// NewProfileClient returns an instance of the ProfileClient -// which implements the ProfileManager -// Uses rb/def prefix -func NewProfileClient() *ProfileClient { - return &ProfileClient{ - storeName: "rbprofile", - tagMeta: "metadata", - tagContent: "content", - } -} - -// Help returns some information on how to create the content -// for the profile in the form of html formatted page -func (v *ProfileClient) Help() map[string]string { - ret := make(map[string]string) - - return ret -} - -// Create an entry for the resource bundle profile in the database -func (v *ProfileClient) Create(p Profile) (Profile, error) { - - //Check if provided RBID is a valid resource bundle - _, err := NewDefinitionClient().Get(p.RBDID) - if err != nil { - return Profile{}, pkgerrors.Errorf("Invalid Resource Bundle ID provided: %s", err.Error()) - } - - // Name is required - if p.Name == "" { - return Profile{}, pkgerrors.New("Name is required for Resource Bundle Profile") - } - - // If UUID is empty, we will generate one - if p.UUID == "" { - p.UUID, _ = uuid.GenerateUUID() - } - key := p.UUID - - err = db.DBconn.Create(v.storeName, key, v.tagMeta, p) - if err != nil { - return Profile{}, pkgerrors.Wrap(err, "Creating Profile DB Entry") - } - - return p, nil -} - -// List all resource entries in the database -func (v *ProfileClient) List() ([]Profile, error) { - res, err := db.DBconn.ReadAll(v.storeName, v.tagMeta) - if err != nil || len(res) == 0 { - return []Profile{}, pkgerrors.Wrap(err, "Listing Resource Bundle Profiles") - } - - var retData []Profile - - for key, value := range res { - //value is a byte array - if len(value) > 0 { - pr := Profile{} - err = db.DBconn.Unmarshal(value, &pr) - if err != nil { - log.Printf("[Profile] Error Unmarshaling value for: %s", key) - continue - } - retData = append(retData, pr) - } - } - - return retData, nil -} - -// Get returns the Resource Bundle Profile for corresponding ID -func (v *ProfileClient) Get(id string) (Profile, error) { - value, err := db.DBconn.Read(v.storeName, id, v.tagMeta) - if err != nil { - return Profile{}, pkgerrors.Wrap(err, "Get Resource Bundle Profile") - } - - //value is a byte array - if value != nil { - pr := Profile{} - err = db.DBconn.Unmarshal(value, &pr) - if err != nil { - return Profile{}, pkgerrors.Wrap(err, "Unmarshaling Profile Value") - } - return pr, nil - } - - return Profile{}, pkgerrors.New("Error getting Resource Bundle Profile") -} - -// Delete the Resource Bundle Profile from database -func (v *ProfileClient) Delete(id string) error { - err := db.DBconn.Delete(v.storeName, id, v.tagMeta) - if err != nil { - return pkgerrors.Wrap(err, "Delete Resource Bundle Profile") - } - - err = db.DBconn.Delete(v.storeName, id, v.tagContent) - if err != nil { - return pkgerrors.Wrap(err, "Delete Resource Bundle Profile Content") - } - - return nil -} - -// Upload the contents of resource bundle into database -func (v *ProfileClient) Upload(id string, inp []byte) error { - - //ignore the returned data here. - _, err := v.Get(id) - if err != nil { - return pkgerrors.Errorf("Invalid Profile ID provided %s", err.Error()) - } - - err = isTarGz(bytes.NewBuffer(inp)) - if err != nil { - return pkgerrors.Errorf("Error in file format %s", err.Error()) - } - - //Encode given byte stream to text for storage - encodedStr := base64.StdEncoding.EncodeToString(inp) - err = db.DBconn.Create(v.storeName, id, v.tagContent, encodedStr) - if err != nil { - return pkgerrors.Errorf("Error uploading data to db %s", err.Error()) - } - - return nil -} diff --git a/src/k8splugin/rb/profile_test.go b/src/k8splugin/rb/profile_test.go deleted file mode 100644 index 2540d3ca..00000000 --- a/src/k8splugin/rb/profile_test.go +++ /dev/null @@ -1,426 +0,0 @@ -// +build unit - -/* - * Copyright 2018 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rb - -import ( - "k8splugin/db" - "reflect" - "sort" - "strings" - "testing" - - pkgerrors "github.com/pkg/errors" -) - -func TestCreateProfile(t *testing.T) { - testCases := []struct { - label string - inp Profile - expectedError string - mockdb *db.MockDB - expected Profile - }{ - { - label: "Create Resource Bundle Profile", - inp: Profile{ - UUID: "123e4567-e89b-12d3-a456-426655440000", - RBDID: "abcde123-e89b-8888-a456-986655447236", - Name: "testresourcebundle", - Namespace: "default", - KubernetesVersion: "1.12.3", - }, - expected: Profile{ - UUID: "123e4567-e89b-12d3-a456-426655440000", - RBDID: "abcde123-e89b-8888-a456-986655447236", - Name: "testresourcebundle", - Namespace: "default", - KubernetesVersion: "1.12.3", - }, - expectedError: "", - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "abcde123-e89b-8888-a456-986655447236": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"namespace\":\"default\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"kubernetesversion\":\"1.12.3\"}"), - }, - }, - }, - }, - { - label: "Failed Create Resource Bundle Profile", - expectedError: "Error Creating Profile", - mockdb: &db.MockDB{ - Err: pkgerrors.New("Error Creating Profile"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewProfileClient() - got, err := impl.Create(testCase.inp) - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("Create returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("Create returned an unexpected error %s", err) - } - } else { - if reflect.DeepEqual(testCase.expected, got) == false { - t.Errorf("Create Resource Bundle returned unexpected body: got %v;"+ - " expected %v", got, testCase.expected) - } - } - }) - } -} - -func TestListProfiles(t *testing.T) { - - testCases := []struct { - label string - expectedError string - mockdb *db.MockDB - expected []Profile - }{ - { - label: "List Resource Bundle Profile", - expected: []Profile{ - { - UUID: "123e4567-e89b-12d3-a456-426655440000", - RBDID: "abcde123-e89b-8888-a456-986655447236", - Name: "testresourcebundle", - Namespace: "default", - KubernetesVersion: "1.12.3", - }, - }, - expectedError: "", - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"namespace\":\"default\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"rbdid\":\"abcde123-e89b-8888-a456-986655447236\"," + - "\"kubernetesversion\":\"1.12.3\"}"), - }, - }, - }, - }, - { - label: "List Error", - expectedError: "DB Error", - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewProfileClient() - got, err := impl.List() - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("List returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("List returned an unexpected error %s", err) - } - } else { - // Since the order of returned slice is not guaranteed - // Check both and return error if both don't match - sort.Slice(got, func(i, j int) bool { - return got[i].UUID < got[j].UUID - }) - // Sort both as it is not expected that testCase.expected - // is sorted - sort.Slice(testCase.expected, func(i, j int) bool { - return testCase.expected[i].UUID < testCase.expected[j].UUID - }) - - if reflect.DeepEqual(testCase.expected, got) == false { - t.Errorf("List Resource Bundle returned unexpected body: got %v;"+ - " expected %v", got, testCase.expected) - } - } - }) - } -} - -func TestGetProfile(t *testing.T) { - - testCases := []struct { - label string - expectedError string - mockdb *db.MockDB - inp string - expected Profile - }{ - { - label: "Get Resource Bundle Profile", - inp: "123e4567-e89b-12d3-a456-426655440000", - expected: Profile{ - UUID: "123e4567-e89b-12d3-a456-426655440000", - RBDID: "abcde123-e89b-8888-a456-986655447236", - Name: "testresourcebundle", - Namespace: "default", - KubernetesVersion: "1.12.3", - }, - expectedError: "", - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"namespace\":\"default\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"rbdid\":\"abcde123-e89b-8888-a456-986655447236\"," + - "\"kubernetesversion\":\"1.12.3\"}"), - }, - }, - }, - }, - { - label: "Get Error", - expectedError: "DB Error", - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewProfileClient() - got, err := impl.Get(testCase.inp) - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("Get returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("Get returned an unexpected error %s", err) - } - } else { - if reflect.DeepEqual(testCase.expected, got) == false { - t.Errorf("Get Resource Bundle returned unexpected body: got %v;"+ - " expected %v", got, testCase.expected) - } - } - }) - } -} - -func TestDeleteProfile(t *testing.T) { - - testCases := []struct { - label string - inp string - expectedError string - mockdb *db.MockDB - }{ - { - label: "Delete Resource Bundle Profile", - inp: "123e4567-e89b-12d3-a456-426655440000", - mockdb: &db.MockDB{}, - }, - { - label: "Delete Error", - expectedError: "DB Error", - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewProfileClient() - err := impl.Delete(testCase.inp) - if err != nil { - if testCase.expectedError == "" { - t.Fatalf("Delete returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Fatalf("Delete returned an unexpected error %s", err) - } - } - }) - } -} - -func TestUploadProfile(t *testing.T) { - testCases := []struct { - label string - inp string - content []byte - expectedError string - mockdb *db.MockDB - }{ - { - label: "Upload Resource Bundle Profile", - inp: "123e4567-e89b-12d3-a456-426655440000", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xb0, 0x6b, 0xf4, 0x5b, - 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, - 0x61, 0x72, 0x00, 0xed, 0xce, 0x41, 0x0a, 0xc2, - 0x30, 0x10, 0x85, 0xe1, 0xac, 0x3d, 0x45, 0x4e, - 0x50, 0x12, 0xd2, 0xc4, 0xe3, 0x48, 0xa0, 0x01, - 0x4b, 0x52, 0x0b, 0xed, 0x88, 0x1e, 0xdf, 0x48, - 0x11, 0x5c, 0x08, 0xa5, 0x8b, 0x52, 0x84, 0xff, - 0xdb, 0xbc, 0x61, 0x66, 0x16, 0x4f, 0xd2, 0x2c, - 0x8d, 0x3c, 0x45, 0xed, 0xc8, 0x54, 0x21, 0xb4, - 0xef, 0xb4, 0x67, 0x6f, 0xbe, 0x73, 0x61, 0x9d, - 0xb2, 0xce, 0xd5, 0x55, 0xf0, 0xde, 0xd7, 0x3f, - 0xdb, 0xd6, 0x49, 0x69, 0xb3, 0x67, 0xa9, 0x8f, - 0xfb, 0x2c, 0x71, 0xd2, 0x5a, 0xc5, 0xee, 0x92, - 0x73, 0x8e, 0x43, 0x7f, 0x4b, 0x3f, 0xff, 0xd6, - 0xee, 0x7f, 0xea, 0x9a, 0x4a, 0x19, 0x1f, 0xe3, - 0x54, 0xba, 0xd3, 0xd1, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1b, 0xbc, 0x00, 0xb5, 0xe8, - 0x4a, 0xf9, 0x00, 0x28, 0x00, 0x00, - }, - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"namespace\":\"default\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"rbdid\":\"abcde123-e89b-8888-a456-986655447236\"," + - "\"kubernetesversion\":\"1.12.3\"}"), - }, - }, - }, - }, - { - label: "Upload with an Invalid Resource Bundle Profile", - inp: "123e4567-e89b-12d3-a456-426655440000", - expectedError: "Invalid Profile ID provided", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xb0, 0x6b, 0xf4, 0x5b, - 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, - 0x61, 0x72, 0x00, 0xed, 0xce, 0x41, 0x0a, 0xc2, - 0x30, 0x10, 0x85, 0xe1, 0xac, 0x3d, 0x45, 0x4e, - 0x50, 0x12, 0xd2, 0xc4, 0xe3, 0x48, 0xa0, 0x01, - 0x4b, 0x52, 0x0b, 0xed, 0x88, 0x1e, 0xdf, 0x48, - 0x11, 0x5c, 0x08, 0xa5, 0x8b, 0x52, 0x84, 0xff, - 0xdb, 0xbc, 0x61, 0x66, 0x16, 0x4f, 0xd2, 0x2c, - 0x8d, 0x3c, 0x45, 0xed, 0xc8, 0x54, 0x21, 0xb4, - 0xef, 0xb4, 0x67, 0x6f, 0xbe, 0x73, 0x61, 0x9d, - 0xb2, 0xce, 0xd5, 0x55, 0xf0, 0xde, 0xd7, 0x3f, - 0xdb, 0xd6, 0x49, 0x69, 0xb3, 0x67, 0xa9, 0x8f, - 0xfb, 0x2c, 0x71, 0xd2, 0x5a, 0xc5, 0xee, 0x92, - 0x73, 0x8e, 0x43, 0x7f, 0x4b, 0x3f, 0xff, 0xd6, - 0xee, 0x7f, 0xea, 0x9a, 0x4a, 0x19, 0x1f, 0xe3, - 0x54, 0xba, 0xd3, 0xd1, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1b, 0xbc, 0x00, 0xb5, 0xe8, - 0x4a, 0xf9, 0x00, 0x28, 0x00, 0x00, - }, - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655441111": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"namespace\":\"default\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655441111\"," + - "\"rbdid\":\"abcde123-e89b-8888-a456-986655447236\"," + - "\"kubernetesversion\":\"1.12.3\"}"), - }, - }, - }, - }, - { - label: "Invalid File Format Error", - inp: "123e4567-e89b-12d3-a456-426655440000", - expectedError: "Error in file format", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xf2, 0x48, 0xcd, - }, - mockdb: &db.MockDB{ - Items: map[string]map[string][]byte{ - "123e4567-e89b-12d3-a456-426655440000": { - "metadata": []byte( - "{\"name\":\"testresourcebundle\"," + - "\"namespace\":\"default\"," + - "\"uuid\":\"123e4567-e89b-12d3-a456-426655440000\"," + - "\"rbdid\":\"abcde123-e89b-8888-a456-986655447236\"," + - "\"kubernetesversion\":\"1.12.3\"}"), - }, - }, - }, - }, - { - label: "Upload Error", - expectedError: "DB Error", - content: []byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xb0, 0x6b, 0xf4, 0x5b, - 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, - 0x61, 0x72, 0x00, 0xed, 0xce, 0x41, 0x0a, 0xc2, - 0x30, 0x10, 0x85, 0xe1, 0xac, 0x3d, 0x45, 0x4e, - 0x50, 0x12, 0xd2, 0xc4, 0xe3, 0x48, 0xa0, 0x01, - 0x4b, 0x52, 0x0b, 0xed, 0x88, 0x1e, 0xdf, 0x48, - 0x11, 0x5c, 0x08, 0xa5, 0x8b, 0x52, 0x84, 0xff, - 0xdb, 0xbc, 0x61, 0x66, 0x16, 0x4f, 0xd2, 0x2c, - 0x8d, 0x3c, 0x45, 0xed, 0xc8, 0x54, 0x21, 0xb4, - 0xef, 0xb4, 0x67, 0x6f, 0xbe, 0x73, 0x61, 0x9d, - 0xb2, 0xce, 0xd5, 0x55, 0xf0, 0xde, 0xd7, 0x3f, - 0xdb, 0xd6, 0x49, 0x69, 0xb3, 0x67, 0xa9, 0x8f, - 0xfb, 0x2c, 0x71, 0xd2, 0x5a, 0xc5, 0xee, 0x92, - 0x73, 0x8e, 0x43, 0x7f, 0x4b, 0x3f, 0xff, 0xd6, - 0xee, 0x7f, 0xea, 0x9a, 0x4a, 0x19, 0x1f, 0xe3, - 0x54, 0xba, 0xd3, 0xd1, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1b, 0xbc, 0x00, 0xb5, 0xe8, - 0x4a, 0xf9, 0x00, 0x28, 0x00, 0x00, - }, - mockdb: &db.MockDB{ - Err: pkgerrors.New("DB Error"), - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.label, func(t *testing.T) { - db.DBconn = testCase.mockdb - impl := NewProfileClient() - err := impl.Upload(testCase.inp, testCase.content) - if err != nil { - if testCase.expectedError == "" { - t.Errorf("Upload returned an unexpected error %s", err) - } - if strings.Contains(err.Error(), testCase.expectedError) == false { - t.Errorf("Upload returned an unexpected error %s", err) - } - } - }) - } -} |