From 5856c9fcb61e2a508b6eb82090305b90c141a9a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Unbekandt?= Date: Thu, 29 Jun 2017 11:22:00 +0200 Subject: [PATCH] database: add GetNamespace Provides the functionality to retrieve a namespace from his name. --- database/database.go | 3 +++ database/mock.go | 8 ++++++++ database/pgsql/namespace.go | 9 +++++++++ database/pgsql/namespace_test.go | 19 +++++++++++++++++++ database/pgsql/queries.go | 1 + 5 files changed, 40 insertions(+) diff --git a/database/database.go b/database/database.go index d3f7fc0f..1d90d0bf 100644 --- a/database/database.go +++ b/database/database.go @@ -76,6 +76,9 @@ type Datastore interface { // ListNamespaces returns the entire list of known Namespaces. ListNamespaces() ([]Namespace, error) + //GetNamespace returns the namespace with name namespaceName + GetNamespace(namespaceName string) (*Namespace, error) + // InsertLayer stores a Layer in the database. // // A Layer is uniquely identified by its Name. diff --git a/database/mock.go b/database/mock.go index 9a0963c8..cb167244 100644 --- a/database/mock.go +++ b/database/mock.go @@ -20,6 +20,7 @@ import "time" // The default behavior of each method is to simply panic. type MockDatastore struct { FctListNamespaces func() ([]Namespace, error) + FctGetNamespace func(namespaceName string) (*Namespace, error) FctInsertLayer func(Layer) error FctFindLayer func(name string, withFeatures, withVulnerabilities bool) (Layer, error) FctDeleteLayer func(name string) error @@ -49,6 +50,13 @@ func (mds *MockDatastore) ListNamespaces() ([]Namespace, error) { panic("required mock function not implemented") } +func (mds *MockDatastore) GetNamespace(namespaceName string) (*Namespace, error) { + if mds.FctGetNamespace != nil { + return mds.FctGetNamespace(namespaceName) + } + panic("required mock function not implemented") +} + func (mds *MockDatastore) InsertLayer(layer Layer) error { if mds.FctInsertLayer != nil { return mds.FctInsertLayer(layer) diff --git a/database/pgsql/namespace.go b/database/pgsql/namespace.go index 8d4b304b..06b5572b 100644 --- a/database/pgsql/namespace.go +++ b/database/pgsql/namespace.go @@ -73,3 +73,12 @@ func (pgSQL *pgSQL) ListNamespaces() (namespaces []database.Namespace, err error return namespaces, err } + +func (pgSQL *pgSQL) GetNamespace(namespaceName string) (*database.Namespace, error) { + var ns database.Namespace + err := pgSQL.QueryRow(getNamespace, namespaceName).Scan(&ns.ID, &ns.Name, &ns.VersionFormat) + if err != nil { + return nil, handleError("getNamespace", err) + } + return &ns, nil +} diff --git a/database/pgsql/namespace_test.go b/database/pgsql/namespace_test.go index 0990b6f4..f98a70e5 100644 --- a/database/pgsql/namespace_test.go +++ b/database/pgsql/namespace_test.go @@ -72,3 +72,22 @@ func TestListNamespace(t *testing.T) { } } } + +func TestGetNamespace(t *testing.T) { + datastore, err := openDatabaseForTest("GetNamespace", true) + if err != nil { + t.Error(err) + return + } + defer datastore.Close() + + // Invalid Namespace. + ns0, err := datastore.GetNamespace("Not present") + assert.NotNil(t, err) + assert.Nil(t, ns0) + + // Valid Namespace. + ns1, err := datastore.GetNamespace("debian:7") + assert.Nil(t, err) + assert.Equal(t, ns1.Name, "debian:7") +} diff --git a/database/pgsql/queries.go b/database/pgsql/queries.go index 9529c29c..61c8116a 100644 --- a/database/pgsql/queries.go +++ b/database/pgsql/queries.go @@ -40,6 +40,7 @@ const ( searchNamespace = `SELECT id FROM Namespace WHERE name = $1` listNamespace = `SELECT id, name, version_format FROM Namespace` + getNamespace = `SELECT id, name, version_format FROM Namespace WHERE name = $1` // feature.go soiFeature = `