Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions go.work.sum
Original file line number Diff line number Diff line change
@@ -1,20 +1,31 @@
cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/alecthomas/chroma/v2 v2.5.0/go.mod h1:yrkMI9807G1ROx13fhe1v6PN2DDeaR73L3d+1nmYQtw=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE=
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
Expand All @@ -24,34 +35,38 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y=
github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ=
github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc=
github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8=
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
Expand Down
15 changes: 15 additions & 0 deletions integration/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package integration

import "github.com/opentdf/opentdf-v2-poc/internal/config"

var Config *config.Config

func init() {
Config = &config.Config{}

Config.DB.User = "postgres"
Config.DB.Password = "postgres"
Config.DB.Host = "localhost"
Config.DB.Port = 5432
Config.DB.Database = "opentdf-test"
}
81 changes: 81 additions & 0 deletions integration/db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package integration

import (
"context"
"log/slog"
"strings"

"github.com/opentdf/opentdf-v2-poc/internal/db"
)

type DBInterface struct {
Client *db.Client
schema string
}

func NewDBInterface(schema string) DBInterface {
config := Config.DB
config.Schema = schema
c, err := db.NewClient(config)
if err != nil {
slog.Error("issue creating database client", slog.String("error", err.Error()))
panic(err)
}
return DBInterface{
Client: c,
schema: schema,
}
}

func (d *DBInterface) StringArrayWrap(values []string) string {
// if len(values) == 0 {
// return "null"
// }
var vs []string
for _, v := range values {
vs = append(vs, d.StringWrap(v))
}
return "ARRAY [" + strings.Join(vs, ",") + "]"
}

func (d *DBInterface) UUIDArrayWrap(v []string) string {
return "(" + d.StringArrayWrap(v) + ")" + "::uuid[]"
}

func (d *DBInterface) StringWrap(v string) string {
return "'" + v + "'"
}

func (d *DBInterface) UUIDWrap(v string) string {
return "(" + d.StringWrap(v) + ")" + "::uuid"
}

func (d *DBInterface) TableName(v string) string {
return d.schema + "." + v
}

func (d *DBInterface) ExecInsert(table string, columns []string, values ...[]string) (int64, error) {
sql := "INSERT INTO " + d.TableName(table) +
" (" + strings.Join(columns, ",") + ")" +
" VALUES "
for i, v := range values {
if i > 0 {
sql += ","
}
sql += " (" + strings.Join(v, ",") + ")"
}
pconn, err := d.Client.Exec(context.Background(), sql)
if err != nil {
return 0, err
}
return pconn.RowsAffected(), err
}

func (d *DBInterface) DropSchema() error {
sql := "DROP SCHEMA IF EXISTS " + d.schema + " CASCADE"
_, err := d.Client.Exec(context.Background(), sql)
if err != nil {
return err
}
return nil
}
217 changes: 217 additions & 0 deletions integration/fixtures.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
package integration

import (
"log/slog"
"os"

"gopkg.in/yaml.v2"
)

var fixtureFilename = "fixtures.yaml"
var fixtureData FixtureData

type FixtureMetadata struct {
TableName string `yaml:"table_name"`
Columns []string `yaml:"columns"`
}

type FixtureDataNamespace struct {
Id string `yaml:"id"`
Name string `yaml:"name"`
}

type FixtureDataAttribute struct {
Id string `yaml:"id"`
NamespaceId string `yaml:"namespace_id"`
Name string `yaml:"name"`
Rule string `yaml:"rule"`
}

type FixtureDataAttributeValue struct {
Id string `yaml:"id"`
AttributeDefinitionId string `yaml:"attribute_definition_id"`
Value string `yaml:"value"`
Members []string `yaml:"members"`
}

type FixtureDataSubjectMapping struct {
Id string `yaml:"id"`
AttributeValueId string `yaml:"attribute_value_id"`
Operator string `yaml:"operator"`
SubjectAttribute string `yaml:"subject_attribute"`
SubjectAttributeValues []string `yaml:"subject_attribute_values"`
}

type FixtureData struct {
Namespaces struct {
Metadata FixtureMetadata `yaml:"metadata"`
Data map[string]FixtureDataNamespace `yaml:"data"`
} `yaml:"namespaces"`
Attributes struct {
Metadata FixtureMetadata `yaml:"metadata"`
Data map[string]FixtureDataAttribute `yaml:"data"`
} `yaml:"attributes"`
AttributeValues struct {
Metadata FixtureMetadata `yaml:"metadata"`
Data map[string]FixtureDataAttributeValue `yaml:"data"`
} `yaml:"attribute_values"`
SubjectMappings struct {
Metadata FixtureMetadata `yaml:"metadata"`
Data map[string]FixtureDataSubjectMapping `yaml:"data"`
} `yaml:"subject_mappings"`
}

func loadFixtureData() {
c, err := os.ReadFile(fixtureFilename)
if err != nil {
slog.Error("could not read "+fixtureFilename, slog.String("error", err.Error()))
panic(err)
}

if err := yaml.Unmarshal(c, &fixtureData); err != nil {
slog.Error("could not unmarshal "+fixtureFilename, slog.String("error", err.Error()))
panic(err)
}
}

type Fixtures struct {
db DBInterface
}

func NewFixture(db DBInterface) Fixtures {
return Fixtures{
db: db,
}
}

func (f *Fixtures) GetNamespaceKey(key string) FixtureDataNamespace {
if fixtureData.Namespaces.Data[key].Id == "" {
slog.Error("could not find namespace", slog.String("id", key))
panic("could not find namespace")
}
return fixtureData.Namespaces.Data[key]
}

func (f *Fixtures) GetAttributeKey(key string) FixtureDataAttribute {
if fixtureData.Attributes.Data[key].Id == "" {
slog.Error("could not find attributes", slog.String("id", key))
panic("could not find attributes")
}
return fixtureData.Attributes.Data[key]
}

func (f *Fixtures) GetAttributeValueKey(key string) FixtureDataAttributeValue {
if fixtureData.AttributeValues.Data[key].Id == "" {
slog.Error("could not find attribute-values", slog.String("id", key))
panic("could not find attribute-values")
}
return fixtureData.AttributeValues.Data[key]
}

func (f *Fixtures) GetSubjectMappingKey(key string) FixtureDataSubjectMapping {
if fixtureData.SubjectMappings.Data[key].Id == "" {
slog.Error("could not find subject-mappings", slog.String("id", key))
panic("could not find subject-mappings")
}
return fixtureData.SubjectMappings.Data[key]
}

func (f *Fixtures) Provision() {
slog.Info("📦 running migrations in schema", slog.String("schema", f.db.schema))
f.db.Client.RunMigrations()

slog.Info("📦 provisioning namespace data")
n := f.provisionNamespace()
slog.Info("📦 provisioning attribute data")
a := f.provisionAttribute()
slog.Info("📦 provisioning attribute value data")
aV := f.provisionAttributeValues()
slog.Info("📦 provisioning subject mapping data")
sM := f.provisionSubjectMappings()

slog.Info("📦 provisioned fixtures data",
slog.Int64("namespaces", n),
slog.Int64("attributes", a),
slog.Int64("attribute_values", aV),
slog.Int64("subject_mappings", sM),
)
}

func (f *Fixtures) TearDown() {
slog.Info("🗑 dropping schema", slog.String("schema", f.db.schema))
if err := f.db.DropSchema(); err != nil {
slog.Error("could not truncate tables", slog.String("error", err.Error()))
panic(err)
}
}

func (f *Fixtures) provisionNamespace() int64 {
var values [][]string
for _, d := range fixtureData.Namespaces.Data {
values = append(values,
[]string{
f.db.StringWrap(d.Id),
f.db.StringWrap(d.Name),
},
)
}
return f.provision(fixtureData.Namespaces.Metadata.TableName, fixtureData.Namespaces.Metadata.Columns, values)
}

func (f *Fixtures) provisionAttribute() int64 {
var values [][]string
for _, d := range fixtureData.Attributes.Data {
values = append(values, []string{
f.db.StringWrap(d.Id),
f.db.StringWrap(d.NamespaceId),
f.db.StringWrap(d.Name),
f.db.StringWrap(d.Rule),
})
}
return f.provision(fixtureData.Attributes.Metadata.TableName, fixtureData.Attributes.Metadata.Columns, values)
}

func (f *Fixtures) provisionAttributeValues() int64 {
var values [][]string
for _, d := range fixtureData.AttributeValues.Data {
values = append(values, []string{
f.db.StringWrap(d.Id),
f.db.StringWrap(d.AttributeDefinitionId),
f.db.StringWrap(d.Value),
f.db.UUIDArrayWrap(d.Members),
})
}
return f.provision(fixtureData.AttributeValues.Metadata.TableName, fixtureData.AttributeValues.Metadata.Columns, values)
}

func (f *Fixtures) provisionSubjectMappings() int64 {
var values [][]string
for _, d := range fixtureData.SubjectMappings.Data {
values = append(values, []string{
f.db.StringWrap(d.Id),
f.db.UUIDWrap(d.AttributeValueId),
f.db.StringWrap(d.Operator),
f.db.StringWrap(d.SubjectAttribute),
f.db.StringArrayWrap(d.SubjectAttributeValues),
})
}
return f.provision(fixtureData.SubjectMappings.Metadata.TableName, fixtureData.SubjectMappings.Metadata.Columns, values)
}

func (f *Fixtures) provision(t string, c []string, v [][]string) (rows int64) {
var err error
rows, err = f.db.ExecInsert(t, c, v...)
if err != nil {
slog.Error("⛔️ 📦 issue with insert into table - check fixtures.yaml for issues", slog.String("table", t))
panic("issue with insert into table")
}
if rows == 0 {
slog.Error("⛔️ 📦 no rows provisioned - check fixtures.yaml for issues", slog.String("table", t), slog.Int("expected", len(v)))
panic("no rows provisioned")
}
if rows != int64(len(v)) {
slog.Error("⛔️ 📦 incorrect number of rows provisioned - check fixtures.yaml for issues", slog.String("table", t), slog.Int("expected", len(v)), slog.Int64("actual", rows))
panic("incorrect number of rows provisioned")
}
return rows
}
Loading