Skip to content

Commit 085cd3d

Browse files
authored
YQ WM added unit tests for sls disable (#8687)
1 parent 5ef326b commit 085cd3d

File tree

8 files changed

+273
-6
lines changed

8 files changed

+273
-6
lines changed

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

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <ydb/core/kqp/gateway/behaviour/resource_pool_classifier/fetcher.h>
22
#include <ydb/core/kqp/ut/common/kqp_ut_common.h>
33
#include <ydb/core/kqp/ut/common/columnshard.h>
4+
#include <ydb/core/kqp/workload_service/ut/common/kqp_workload_service_ut_common.h>
45
#include <ydb/core/tx/columnshard/hooks/testing/controller.h>
56
#include <ydb/core/tx/columnshard/test_helper/controllers.h>
67
#include <ydb/core/formats/arrow/arrow_helpers.h>
@@ -6552,6 +6553,57 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
65526553
"Path does not exist");
65536554
}
65546555

6556+
Y_UNIT_TEST(DisableResourcePoolsOnServerless) {
6557+
auto ydb = NWorkload::TYdbSetupSettings()
6558+
.CreateSampleTenants(true)
6559+
.EnableResourcePoolsOnServerless(false)
6560+
.Create();
6561+
6562+
auto checkDisabled = [](const auto& result) {
6563+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6564+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Resource pools are disabled for serverless domains. Please contact your system administrator to enable it");
6565+
};
6566+
6567+
auto checkNotFound = [](const auto& result) {
6568+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6569+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Path does not exist");
6570+
};
6571+
6572+
const auto& createSql = R"(
6573+
CREATE RESOURCE POOL MyResourcePool WITH (
6574+
CONCURRENT_QUERY_LIMIT=20,
6575+
QUEUE_SIZE=1000
6576+
);)";
6577+
6578+
const auto& alterSql = R"(
6579+
ALTER RESOURCE POOL MyResourcePool
6580+
SET (CONCURRENT_QUERY_LIMIT = 30, QUEUE_SIZE = 100),
6581+
RESET (QUERY_MEMORY_LIMIT_PERCENT_PER_NODE);
6582+
)";
6583+
6584+
const auto& dropSql = "DROP RESOURCE POOL MyResourcePool;";
6585+
6586+
auto settings = NWorkload::TQueryRunnerSettings().PoolId("");
6587+
6588+
// Dedicated, enabled
6589+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
6590+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6591+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6592+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6593+
6594+
// Shared, enabled
6595+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
6596+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6597+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6598+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6599+
6600+
// Serverless, disabled
6601+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
6602+
checkDisabled(ydb->ExecuteQuery(createSql, settings));
6603+
checkNotFound(ydb->ExecuteQuery(alterSql, settings));
6604+
checkNotFound(ydb->ExecuteQuery(dropSql, settings));
6605+
}
6606+
65556607
Y_UNIT_TEST(ResourcePoolsValidation) {
65566608
NKikimrConfig::TAppConfig config;
65576609
config.MutableFeatureFlags()->SetEnableResourcePools(true);
@@ -6821,6 +6873,57 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
68216873
"Classifier with name MyResourcePoolClassifier not found in database /Root");
68226874
}
68236875

6876+
Y_UNIT_TEST(DisableResourcePoolClassifiersOnServerless) {
6877+
auto ydb = NWorkload::TYdbSetupSettings()
6878+
.CreateSampleTenants(true)
6879+
.EnableResourcePoolsOnServerless(false)
6880+
.Create();
6881+
6882+
auto checkDisabled = [](const auto& result) {
6883+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6884+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Resource pool classifiers are disabled for serverless domains. Please contact your system administrator to enable it");
6885+
};
6886+
6887+
auto checkNotFound = [](const auto& result) {
6888+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6889+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Classifier with name MyResourcePoolClassifier not found in database");
6890+
};
6891+
6892+
const auto& createSql = R"(
6893+
CREATE RESOURCE POOL CLASSIFIER MyResourcePoolClassifier WITH (
6894+
RANK=20,
6895+
RESOURCE_POOL="test_pool"
6896+
);)";
6897+
6898+
const auto& alterSql = R"(
6899+
ALTER RESOURCE POOL CLASSIFIER MyResourcePoolClassifier
6900+
SET (RANK = 1, MEMBERNAME = "test@user"),
6901+
RESET (RESOURCE_POOL);
6902+
)";
6903+
6904+
const auto& dropSql = "DROP RESOURCE POOL CLASSIFIER MyResourcePoolClassifier;";
6905+
6906+
auto settings = NWorkload::TQueryRunnerSettings().PoolId("");
6907+
6908+
// Dedicated, enabled
6909+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
6910+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6911+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6912+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6913+
6914+
// Shared, enabled
6915+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
6916+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6917+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6918+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6919+
6920+
// Serverless, disabled
6921+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
6922+
checkDisabled(ydb->ExecuteQuery(createSql, settings));
6923+
checkDisabled(ydb->ExecuteQuery(alterSql, settings));
6924+
checkNotFound(ydb->ExecuteQuery(dropSql, settings));
6925+
}
6926+
68246927
Y_UNIT_TEST(ResourcePoolClassifiersValidation) {
68256928
NKikimrConfig::TAppConfig config;
68266929
config.MutableFeatureFlags()->SetEnableResourcePools(true);

ydb/core/kqp/ut/scheme/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ PEERDIR(
2222
library/cpp/threading/local_executor
2323
ydb/core/kqp
2424
ydb/core/kqp/ut/common
25+
ydb/core/kqp/workload_service/ut/common
2526
ydb/core/tx/columnshard/hooks/testing
2627
ydb/library/yql/sql/pg
2728
ydb/library/yql/parser/pg_wrapper

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

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
230230
TAppConfig GetAppConfig() const {
231231
TAppConfig appConfig;
232232
appConfig.MutableFeatureFlags()->SetEnableResourcePools(Settings_.EnableResourcePools_);
233+
appConfig.MutableFeatureFlags()->SetEnableResourcePoolsOnServerless(Settings_.EnableResourcePoolsOnServerless_);
233234
appConfig.MutableFeatureFlags()->SetEnableResourcePoolsCounters(true);
234235

235236
return appConfig;
@@ -238,7 +239,7 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
238239
void SetLoggerSettings(TServerSettings& serverSettings) const {
239240
auto loggerInitializer = [](TTestActorRuntime& runtime) {
240241
runtime.SetLogPriority(NKikimrServices::KQP_WORKLOAD_SERVICE, NLog::EPriority::PRI_TRACE);
241-
runtime.SetLogPriority(NKikimrServices::KQP_SESSION, NLog::EPriority::PRI_DEBUG);
242+
runtime.SetLogPriority(NKikimrServices::KQP_SESSION, NLog::EPriority::PRI_TRACE);
242243
};
243244

244245
serverSettings.SetLoggerInitializer(loggerInitializer);
@@ -255,16 +256,50 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
255256
.SetAppConfig(appConfig)
256257
.SetFeatureFlags(appConfig.GetFeatureFlags());
257258

259+
if (Settings_.CreateSampleTenants_) {
260+
serverSettings
261+
.SetDynamicNodeCount(2)
262+
.AddStoragePoolType(Settings_.GetDedicatedTenantName())
263+
.AddStoragePoolType(Settings_.GetSharedTenantName());
264+
}
265+
258266
SetLoggerSettings(serverSettings);
259267

260268
return serverSettings;
261269
}
262270

271+
void SetupResourcesTenant(Ydb::Cms::CreateDatabaseRequest& request, Ydb::Cms::StorageUnits* storage, const TString& name) {
272+
request.set_path(name);
273+
storage->set_unit_kind(name);
274+
storage->set_count(1);
275+
}
276+
277+
void CreateTenants() {
278+
{ // Dedicated
279+
Ydb::Cms::CreateDatabaseRequest request;
280+
SetupResourcesTenant(request, request.mutable_resources()->add_storage_units(), Settings_.GetDedicatedTenantName());
281+
Tenants_->CreateTenant(std::move(request));
282+
}
283+
284+
{ // Shared
285+
Ydb::Cms::CreateDatabaseRequest request;
286+
SetupResourcesTenant(request, request.mutable_shared_resources()->add_storage_units(), Settings_.GetSharedTenantName());
287+
Tenants_->CreateTenant(std::move(request));
288+
}
289+
290+
{ // Serverless
291+
Ydb::Cms::CreateDatabaseRequest request;
292+
request.set_path(Settings_.GetServerlessTenantName());
293+
request.mutable_serverless_resources()->set_shared_database_path(Settings_.GetSharedTenantName());
294+
Tenants_->CreateTenant(std::move(request));
295+
}
296+
}
297+
263298
void InitializeServer() {
264299
ui32 grpcPort = PortManager_.GetPort();
265300
TServerSettings serverSettings = GetServerSettings(grpcPort);
266301

267-
Server_ = std::make_unique<TServer>(serverSettings);
302+
Server_ = MakeIntrusive<TServer>(serverSettings);
268303
Server_->EnableGRpc(grpcPort);
269304
GetRuntime()->SetDispatchTimeout(FUTURE_WAIT_TIMEOUT);
270305

@@ -277,10 +312,15 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
277312

278313
TableClient_ = std::make_unique<NYdb::NTable::TTableClient>(*YdbDriver_, NYdb::NTable::TClientSettings().AuthToken("user@" BUILTIN_SYSTEM_DOMAIN));
279314
TableClientSession_ = std::make_unique<NYdb::NTable::TSession>(TableClient_->CreateSession().GetValueSync().GetSession());
315+
316+
Tenants_ = std::make_unique<TTenants>(Server_);
317+
if (Settings_.CreateSampleTenants_) {
318+
CreateTenants();
319+
}
280320
}
281321

282322
void CreateSamplePool() const {
283-
if (!Settings_.EnableResourcePools_) {
323+
if (!Settings_.EnableResourcePools_ || Settings_.CreateSampleTenants_) {
284324
return;
285325
}
286326

@@ -483,7 +523,7 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
483523
request->SetQuery(query);
484524
request->SetType(NKikimrKqp::QUERY_TYPE_SQL_GENERIC_QUERY);
485525
request->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE);
486-
request->SetDatabase(Settings_.DomainName_);
526+
request->SetDatabase(settings.Database_ ? settings.Database_ : Settings_.DomainName_);
487527
request->SetPoolId(*settings.PoolId_);
488528

489529
return event;
@@ -525,9 +565,10 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
525565
const TYdbSetupSettings Settings_;
526566

527567
TPortManager PortManager_;
528-
std::unique_ptr<TServer> Server_;
568+
TServer::TPtr Server_;
529569
std::unique_ptr<TClient> Client_;
530570
std::unique_ptr<TDriver> YdbDriver_;
571+
std::unique_ptr<TTenants> Tenants_;
531572

532573
std::unique_ptr<NYdb::NTable::TTableClient> TableClient_;
533574
std::unique_ptr<NYdb::NTable::TSession> TableClientSession_;
@@ -586,6 +627,18 @@ TIntrusivePtr<IYdbSetup> TYdbSetupSettings::Create() const {
586627
return MakeIntrusive<TWorkloadServiceYdbSetup>(*this);
587628
}
588629

630+
TString TYdbSetupSettings::GetDedicatedTenantName() const {
631+
return TStringBuilder() << CanonizePath(DomainName_) << "/test-dedicated";
632+
}
633+
634+
TString TYdbSetupSettings::GetSharedTenantName() const {
635+
return TStringBuilder() << CanonizePath(DomainName_) << "/test-shared";
636+
}
637+
638+
TString TYdbSetupSettings::GetServerlessTenantName() const {
639+
return TStringBuilder() << CanonizePath(DomainName_) << "/test-serverless";
640+
}
641+
589642
//// IYdbSetup
590643

591644
void IYdbSetup::WaitFor(TDuration timeout, TString description, std::function<bool(TString&)> callback) {

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct TQueryRunnerSettings {
2626
FLUENT_SETTING_DEFAULT(ui32, NodeIndex, 0);
2727
FLUENT_SETTING_DEFAULT(std::optional<TString>, PoolId, std::nullopt);
2828
FLUENT_SETTING_DEFAULT(TString, UserSID, "user@" BUILTIN_SYSTEM_DOMAIN);
29+
FLUENT_SETTING_DEFAULT(TString, Database, "");
2930

3031
// Runner settings
3132
FLUENT_SETTING_DEFAULT(bool, HangUpDuringExecution, false);
@@ -66,7 +67,9 @@ struct TYdbSetupSettings {
6667
// Cluster settings
6768
FLUENT_SETTING_DEFAULT(ui32, NodeCount, 1);
6869
FLUENT_SETTING_DEFAULT(TString, DomainName, "Root");
70+
FLUENT_SETTING_DEFAULT(bool, CreateSampleTenants, false);
6971
FLUENT_SETTING_DEFAULT(bool, EnableResourcePools, true);
72+
FLUENT_SETTING_DEFAULT(bool, EnableResourcePoolsOnServerless, false);
7073

7174
// Default pool settings
7275
FLUENT_SETTING_DEFAULT(TString, PoolId, "sample_pool_id");
@@ -78,6 +81,10 @@ struct TYdbSetupSettings {
7881

7982
NResourcePool::TPoolSettings GetDefaultPoolSettings() const;
8083
TIntrusivePtr<IYdbSetup> Create() const;
84+
85+
TString GetDedicatedTenantName() const;
86+
TString GetSharedTenantName() const;
87+
TString GetServerlessTenantName() const;
8188
};
8289

8390
class IYdbSetup : public TThrRefBase {
@@ -127,6 +134,12 @@ struct TSampleQueries {
127134
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Request timeout exceeded, cancelling after");
128135
}
129136

137+
template <typename TResult>
138+
static void CheckNotFound(const TResult& result, const TString& poolId) {
139+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::NOT_FOUND, result.GetIssues().ToString());
140+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), TStringBuilder() << "Resource pool " << poolId << " not found or you don't have access permissions");
141+
}
142+
130143
struct TSelect42 {
131144
static constexpr char Query[] = "SELECT 42;";
132145

ydb/core/kqp/workload_service/ut/kqp_workload_service_ut.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <ydb/core/base/appdata_fwd.h>
2+
#include <ydb/core/base/path.h>
23

34
#include <ydb/core/kqp/workload_service/ut/common/kqp_workload_service_ut_common.h>
45

@@ -47,6 +48,56 @@ Y_UNIT_TEST_SUITE(KqpWorkloadService) {
4748
TSampleQueries::TSelect42::CheckResult(ydb->ExecuteQuery(TSampleQueries::TSelect42::Query, TQueryRunnerSettings().PoolId("another_pool_id")));
4849
}
4950

51+
Y_UNIT_TEST(WorkloadServiceDisabledByFeatureFlagOnServerless) {
52+
auto ydb = TYdbSetupSettings()
53+
.CreateSampleTenants(true)
54+
.EnableResourcePoolsOnServerless(false)
55+
.Create();
56+
57+
const TString& poolId = "another_pool_id";
58+
auto settings = TQueryRunnerSettings().PoolId(poolId);
59+
60+
// Dedicated, enabled
61+
TSampleQueries::CheckNotFound(ydb->ExecuteQuery(
62+
TSampleQueries::TSelect42::Query,
63+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1)
64+
), poolId);
65+
66+
// Shared, enabled
67+
TSampleQueries::CheckNotFound(ydb->ExecuteQuery(
68+
TSampleQueries::TSelect42::Query,
69+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2)
70+
), poolId);
71+
72+
// Serverless, disabled
73+
TSampleQueries::TSelect42::CheckResult(ydb->ExecuteQuery(
74+
TSampleQueries::TSelect42::Query,
75+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2)
76+
));
77+
}
78+
79+
Y_UNIT_TEST(WorkloadServiceDisabledByInvalidDatabasePath) {
80+
auto ydb = TYdbSetupSettings().Create();
81+
82+
const TString& poolId = "another_pool_id";
83+
auto settings = TQueryRunnerSettings().PoolId(poolId);
84+
85+
TSampleQueries::CheckNotFound(ydb->ExecuteQuery(TSampleQueries::TSelect42::Query, settings), poolId);
86+
87+
const TString& tabmleName = "sub_path";
88+
ydb->ExecuteSchemeQuery(TStringBuilder() << R"(
89+
CREATE TABLE )" << tabmleName << R"( (
90+
Key Int32,
91+
PRIMARY KEY (Key)
92+
);
93+
)");
94+
95+
TSampleQueries::TSelect42::CheckResult(ydb->ExecuteQuery(
96+
TSampleQueries::TSelect42::Query,
97+
settings.Database(TStringBuilder() << CanonizePath(ydb->GetSettings().DomainName_) << "/" << tabmleName)
98+
));
99+
}
100+
50101
TQueryRunnerResultAsync StartQueueSizeCheckRequests(TIntrusivePtr<IYdbSetup> ydb, const TQueryRunnerSettings& settings) {
51102
// One of these requests should be rejected by QueueSize
52103
auto firstRequest = ydb->ExecuteQueryAsync(TSampleQueries::TSelect42::Query, settings);

0 commit comments

Comments
 (0)