console and cli: run console in CLI mode for tests, misc CLI fixes (#368)

GitOrigin-RevId: 4563444387a4c9d02b5429729fe30bc87763288f
This commit is contained in:
Aleksandra Sikora 2021-01-20 21:17:47 +01:00 committed by hasura-bot
parent 3f87d9e886
commit b4fd2e3f9f
8 changed files with 87 additions and 23 deletions

View File

@ -20,7 +20,7 @@ cd "$CONSOLE_ROOT"
mkdir -p /build/_console_output mkdir -p /build/_console_output
touch /build/_console_output/server.log touch /build/_console_output/server.log
# touch /build/_console_output/cli.log touch /build/_console_output/cli.log
# start graphql-engine # start graphql-engine
/build/_server_output/graphql-engine \ /build/_server_output/graphql-engine \
@ -29,19 +29,19 @@ touch /build/_console_output/server.log
wait_for_port 8080 wait_for_port 8080
# start cli # start cli
# /build/_cli_output/binaries/cli-hasura-linux-amd64 init --directory gql-test && cd gql-test /build/_cli_output/binaries/cli-hasura-linux-amd64 init --directory gql-test && cd gql-test
# /build/_cli_output/binaries/cli-hasura-linux-amd64 console --no-browser > /build/_console_output/cli.log 2>&1 & /build/_cli_output/binaries/cli-hasura-linux-amd64 console --no-browser > /build/_console_output/cli.log 2>&1 &
# cd .. cd ..
# wait_for_port 9693 wait_for_port 9693
export PORT=3000 export PORT=3000
export NODE_ENV=development export NODE_ENV=development
export DATA_API_URL=http://localhost:8080 export DATA_API_URL=http://localhost:8080
# export API_HOST=http://localhost export API_HOST=http://localhost
# export API_PORT=9693 export API_PORT=9693
export CONSOLE_MODE=server export CONSOLE_MODE=cli
export DEV_DATA_API_URL=http://localhost:8080 export DEV_DATA_API_URL=http://localhost:8080
export URL_PREFIX=/ export URL_PREFIX=/
export SERVER_VERSION=$(cat /build/_server_output/version.txt) export SERVER_VERSION=$(cat /build/_server_output/version.txt)

View File

@ -35,7 +35,7 @@ const (
) )
var ( var (
queryTypes = []string{"select", "insert", "select", "update", "delete", "count", "run_sql", "bulk"} queryTypes = []string{"select", "insert", "select", "update", "delete", "count", "run_sql"}
queryTypesMap = func() map[string]bool { queryTypesMap = func() map[string]bool {
var m = map[string]bool{} var m = map[string]bool{}
for _, v := range queryTypes { for _, v := range queryTypes {
@ -670,3 +670,6 @@ func (c *HasuraRestAPIClient) HasMultipleDatasources() (bool, error) {
return true, nil return true, nil
} }
type ErrMetadataRequestsFailed error
type ErrQueryRequestsFailed error

View File

@ -123,7 +123,7 @@ func WithInstance(config *Config, logger *log.Logger, hasuraOpts *database.Hasur
default: default:
if hasuraOpts.HasMetadataV3 { if hasuraOpts.HasMetadataV3 {
hx.migrationStateStore = NewMigrationStateStoreWithSQL(hx, hasuraOpts.MigrationExectionStrategy) hx.migrationStateStore = NewMigrationStateStoreWithSQL(hx, hasuraOpts.MigrationExectionStrategy)
}else { } else {
hx.migrationStateStore = NewMigrationStateStoreWithSQL(hx, hasuraOpts.MigrationExectionStrategy) hx.migrationStateStore = NewMigrationStateStoreWithSQL(hx, hasuraOpts.MigrationExectionStrategy)
} }
hx.settingsStateStore = NewSettingsStateStoreWithSQL(hx) hx.settingsStateStore = NewSettingsStateStoreWithSQL(hx)
@ -259,7 +259,7 @@ func (h *HasuraDB) RunSeq(migration io.Reader, fileType, fileName string) error
break break
} }
sqlInput := RunSQLInput{ sqlInput := RunSQLInput{
SQL: string(body), SQL: string(body),
Source: h.hasuraOpts.Datasource, Source: h.hasuraOpts.Datasource,
} }
if h.config.enableCheckMetadataConsistency { if h.config.enableCheckMetadataConsistency {
@ -288,26 +288,82 @@ func (h *HasuraDB) RunSeq(migration io.Reader, fileType, fileName string) error
return nil return nil
} }
func sendMetadataMigrations(hasuradb *HasuraDB, metadataRequests []interface{}) error { func sendMetadataMigrations(hasuradb *HasuraDB, requests []interface{}) error {
for _, v := range metadataRequests { var metadataRequests []interface{}
var queryRequests []interface{}
isQueryRequest := func(req interface{}) bool {
var isIt = false
type request struct {
Type string `mapstructure:"type"`
Args []interface{} `mapstructure:"args"`
}
var r = new(request)
if err := mapstructure.Decode(req, r); err != nil {
if _, ok := queryTypesMap[r.Type]; ok {
isIt = true
} else {
return isIt
}
}
return isIt
}
for _, v := range requests {
type bulkQuery struct { type bulkQuery struct {
Type string `mapstructure:"type"` Type string `mapstructure:"type"`
Args []interface{} `mapstructure:"args"` Args []interface{} `mapstructure:"args"`
} }
var bulk = new(bulkQuery) var bulk = new(bulkQuery)
if _ = mapstructure.Decode(v, bulk); bulk.Type == "bulk" { if _ = mapstructure.Decode(v, bulk); bulk.Type == "bulk" {
if err := sendMetadataMigrations(hasuradb, bulk.Args); err != nil { queryBulk := HasuraInterfaceBulk{
return err Type: "bulk",
Args: []interface{}{},
} }
// was a bulk query and was already handled above so skip this iteration metadataBulk := HasuraInterfaceBulk{
continue Type: "bulk",
Args: []interface{}{},
}
for _, bulkRequest := range bulk.Args {
if ok := isQueryRequest(v); ok {
queryBulk.Args = append(queryBulk.Args, bulkRequest)
} else {
metadataBulk.Args = append(metadataBulk.Args, bulkRequest)
}
}
metadataRequests = append(metadataRequests, metadataBulk)
queryRequests = append(queryRequests, queryBulk)
} }
resp, body, err := hasuradb.SendMetadataOrQueryRequest(v, nil) if ok := isQueryRequest(v); ok {
queryRequests = append(queryRequests, v)
} else {
metadataRequests = append(metadataRequests, v)
}
}
if len(queryRequests) > 0 {
queryBulk := HasuraInterfaceBulk{
Type: "bulk",
Args: queryRequests,
}
resp, body, err := hasuradb.SendMetadataOrQueryRequest(queryBulk, &client.MetadataOrQueryClientFuncOpts{QueryRequestOpts: &client.QueryRequestOpts{}})
if err != nil { if err != nil {
return err return client.ErrQueryRequestsFailed(err)
} }
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return errors.New(string(body)) return client.ErrQueryRequestsFailed(errors.New(string(body)))
}
}
if len(metadataRequests) > 0 {
metadataBulk := HasuraInterfaceBulk{
Type: "bulk",
Args: metadataRequests,
}
resp, body, err := hasuradb.SendMetadataOrQueryRequest(metadataBulk, &client.MetadataOrQueryClientFuncOpts{MetadataRequestOpts: &client.MetadataRequestOpts{}})
if err != nil {
return client.ErrMetadataRequestsFailed(err)
}
if resp.StatusCode != http.StatusOK {
return client.ErrMetadataRequestsFailed(errors.New(string(body)))
} }
} }
return nil return nil

View File

@ -257,7 +257,9 @@ func (s SettingsStateStoreWithCatalogStateAPI) setDefaults() error {
cliState.Settings = make(map[string]string) cliState.Settings = make(map[string]string)
} }
for _, setting := range s.hasuraDB.settings { for _, setting := range s.hasuraDB.settings {
cliState.Settings[setting.GetName()] = setting.GetDefaultValue() if v, ok := cliState.Settings[setting.GetName()]; !ok || len(v) == 0 {
cliState.Settings[setting.GetName()] = setting.GetDefaultValue()
}
} }
return catalogStateAPI.SetCLICatalogState(s.hasuraDB, *cliState) return catalogStateAPI.SetCLICatalogState(s.hasuraDB, *cliState)
} }

View File

@ -137,6 +137,7 @@ func allowCors() gin.HandlerFunc {
config.AddAllowHeaders("X-Hasura-Allowed-Roles") config.AddAllowHeaders("X-Hasura-Allowed-Roles")
config.AddAllowHeaders("Hasura-Internal-Request-Source") config.AddAllowHeaders("Hasura-Internal-Request-Source")
config.AddAllowMethods("DELETE") config.AddAllowMethods("DELETE")
config.AddAllowHeaders("Hasura-Internal-Request-Source")
config.AllowAllOrigins = true config.AllowAllOrigins = true
config.AllowCredentials = false config.AllowCredentials = false
return cors.New(config) return cors.New(config)

View File

@ -66,10 +66,10 @@ export const delTestTables = () => {
prevStr = 'DROP TABLE Apic_test_table_rsql CASCADE;'; prevStr = 'DROP TABLE Apic_test_table_rsql CASCADE;';
cy.get('textarea').type(prevStr, { force: true }); cy.get('textarea').type(prevStr, { force: true });
cy.wait(1000); cy.wait(1000);
// cy.get(getElementFromAlias('raw-sql-migration-check')).uncheck(); cy.get(getElementFromAlias('raw-sql-migration-check')).uncheck();
cy.get(getElementFromAlias('run-sql')).click(); cy.get(getElementFromAlias('run-sql')).click();
// NOTE: This is only visible, when the console is in CLI mode // NOTE: This is only visible, when the console is in CLI mode
// cy.get(getElementFromAlias('not-migration-confirm')).click(); cy.get(getElementFromAlias('not-migration-confirm')).click();
cy.get(getElementFromAlias('raw-sql-statement-timeout')).type('20', { cy.get(getElementFromAlias('raw-sql-statement-timeout')).type('20', {
force: true, force: true,
}); });

View File

@ -141,6 +141,7 @@ const executeSQL = (isMigration, migrationName, statementTimeout) => (
name: migrationName, name: migrationName,
up: schemaChangesUp, up: schemaChangesUp,
down: schemaChangesDown, down: schemaChangesDown,
datasource: source,
}; };
} }
const options = { const options = {

View File

@ -74,6 +74,7 @@ const makeRequest = (
name: migrationName, name: migrationName,
up: upQuery.args, up: upQuery.args,
down: downQuery.args, down: downQuery.args,
datasource: source,
}; };
const currMigrationMode = getState().main.migrationMode; const currMigrationMode = getState().main.migrationMode;