From 4a142243b41326e1729196dedfbb621407a5140b Mon Sep 17 00:00:00 2001 From: Tiffany Cheng Date: Tue, 7 Nov 2017 17:20:01 -0800 Subject: [PATCH 1/5] Validate cassandra column type --- client.go | 4 +- connectors/cassandra/schema.go | 10 ++-- connectors/cassandra/schema_test.go | 82 +++++++++++++++++++++++++++-- 3 files changed, 86 insertions(+), 10 deletions(-) diff --git a/client.go b/client.go index 4657e839..a7d14b59 100644 --- a/client.go +++ b/client.go @@ -218,9 +218,7 @@ type client struct { connector Connector } -// NewClient returns a new DOSA client for the registry and connector -// provided. This is currently only a partial implementation to demonstrate -// basic CRUD functionality. +// NewClient returns a new DOSA client for the registry and connector provided. func NewClient(reg Registrar, conn Connector) Client { return &client{ registrar: reg, diff --git a/connectors/cassandra/schema.go b/connectors/cassandra/schema.go index 4401ad6a..4a5196cc 100644 --- a/connectors/cassandra/schema.go +++ b/connectors/cassandra/schema.go @@ -113,14 +113,16 @@ func checkClusteringKeys(ed *dosa.EntityDefinition, md *gocql.TableMetadata) err } return nil } + func checkColumns(ed *dosa.EntityDefinition, md *gocql.TableMetadata, schemaErrors *RepairableSchemaMismatchError) { // Check each column for _, col := range ed.Columns { - _, ok := md.Columns[col.Name] - if !ok { - schemaErrors.MissingColumns = append(schemaErrors.MissingColumns, MissingColumn{Column: *col, Tablename: ed.Name}) + cassandraCol, ok := md.Columns[col.Name] + if ok && cassandraCol.Type.Type().String() == cassandraType(col.Type) { + continue } - // TODO: check column type + + schemaErrors.MissingColumns = append(schemaErrors.MissingColumns, MissingColumn{Column: *col, Tablename: ed.Name}) } } diff --git a/connectors/cassandra/schema_test.go b/connectors/cassandra/schema_test.go index 4b9e2352..fbca201e 100644 --- a/connectors/cassandra/schema_test.go +++ b/connectors/cassandra/schema_test.go @@ -50,6 +50,34 @@ func TestCompareStructToSchemaWrongPk(t *testing.T) { assert.Contains(t, err.Error(), `"test"`) } +func TestCompareStructToSchemaWrongCk(t *testing.T) { + ed := dosa.EntityDefinition{ + Key: &dosa.PrimaryKey{ + PartitionKeys: []string{"p1"}, + ClusteringKeys: []*dosa.ClusteringKey{{Name:"c1", Descending: true}}, + }, + Name: "test", + Columns: []*dosa.ColumnDefinition{ + {Name: "p1", Type: dosa.String}, + {Name: "c1", Type: dosa.String}, + }, + } + md := gocql.TableMetadata{ + PartitionKey: []*gocql.ColumnMetadata{ + {Name: "p1", Type: TestType{typ: gocql.TypeText}}, + }, + ClusteringColumns: []*gocql.ColumnMetadata{ + {Name: "c2", Type: TestType{typ: gocql.TypeText}}, + }, + Columns: map[string]*gocql.ColumnMetadata{ + "p1": {Name: "p1", Type: TestType{typ: gocql.TypeText}}, + }} + missing := RepairableSchemaMismatchError{} + err := compareStructToSchema(&ed, &md, &missing) + assert.Error(t, err) + assert.Contains(t, err.Error(), `"test"`) +} + func TestCompareStructToSchemaMissingColumn(t *testing.T) { ed := dosa.EntityDefinition{Key: &dosa.PrimaryKey{ PartitionKeys: []string{"p1"}}, @@ -60,14 +88,14 @@ func TestCompareStructToSchemaMissingColumn(t *testing.T) { }, } md := gocql.TableMetadata{PartitionKey: []*gocql.ColumnMetadata{ - {Name: "p1", Type: TestType{typ: gocql.TypeVarchar}}, + {Name: "p1", Type: TestType{typ: gocql.TypeText}}, }, Columns: map[string]*gocql.ColumnMetadata{ - "p1": {Name: "p1", Type: TestType{typ: gocql.TypeVarchar}}, + "p1": {Name: "p1", Type: TestType{typ: gocql.TypeText}}, }} missing := RepairableSchemaMismatchError{} err := compareStructToSchema(&ed, &md, &missing) - assert.Nil(t, err) + assert.NoError(t, err) assert.True(t, missing.HasMissing()) assert.Equal(t, 1, len(missing.MissingColumns)) assert.Equal(t, "test", missing.MissingColumns[0].Tablename) @@ -75,6 +103,54 @@ func TestCompareStructToSchemaMissingColumn(t *testing.T) { assert.Contains(t, missing.Error(), "Missing 1 column") } +func TestCompareStructToSchemaMissingColumnType(t *testing.T) { + ed := dosa.EntityDefinition{Key: &dosa.PrimaryKey{ + PartitionKeys: []string{"pk"}}, + Name: "test", + Columns: []*dosa.ColumnDefinition{ + {Name: "pk", Type: dosa.String}, + }, + } + md := gocql.TableMetadata{ + PartitionKey: []*gocql.ColumnMetadata{ + {Name: "pk", Type: TestType{typ: gocql.TypeVarchar}}, + }, + Columns: map[string]*gocql.ColumnMetadata{ + "pk": {Name: "pk", Type: TestType{typ: gocql.TypeVarchar}}, + }, + } + missing := RepairableSchemaMismatchError{} + err := compareStructToSchema(&ed, &md, &missing) + assert.NoError(t, err) + assert.True(t, missing.HasMissing()) + assert.Equal(t, 1, len(missing.MissingColumns)) + assert.Equal(t, "test", missing.MissingColumns[0].Tablename) + assert.Equal(t, "pk", missing.MissingColumns[0].Column.Name) + assert.Contains(t, missing.Error(), "Missing 1 column") +} + +func TestCompareStructToSchema(t *testing.T) { + ed := dosa.EntityDefinition{Key: &dosa.PrimaryKey{ + PartitionKeys: []string{"p1"}}, + Name: "test", + Columns: []*dosa.ColumnDefinition{ + {Name: "p1", Type: dosa.Int32}, + }, + } + md := gocql.TableMetadata{ + PartitionKey: []*gocql.ColumnMetadata{ + {Name: "p1", Type: TestType{typ: gocql.TypeInt}}, + }, + Columns: map[string]*gocql.ColumnMetadata{ + "p1": {Name: "p1", Type: TestType{typ: gocql.TypeInt}}, + }, + } + missing := RepairableSchemaMismatchError{} + err := compareStructToSchema(&ed, &md, &missing) + assert.NoError(t, err) + assert.False(t, missing.HasMissing()) +} + type TestType struct { typ gocql.Type } From a1da39b11248062589cb39687d29cb757c639999 Mon Sep 17 00:00:00 2001 From: Tiffany Cheng Date: Thu, 9 Nov 2017 12:05:20 -0800 Subject: [PATCH 2/5] add comments for tests --- connectors/cassandra/schema_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/connectors/cassandra/schema_test.go b/connectors/cassandra/schema_test.go index fbca201e..aced78b1 100644 --- a/connectors/cassandra/schema_test.go +++ b/connectors/cassandra/schema_test.go @@ -50,6 +50,7 @@ func TestCompareStructToSchemaWrongPk(t *testing.T) { assert.Contains(t, err.Error(), `"test"`) } +// test that the cluster key in gocql doesn't match cluster key in dosa definition. c1 != c2 func TestCompareStructToSchemaWrongCk(t *testing.T) { ed := dosa.EntityDefinition{ Key: &dosa.PrimaryKey{ @@ -103,6 +104,7 @@ func TestCompareStructToSchemaMissingColumn(t *testing.T) { assert.Contains(t, missing.Error(), "Missing 1 column") } +// dosa string type is a gocql test type, not varchar func TestCompareStructToSchemaMissingColumnType(t *testing.T) { ed := dosa.EntityDefinition{Key: &dosa.PrimaryKey{ PartitionKeys: []string{"pk"}}, From 4ba3565e91d0c1ee7932382786db9c91ffc51731 Mon Sep 17 00:00:00 2001 From: Tiffany Cheng Date: Thu, 9 Nov 2017 12:12:05 -0800 Subject: [PATCH 3/5] fix typo --- connectors/cassandra/schema_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connectors/cassandra/schema_test.go b/connectors/cassandra/schema_test.go index aced78b1..9bdd002e 100644 --- a/connectors/cassandra/schema_test.go +++ b/connectors/cassandra/schema_test.go @@ -104,7 +104,7 @@ func TestCompareStructToSchemaMissingColumn(t *testing.T) { assert.Contains(t, missing.Error(), "Missing 1 column") } -// dosa string type is a gocql test type, not varchar +// dosa string type is a gocql text type, not varchar func TestCompareStructToSchemaMissingColumnType(t *testing.T) { ed := dosa.EntityDefinition{Key: &dosa.PrimaryKey{ PartitionKeys: []string{"pk"}}, From 326f0b8995e1063618aa80ab6cd07b67a5a994ae Mon Sep 17 00:00:00 2001 From: Tiffany Cheng Date: Thu, 9 Nov 2017 12:13:03 -0800 Subject: [PATCH 4/5] gofmt --- connectors/cassandra/schema_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connectors/cassandra/schema_test.go b/connectors/cassandra/schema_test.go index 9bdd002e..73128fd9 100644 --- a/connectors/cassandra/schema_test.go +++ b/connectors/cassandra/schema_test.go @@ -54,8 +54,8 @@ func TestCompareStructToSchemaWrongPk(t *testing.T) { func TestCompareStructToSchemaWrongCk(t *testing.T) { ed := dosa.EntityDefinition{ Key: &dosa.PrimaryKey{ - PartitionKeys: []string{"p1"}, - ClusteringKeys: []*dosa.ClusteringKey{{Name:"c1", Descending: true}}, + PartitionKeys: []string{"p1"}, + ClusteringKeys: []*dosa.ClusteringKey{{Name: "c1", Descending: true}}, }, Name: "test", Columns: []*dosa.ColumnDefinition{ From 014948568ab57c66e347c22ce7ce1613909bbf27 Mon Sep 17 00:00:00 2001 From: Tiffany Cheng Date: Wed, 22 Nov 2017 10:17:42 -0800 Subject: [PATCH 5/5] remove comment change --- client.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client.go b/client.go index a7d14b59..4657e839 100644 --- a/client.go +++ b/client.go @@ -218,7 +218,9 @@ type client struct { connector Connector } -// NewClient returns a new DOSA client for the registry and connector provided. +// NewClient returns a new DOSA client for the registry and connector +// provided. This is currently only a partial implementation to demonstrate +// basic CRUD functionality. func NewClient(reg Registrar, conn Connector) Client { return &client{ registrar: reg,