Skip to content

Commit a888c7b

Browse files
authored
Merge 777f7bb into b852f68
2 parents b852f68 + 777f7bb commit a888c7b

10 files changed

+94
-0
lines changed

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5175,6 +5175,66 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
51755175
session.Close().GetValueSync();
51765176
}
51775177

5178+
Y_UNIT_TEST(DisableExternalDataSourcesOnServerless) {
5179+
auto ydb = NWorkload::TYdbSetupSettings()
5180+
.CreateSampleTenants(true)
5181+
.EnableExternalDataSourcesOnServerless(false)
5182+
.Create();
5183+
5184+
auto checkDisabled = [](const auto& result, NYdb::EStatus status) {
5185+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), status, result.GetIssues().ToString());
5186+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
5187+
};
5188+
5189+
auto checkNotFound = [](const auto& result, NYdb::EStatus status) {
5190+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), status, result.GetIssues().ToString());
5191+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Path does not exist");
5192+
};
5193+
5194+
const auto& createSourceSql = R"(
5195+
CREATE EXTERNAL DATA SOURCE MyExternalDataSource WITH (
5196+
SOURCE_TYPE="ObjectStorage",
5197+
LOCATION="my-bucket",
5198+
AUTH_METHOD="NONE"
5199+
);)";
5200+
5201+
const auto& createTableSql = R"(
5202+
CREATE EXTERNAL TABLE MyExternalTable (
5203+
Key Uint64,
5204+
Value String
5205+
) WITH (
5206+
DATA_SOURCE="MyExternalDataSource",
5207+
LOCATION="/"
5208+
);)";
5209+
5210+
const auto& dropSourceSql = "DROP EXTERNAL DATA SOURCE MyExternalDataSource;";
5211+
5212+
const auto& dropTableSql = "DROP EXTERNAL TABLE MyExternalTable;";
5213+
5214+
auto settings = NWorkload::TQueryRunnerSettings().PoolId("");
5215+
5216+
// Dedicated, enabled
5217+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
5218+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSourceSql, settings));
5219+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createTableSql, settings));
5220+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropTableSql, settings));
5221+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSourceSql, settings));
5222+
5223+
// Shared, enabled
5224+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
5225+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSourceSql, settings));
5226+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createTableSql, settings));
5227+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropTableSql, settings));
5228+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSourceSql, settings));
5229+
5230+
// Serverless, disabled
5231+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
5232+
checkDisabled(ydb->ExecuteQuery(createSourceSql, settings), NYdb::EStatus::GENERIC_ERROR);
5233+
checkDisabled(ydb->ExecuteQuery(createTableSql, settings), NYdb::EStatus::PRECONDITION_FAILED);
5234+
checkNotFound(ydb->ExecuteQuery(dropTableSql, settings), NYdb::EStatus::SCHEME_ERROR);
5235+
checkNotFound(ydb->ExecuteQuery(dropSourceSql, settings), NYdb::EStatus::GENERIC_ERROR);
5236+
}
5237+
51785238
Y_UNIT_TEST(CreateExternalDataSource) {
51795239
NKikimrConfig::TAppConfig appCfg;
51805240
appCfg.MutableQueryServiceConfig()->AddHostnamePatterns("my-bucket");

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

Lines changed: 2 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ struct TYdbSetupSettings {
7171
FLUENT_SETTING_DEFAULT(bool, EnableResourcePools, true);
7272
FLUENT_SETTING_DEFAULT(bool, EnableResourcePoolsOnServerless, false);
7373
FLUENT_SETTING_DEFAULT(bool, EnableMetadataObjectsOnServerless, true);
74+
FLUENT_SETTING_DEFAULT(bool, EnableExternalDataSourcesOnServerless, true);
7475

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

ydb/core/protos/feature_flags.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,5 @@ message TFeatureFlags {
159159
optional bool EnableTieringInColumnShard = 140 [default = false];
160160
optional bool EnableMetadataObjectsOnServerless = 141 [default = true];
161161
optional bool EnableOlapCompression = 142 [default = false];
162+
optional bool EnableExternalDataSourcesOnServerless = 143 [default = true];
162163
}

ydb/core/tx/schemeshard/schemeshard__operation_alter_external_data_source.cpp

Lines changed: 7 additions & 0 deletions
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

Lines changed: 7 additions & 0 deletions
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

Lines changed: 7 additions & 0 deletions
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

Lines changed: 7 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7038,6 +7038,7 @@ void TSchemeShard::ApplyConsoleConfigs(const NKikimrConfig::TFeatureFlags& featu
70387038
EnableTableDatetime64 = featureFlags.GetEnableTableDatetime64();
70397039
EnableResourcePoolsOnServerless = featureFlags.GetEnableResourcePoolsOnServerless();
70407040
EnableVectorIndex = featureFlags.GetEnableVectorIndex();
7041+
EnableExternalDataSourcesOnServerless = featureFlags.GetEnableExternalDataSourcesOnServerless();
70417042
}
70427043

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

ydb/core/tx/schemeshard/schemeshard_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ class TSchemeShard
331331
bool EnableTableDatetime64 = false;
332332
bool EnableResourcePoolsOnServerless = false;
333333
bool EnableVectorIndex = false;
334+
bool EnableExternalDataSourcesOnServerless = false;
334335

335336
TShardDeleter ShardDeleter;
336337

0 commit comments

Comments
 (0)