Skip to content

Commit 81c8553

Browse files
authored
Merge 16d5d09 into 7da87a5
2 parents 7da87a5 + 16d5d09 commit 81c8553

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
@@ -4864,6 +4864,66 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
48644864
session.Close().GetValueSync();
48654865
}
48664866

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

235237
return appConfig;
236238
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ struct TYdbSetupSettings {
7070
FLUENT_SETTING_DEFAULT(bool, CreateSampleTenants, false);
7171
FLUENT_SETTING_DEFAULT(bool, EnableResourcePools, true);
7272
FLUENT_SETTING_DEFAULT(bool, EnableMetadataObjectsOnServerless, true);
73+
FLUENT_SETTING_DEFAULT(bool, EnableExternalDataSourcesOnServerless, true);
7374

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

ydb/core/protos/feature_flags.proto

+1
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,5 @@ message TFeatureFlags {
150150
optional bool EnableOptionalColumnsInColumnShard = 136 [default = false];
151151
optional bool EnablePgSyntax = 139 [default = false];
152152
optional bool EnableMetadataObjectsOnServerless = 141 [default = true];
153+
optional bool EnableExternalDataSourcesOnServerless = 143 [default = true];
153154
}

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)