Skip to content

Commit 04ee172

Browse files
authored
YQ-3658 added DisableExternalDataSourcesOnServerless feature flag (#9095)
1 parent 5da10d3 commit 04ee172

10 files changed

+94
-0
lines changed

ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -4865,6 +4865,66 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
48654865
session.Close().GetValueSync();
48664866
}
48674867

4868+
Y_UNIT_TEST(DisableExternalDataSourcesOnServerless) {
4869+
auto ydb = NWorkload::TYdbSetupSettings()
4870+
.CreateSampleTenants(true)
4871+
.EnableExternalDataSourcesOnServerless(false)
4872+
.Create();
4873+
4874+
auto checkDisabled = [](const auto& result, NYdb::EStatus status) {
4875+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), status, result.GetIssues().ToString());
4876+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
4877+
};
4878+
4879+
auto checkNotFound = [](const auto& result, NYdb::EStatus status) {
4880+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), status, result.GetIssues().ToString());
4881+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Path does not exist");
4882+
};
4883+
4884+
const auto& createSourceSql = R"(
4885+
CREATE EXTERNAL DATA SOURCE MyExternalDataSource WITH (
4886+
SOURCE_TYPE="ObjectStorage",
4887+
LOCATION="my-bucket",
4888+
AUTH_METHOD="NONE"
4889+
);)";
4890+
4891+
const auto& createTableSql = R"(
4892+
CREATE EXTERNAL TABLE MyExternalTable (
4893+
Key Uint64,
4894+
Value String
4895+
) WITH (
4896+
DATA_SOURCE="MyExternalDataSource",
4897+
LOCATION="/"
4898+
);)";
4899+
4900+
const auto& dropSourceSql = "DROP EXTERNAL DATA SOURCE MyExternalDataSource;";
4901+
4902+
const auto& dropTableSql = "DROP EXTERNAL TABLE MyExternalTable;";
4903+
4904+
auto settings = NWorkload::TQueryRunnerSettings().PoolId("");
4905+
4906+
// Dedicated, enabled
4907+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
4908+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSourceSql, settings));
4909+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createTableSql, settings));
4910+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropTableSql, settings));
4911+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSourceSql, settings));
4912+
4913+
// Shared, enabled
4914+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
4915+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSourceSql, settings));
4916+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createTableSql, settings));
4917+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropTableSql, settings));
4918+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSourceSql, settings));
4919+
4920+
// Serverless, disabled
4921+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
4922+
checkDisabled(ydb->ExecuteQuery(createSourceSql, settings), NYdb::EStatus::GENERIC_ERROR);
4923+
checkDisabled(ydb->ExecuteQuery(createTableSql, settings), NYdb::EStatus::PRECONDITION_FAILED);
4924+
checkNotFound(ydb->ExecuteQuery(dropTableSql, settings), NYdb::EStatus::SCHEME_ERROR);
4925+
checkNotFound(ydb->ExecuteQuery(dropSourceSql, settings), NYdb::EStatus::GENERIC_ERROR);
4926+
}
4927+
48684928
Y_UNIT_TEST(CreateExternalDataSource) {
48694929
NKikimrConfig::TAppConfig appCfg;
48704930
appCfg.MutableQueryServiceConfig()->AddHostnamePatterns("my-bucket");

ydb/core/kqp/workload_service/ut/common/kqp_workload_service_ut_common.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
232232
appConfig.MutableFeatureFlags()->SetEnableResourcePools(Settings_.EnableResourcePools_);
233233
appConfig.MutableFeatureFlags()->SetEnableResourcePoolsOnServerless(Settings_.EnableResourcePoolsOnServerless_);
234234
appConfig.MutableFeatureFlags()->SetEnableMetadataObjectsOnServerless(Settings_.EnableMetadataObjectsOnServerless_);
235+
appConfig.MutableFeatureFlags()->SetEnableExternalDataSourcesOnServerless(Settings_.EnableExternalDataSourcesOnServerless_);
236+
appConfig.MutableFeatureFlags()->SetEnableExternalDataSources(true);
235237
appConfig.MutableFeatureFlags()->SetEnableResourcePoolsCounters(true);
236238

237239
return appConfig;

ydb/core/kqp/workload_service/ut/common/kqp_workload_service_ut_common.h

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ struct TYdbSetupSettings {
7272
FLUENT_SETTING_DEFAULT(bool, EnableResourcePools, true);
7373
FLUENT_SETTING_DEFAULT(bool, EnableResourcePoolsOnServerless, false);
7474
FLUENT_SETTING_DEFAULT(bool, EnableMetadataObjectsOnServerless, true);
75+
FLUENT_SETTING_DEFAULT(bool, EnableExternalDataSourcesOnServerless, true);
7576

7677
// Default pool settings
7778
FLUENT_SETTING_DEFAULT(TString, PoolId, "sample_pool_id");

ydb/core/protos/feature_flags.proto

+1
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,5 @@ message TFeatureFlags {
149149
optional bool EnableResourcePoolsCounters = 135 [default = false];
150150
optional bool EnableOptionalColumnsInColumnShard = 136 [default = false];
151151
optional bool EnableMetadataObjectsOnServerless = 141 [default = true];
152+
optional bool EnableExternalDataSourcesOnServerless = 143 [default = true];
152153
}

ydb/core/tx/schemeshard/schemeshard__operation_alter_external_data_source.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,13 @@ class TAlterExternalDataSource : public TSubOperation {
213213
static_cast<ui64>(OperationId.GetTxId()),
214214
static_cast<ui64>(ssId));
215215

216+
if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
217+
if (!context.SS->EnableExternalDataSourcesOnServerless) {
218+
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
219+
return result;
220+
}
221+
}
222+
216223
const TPath parentPath = TPath::Resolve(parentPathStr, context.SS);
217224
RETURN_RESULT_UNLESS(NExternalDataSource::IsParentPathValid(
218225
result, parentPath, Transaction, /* isCreate */ false));

ydb/core/tx/schemeshard/schemeshard__operation_alter_external_table.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,13 @@ class TAlterExternalTable: public TSubOperation {
308308
static_cast<ui64>(OperationId.GetTxId()),
309309
static_cast<ui64>(ssId));
310310

311+
if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
312+
if (!context.SS->EnableExternalDataSourcesOnServerless) {
313+
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
314+
return result;
315+
}
316+
}
317+
311318
const auto parentPath = TPath::Resolve(parentPathStr, context.SS);
312319
RETURN_RESULT_UNLESS(NExternalTable::IsParentPathValid(result, parentPath));
313320

ydb/core/tx/schemeshard/schemeshard__operation_create_external_data_source.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,13 @@ class TCreateExternalDataSource : public TSubOperation {
239239
static_cast<ui64>(OperationId.GetTxId()),
240240
static_cast<ui64>(ssId));
241241

242+
if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
243+
if (!context.SS->EnableExternalDataSourcesOnServerless) {
244+
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
245+
return result;
246+
}
247+
}
248+
242249
const TPath parentPath = TPath::Resolve(parentPathStr, context.SS);
243250
RETURN_RESULT_UNLESS(NExternalDataSource::IsParentPathValid(
244251
result, parentPath, Transaction, /* isCreate */ true));

ydb/core/tx/schemeshard/schemeshard__operation_create_external_table.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,13 @@ class TCreateExternalTable: public TSubOperation {
308308
static_cast<ui64>(OperationId.GetTxId()),
309309
static_cast<ui64>(ssId));
310310

311+
if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
312+
if (!context.SS->EnableExternalDataSourcesOnServerless) {
313+
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
314+
return result;
315+
}
316+
}
317+
311318
const auto parentPath = TPath::Resolve(parentPathStr, context.SS);
312319
RETURN_RESULT_UNLESS(NExternalTable::IsParentPathValid(result, parentPath));
313320

ydb/core/tx/schemeshard/schemeshard_impl.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -7013,6 +7013,7 @@ void TSchemeShard::ApplyConsoleConfigs(const NKikimrConfig::TFeatureFlags& featu
70137013
EnableReplaceIfExistsForExternalEntities = featureFlags.GetEnableReplaceIfExistsForExternalEntities();
70147014
EnableTableDatetime64 = featureFlags.GetEnableTableDatetime64();
70157015
EnableResourcePoolsOnServerless = featureFlags.GetEnableResourcePoolsOnServerless();
7016+
EnableExternalDataSourcesOnServerless = featureFlags.GetEnableExternalDataSourcesOnServerless();
70167017
}
70177018

70187019
void TSchemeShard::ConfigureStatsBatching(const NKikimrConfig::TSchemeShardConfig& config, const TActorContext& ctx) {

ydb/core/tx/schemeshard/schemeshard_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ class TSchemeShard
330330
bool EnableTempTables = false;
331331
bool EnableTableDatetime64 = false;
332332
bool EnableResourcePoolsOnServerless = false;
333+
bool EnableExternalDataSourcesOnServerless = false;
333334

334335
TShardDeleter ShardDeleter;
335336

0 commit comments

Comments
 (0)