mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-09-20 15:09:02 +03:00
console and cli: run console in CLI mode for tests, misc CLI fixes (#368)
GitOrigin-RevId: 4563444387a4c9d02b5429729fe30bc87763288f
This commit is contained in:
parent
3f87d9e886
commit
b4fd2e3f9f
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
});
|
});
|
||||||
|
@ -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 = {
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user