diff --git a/dax/controller/client/client.go b/dax/controller/client/client.go index 38163f5d5..f4ddb885a 100644 --- a/dax/controller/client/client.go +++ b/dax/controller/client/client.go @@ -71,8 +71,7 @@ func (c *Client) CreateDatabase(ctx context.Context, qdb *dax.QualifiedDatabase) defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - b, _ := io.ReadAll(resp.Body) - return errors.Errorf("status code: %d: %s", resp.StatusCode, b) + return errors.Wrapf(errors.UnmarshalJSON(resp.Body), "status code: %d", resp.StatusCode) } return nil @@ -158,8 +157,7 @@ func (c *Client) DatabaseByName(ctx context.Context, orgID dax.OrganizationID, n defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - b, _ := io.ReadAll(resp.Body) - return nil, errors.Wrapf(errors.UnmarshalJSON(b), "status code: %d", resp.StatusCode) + return nil, errors.Wrapf(errors.UnmarshalJSON(resp.Body), "status code: %d", resp.StatusCode) } var qdb *dax.QualifiedDatabase @@ -645,8 +643,7 @@ func (c *Client) RegisterNode(ctx context.Context, node *dax.Node) error { defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - b, _ := io.ReadAll(resp.Body) - return errors.Wrapf(errors.UnmarshalJSON(b), "registration request to %s status code: %d: %s", url, resp.StatusCode, b) + return errors.Wrapf(errors.UnmarshalJSON(resp.Body), "registration request to %s status code: %d", url, resp.StatusCode) } return nil @@ -676,8 +673,7 @@ func (c *Client) CheckInNode(ctx context.Context, node *dax.Node) error { defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - b, _ := io.ReadAll(resp.Body) - return errors.Wrapf(errors.UnmarshalJSON(b), "status code: %d: %s", resp.StatusCode, b) + return errors.Wrapf(errors.UnmarshalJSON(resp.Body), "status code: %d", resp.StatusCode) } return nil diff --git a/dax/controller/http/handler.go b/dax/controller/http/handler.go index 6071c89e5..415848eb3 100644 --- a/dax/controller/http/handler.go +++ b/dax/controller/http/handler.go @@ -81,7 +81,7 @@ func (s *server) postCreateDatabase(w http.ResponseWriter, r *http.Request) { err := s.controller.CreateDatabase(ctx, req) if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) + http.Error(w, errors.MarshalJSON(err), http.StatusBadRequest) return } diff --git a/dax/test/dax/dax_test.go b/dax/test/dax/dax_test.go index 886c2247f..08df757d8 100644 --- a/dax/test/dax/dax_test.go +++ b/dax/test/dax/dax_test.go @@ -15,6 +15,7 @@ import ( "github.com/featurebasedb/featurebase/v3/dax" "github.com/featurebasedb/featurebase/v3/dax/controller" controllerclient "github.com/featurebasedb/featurebase/v3/dax/controller/client" + "github.com/featurebasedb/featurebase/v3/dax/controller/schemar" queryerclient "github.com/featurebasedb/featurebase/v3/dax/queryer/client" "github.com/featurebasedb/featurebase/v3/dax/server" "github.com/featurebasedb/featurebase/v3/dax/server/test" @@ -739,12 +740,60 @@ func TestDAXIntegration(t *testing.T) { t.Run("Schemar", func(t *testing.T) { t.Run("CreateDatabase", func(t *testing.T) { - log.Printf("client: %+v", client) - err := client.CreateDatabase(ctx, qdb) + err := client.CreateDatabase(ctx, nil) + log.Printf("ERR: %v", err) if assert.Error(t, err) { - assert.True(t, errors.Is(err, controller.ErrCodeNodeKeyInvalid)) + assert.True(t, errors.Is(err, schemar.ErrCodeDatabaseNameInvalid)) } }) + + t.Run("DropDatabase", func(t *testing.T) { + //DropDatabase(context.Context, QualifiedDatabaseID) error + }) + + t.Run("DatabaseByName", func(t *testing.T) { + // DatabaseByName(ctx context.Context, orgID OrganizationID, dbname DatabaseName) (*QualifiedDatabase, error) + }) + + t.Run("DatabaseByID", func(t *testing.T) { + // DatabaseByID(ctx context.Context, qdbid QualifiedDatabaseID) (*QualifiedDatabase, error) + }) + + t.Run("SetDatabaseOption", func(t *testing.T) { + // SetDatabaseOption(ctx context.Context, qdbid QualifiedDatabaseID, option string, value string) error + }) + + t.Run("Databases", func(t *testing.T) { + // Databases(context.Context, OrganizationID, ...DatabaseID) ([]*QualifiedDatabase, error) + }) + + t.Run("CreateTable", func(t *testing.T) { + // CreateTable(ctx context.Context, qtbl *QualifiedTable) error + }) + + t.Run("DropTable", func(t *testing.T) { + // DropTable(ctx context.Context, qtid QualifiedTableID) error + }) + + t.Run("TableByName", func(t *testing.T) { + // TableByName(ctx context.Context, qdbid QualifiedDatabaseID, tname TableName) (*QualifiedTable, error) + }) + + t.Run("TableByID", func(t *testing.T) { + // TableByID(ctx context.Context, qtid QualifiedTableID) (*QualifiedTable, error) + }) + + t.Run("Tables", func(t *testing.T) { + // Tables(ctx context.Context, qdbid QualifiedDatabaseID, tids ...TableID) ([]*QualifiedTable, error) + }) + + t.Run("CreateField", func(t *testing.T) { + // CreateField(ctx context.Context, qtid QualifiedTableID, fld *Field) error + }) + + t.Run("DropField", func(t *testing.T) { + // DropField(ctx context.Context, qtid QualifiedTableID, fname FieldName) error + }) }) }) }) diff --git a/dax/test/dax/wrappers_test.go b/dax/test/dax/wrappers_test.go index a0b4913fa..380d7974a 100644 --- a/dax/test/dax/wrappers_test.go +++ b/dax/test/dax/wrappers_test.go @@ -9,8 +9,7 @@ import ( ) var _ computer.Registrar = (*wrappedControllerClient)(nil) - -//var _ dax.Schemar = (*wrappedControllerClient)(nil) +var _ dax.Schemar = (*wrappedControllerClient)(nil) // wrappedControllerClient is a wrapper around the controller client which we // use in tests to ensure that all of the methods for the computer.Registrar @@ -21,13 +20,11 @@ var _ computer.Registrar = (*wrappedControllerClient)(nil) // package, but that seems overly compilicated right now. type wrappedControllerClient struct { cli *controllerclient.Client - dax.Schemar } func newWrappedControllerClient(cli *controllerclient.Client) *wrappedControllerClient { return &wrappedControllerClient{ - cli: cli, - Schemar: dax.NewNopSchemar(), + cli: cli, } } @@ -41,25 +38,54 @@ func (w *wrappedControllerClient) CheckInNode(ctx context.Context, node *dax.Nod // Schemar -/* -func (w *wrappedControllerClient) CreateDatabase(context.Context, *QualifiedDatabase) error -func (w *wrappedControllerClient) DropDatabase(context.Context, QualifiedDatabaseID) error +func (w *wrappedControllerClient) CreateDatabase(ctx context.Context, qdb *dax.QualifiedDatabase) error { + return w.cli.CreateDatabase(ctx, qdb) +} - DatabaseByName(ctx context.Context, orgID OrganizationID, dbname DatabaseName) (*QualifiedDatabase, error) - DatabaseByID(ctx context.Context, qdbid QualifiedDatabaseID) (*QualifiedDatabase, error) +func (w *wrappedControllerClient) DropDatabase(ctx context.Context, qdbid dax.QualifiedDatabaseID) error { + return w.cli.DropDatabase(ctx, qdbid) +} - SetDatabaseOption(ctx context.Context, qdbid QualifiedDatabaseID, option string, value string) error +func (w *wrappedControllerClient) DatabaseByName(ctx context.Context, orgID dax.OrganizationID, dbname dax.DatabaseName) (*dax.QualifiedDatabase, error) { + return w.cli.DatabaseByName(ctx, orgID, dbname) +} - Databases(context.Context, OrganizationID, ...DatabaseID) ([]*QualifiedDatabase, error) +func (w *wrappedControllerClient) DatabaseByID(ctx context.Context, qdbid dax.QualifiedDatabaseID) (*dax.QualifiedDatabase, error) { + return w.cli.DatabaseByID(ctx, qdbid) +} - CreateTable(ctx context.Context, qtbl *QualifiedTable) error - DropTable(ctx context.Context, qtid QualifiedTableID) error +func (w *wrappedControllerClient) SetDatabaseOption(ctx context.Context, qdbid dax.QualifiedDatabaseID, option string, value string) error { + return w.cli.SetDatabaseOption(ctx, qdbid, option, value) +} - TableByName(ctx context.Context, qdbid QualifiedDatabaseID, tname TableName) (*QualifiedTable, error) - TableByID(ctx context.Context, qtid QualifiedTableID) (*QualifiedTable, error) +func (w *wrappedControllerClient) Databases(ctx context.Context, orgID dax.OrganizationID, dbIDs ...dax.DatabaseID) ([]*dax.QualifiedDatabase, error) { + return w.cli.Databases(ctx, orgID, dbIDs...) +} - Tables(ctx context.Context, qdbid QualifiedDatabaseID, tids ...TableID) ([]*QualifiedTable, error) +func (w *wrappedControllerClient) CreateTable(ctx context.Context, qtbl *dax.QualifiedTable) error { + return w.cli.CreateTable(ctx, qtbl) +} - CreateField(ctx context.Context, qtid QualifiedTableID, fld *Field) error - DropField(ctx context.Context, qtid QualifiedTableID, fname FieldName) error -*/ +func (w *wrappedControllerClient) DropTable(ctx context.Context, qtid dax.QualifiedTableID) error { + return w.cli.DropTable(ctx, qtid) +} + +func (w *wrappedControllerClient) TableByName(ctx context.Context, qdbid dax.QualifiedDatabaseID, tname dax.TableName) (*dax.QualifiedTable, error) { + return w.cli.TableByName(ctx, qdbid, tname) +} + +func (w *wrappedControllerClient) TableByID(ctx context.Context, qtid dax.QualifiedTableID) (*dax.QualifiedTable, error) { + return w.cli.TableByID(ctx, qtid) +} + +func (w *wrappedControllerClient) Tables(ctx context.Context, qdbid dax.QualifiedDatabaseID, tids ...dax.TableID) ([]*dax.QualifiedTable, error) { + return w.cli.Tables(ctx, qdbid, tids...) +} + +func (w *wrappedControllerClient) CreateField(ctx context.Context, qtid dax.QualifiedTableID, fld *dax.Field) error { + return w.cli.CreateField(ctx, qtid, fld) +} + +func (w *wrappedControllerClient) DropField(ctx context.Context, qtid dax.QualifiedTableID, fname dax.FieldName) error { + return w.cli.DropField(ctx, qtid, fname) +} diff --git a/errors/errors.go b/errors/errors.go index b49d96256..dabc52d20 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -4,6 +4,7 @@ package errors import ( "encoding/json" + "io" "github.com/pkg/errors" ) @@ -126,10 +127,8 @@ func MarshalJSON(err error) string { // UnmarshalJSON converts the byte slice into a codedError. If the bytes can't // unmarshal to a codedError, a normal error will be returned containing the // string value of the byte slice. -func UnmarshalJSON(b []byte) error { - if len(b) == 0 { - return nil - } +func UnmarshalJSON(r io.Reader) error { + b, _ := io.ReadAll(r) out := &codedError{} if err := json.Unmarshal(b, out); err != nil {