blob: 77bdf67ec63a16654a4122a36a32df4d201d0ccb [file] [log] [blame] [edit]
// Copyright 2017 Google 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 dockertests
import (
"database/sql"
_ "github.com/lib/pq"
)
var (
basicTables = map[string]bool{
"deployment_history": true,
"deployment": true,
"bundle_config": true,
"configuration": true,
"apid_cluster": true,
"data_scope": true,
}
)
type ManagementPg struct {
url string
pg *sql.DB
}
func InitDb(dbUrl string) (*ManagementPg, error) {
db, err := sql.Open("postgres", dbUrl)
if err != nil {
return nil, err
}
return &ManagementPg{
url: dbUrl,
pg: db,
}, nil
}
func (m *ManagementPg) InsertApidCluster(tx *sql.Tx, cluster *apidClusterRow) error {
stmt, err := tx.Prepare(`INSERT INTO edgex.apid_cluster(
id,
name,
description,
umbrella_org_app_name,
created,
created_by,
updated,
updated_by,
_change_selector
)
VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9)`)
if err != nil {
return err
}
_, err = stmt.Exec(
cluster.id,
cluster.name,
cluster.description,
cluster.appName,
cluster.created,
cluster.createdBy,
cluster.updated,
cluster.updatedBy,
cluster.changeSelector,
)
return err
}
func (m *ManagementPg) InsertDataScope(tx *sql.Tx, ds *dataScopeRow) error {
stmt, err := tx.Prepare(`INSERT INTO edgex.data_scope (
id,
apid_cluster_id,
scope,
org,
env,
created,
created_by,
updated,
updated_by,
_change_selector,
org_scope,
env_scope
)
VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)`)
if err != nil {
return err
}
_, err = stmt.Exec(
ds.id,
ds.clusterId,
ds.scope,
ds.org,
ds.env,
ds.created,
ds.createdBy,
ds.updated,
ds.updatedBy,
ds.changeSelector,
ds.orgScope,
ds.envScope,
)
return err
}
func (m *ManagementPg) InsertBundleConfig(tx *sql.Tx, bf *bundleConfigRow) error {
stmt, err := tx.Prepare(`INSERT INTO edgex.bundle_config (
id,
data_scope_id,
name,
uri,
checksumtype,
checksum,
created,
created_by,
updated,
updated_by
)
VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)`)
if err != nil {
return err
}
_, err = stmt.Exec(
bf.id,
bf.scopeId,
bf.name,
bf.uri,
bf.checksumType,
bf.checksum,
bf.created,
bf.createdBy,
bf.updated,
bf.updatedBy,
)
return err
}
func (m *ManagementPg) InsertDeployment(tx *sql.Tx, d *deploymentRow) error {
stmt, err := tx.Prepare(`INSERT INTO edgex.deployment (
id,
bundle_config_id,
apid_cluster_id,
data_scope_id,
bundle_config_name,
bundle_config_json,
config_json,
created,
created_by,
updated,
updated_by,
_change_selector
)
VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)`)
if err != nil {
return err
}
_, err = stmt.Exec(
d.id,
d.configId,
d.clusterId,
d.scopeId,
d.bundleConfigName,
d.bundleConfigJson,
d.configJson,
d.created,
d.createdBy,
d.updated,
d.updatedBy,
d.changeSelector,
)
return err
}
func (m *ManagementPg) BeginTransaction() (*sql.Tx, error) {
tx, err := m.pg.Begin()
return tx, err
}
/*
* Delete all new tables or rows created by a test from pg.
* Only test data for the whole suite will remain in the pg.
*/
func (m *ManagementPg) CleanupTest() error {
// clean tables
tablesToDelete := make([]string, 0)
rows, err := m.pg.Query("SELECT table_name FROM information_schema.tables WHERE table_schema='edgex';")
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
var tableName string
err = rows.Scan(&tableName)
if err != nil {
return err
}
if !basicTables[tableName] {
tablesToDelete = append(tablesToDelete, tableName)
}
}
for _, tableName := range tablesToDelete {
cleanupSql := "DROP TABLE edgex." + tableName + ";"
_, err := m.pg.Exec(cleanupSql)
if err != nil {
return err
}
}
cleanupSql := "DELETE FROM edgex.apid_cluster WHERE created_by!='" + testInitUser + "';"
_, err = m.pg.Exec(cleanupSql)
if err != nil {
return err
}
// clean enum types
typesToDelete := make([]string, 0)
typeRows, err := m.pg.Query("SELECT DISTINCT pg_type.typname AS enumtype FROM pg_type JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;")
if err != nil {
return err
}
defer typeRows.Close()
for typeRows.Next() {
var typeName string
err = typeRows.Scan(&typeName)
if err != nil {
return err
}
typesToDelete = append(typesToDelete, typeName)
}
for _, typeName := range typesToDelete {
cleanupSql := "DROP TYPE edgex." + typeName + ";"
_, err := m.pg.Exec(cleanupSql)
if err != nil {
return err
}
}
return nil
}
func (m *ManagementPg) CleanupAll() error {
cleanupSql := "DELETE FROM edgex.apid_cluster;"
_, err := m.pg.Exec(cleanupSql)
return err
}