mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-14 09:58:50 +08:00
Merge branch 'feature-tenant-groups' into feature-metacluster
This commit is contained in:
commit
b308aa6604
@ -350,8 +350,8 @@ ACTOR Future<bool> getTenantCommandActor(Reference<IDatabase> db, std::vector<St
|
||||
|
||||
int64_t id;
|
||||
std::string prefix;
|
||||
std::string tenantGroup;
|
||||
std::string tenantState;
|
||||
std::string tenantGroup;
|
||||
std::string assignedCluster;
|
||||
|
||||
doc.get("id", id);
|
||||
@ -363,18 +363,18 @@ ACTOR Future<bool> getTenantCommandActor(Reference<IDatabase> db, std::vector<St
|
||||
}
|
||||
|
||||
doc.get("tenant_state", tenantState);
|
||||
bool hasAssignedCluster = doc.tryGet("assigned_cluster", assignedCluster);
|
||||
bool hasTenantGroup = doc.tryGet("tenant_group.printable", tenantGroup);
|
||||
bool hasAssignedCluster = doc.tryGet("assigned_cluster", assignedCluster);
|
||||
|
||||
fmt::print(" id: {}\n", id);
|
||||
fmt::print(" prefix: {}\n", printable(prefix).c_str());
|
||||
fmt::print(" tenant state: {}\n", printable(tenantState).c_str());
|
||||
if (hasAssignedCluster) {
|
||||
fmt::print(" assigned cluster: {}\n", printable(assignedCluster).c_str());
|
||||
}
|
||||
if (hasTenantGroup) {
|
||||
fmt::print(" tenant group: {}\n", tenantGroup.c_str());
|
||||
}
|
||||
if (hasAssignedCluster) {
|
||||
fmt::print(" assigned cluster: {}\n", printable(assignedCluster).c_str());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} catch (Error& e) {
|
||||
|
@ -74,8 +74,8 @@ TenantMapEntry::TenantMapEntry() {}
|
||||
TenantMapEntry::TenantMapEntry(int64_t id, TenantState tenantState) : tenantState(tenantState) {
|
||||
setId(id);
|
||||
}
|
||||
TenantMapEntry::TenantMapEntry(int64_t id, Optional<TenantGroupName> tenantGroup, TenantState tenantState)
|
||||
: tenantGroup(tenantGroup), tenantState(tenantState) {
|
||||
TenantMapEntry::TenantMapEntry(int64_t id, TenantState tenantState, Optional<TenantGroupName> tenantGroup)
|
||||
: tenantState(tenantState), tenantGroup(tenantGroup) {
|
||||
setId(id);
|
||||
}
|
||||
|
||||
@ -131,6 +131,17 @@ std::string TenantMapEntry::toJson(int apiVersion) const {
|
||||
tenantEntry["tenant_group"] = tenantGroupObject;
|
||||
}
|
||||
|
||||
if (tenantGroup.present()) {
|
||||
json_spirit::mObject tenantGroupObject;
|
||||
std::string encodedTenantGroup = base64::encoder::from_string(tenantGroup.get().toString());
|
||||
// Remove trailing newline
|
||||
encodedTenantGroup.resize(encodedTenantGroup.size() - 1);
|
||||
|
||||
tenantGroupObject["base64"] = encodedTenantGroup;
|
||||
tenantGroupObject["printable"] = printable(tenantGroup.get());
|
||||
tenantEntry["tenant_group"] = tenantGroupObject;
|
||||
}
|
||||
|
||||
return json_spirit::write_string(json_spirit::mValue(tenantEntry));
|
||||
}
|
||||
|
||||
|
@ -46,8 +46,8 @@ struct TenantMapEntry {
|
||||
|
||||
int64_t id = -1;
|
||||
Key prefix;
|
||||
Optional<TenantGroupName> tenantGroup;
|
||||
TenantState tenantState = TenantState::READY;
|
||||
Optional<TenantGroupName> tenantGroup;
|
||||
Optional<ClusterName> assignedCluster;
|
||||
int64_t configurationSequenceNum = 0;
|
||||
|
||||
@ -55,7 +55,7 @@ struct TenantMapEntry {
|
||||
|
||||
TenantMapEntry();
|
||||
TenantMapEntry(int64_t id, TenantState tenantState);
|
||||
TenantMapEntry(int64_t id, Optional<TenantGroupName> tenantGroup, TenantState tenantState);
|
||||
TenantMapEntry(int64_t id, TenantState tenantState, Optional<TenantGroupName> tenantGroup);
|
||||
|
||||
void setId(int64_t id);
|
||||
|
||||
@ -64,7 +64,7 @@ struct TenantMapEntry {
|
||||
|
||||
std::string toJson(int apiVersion) const;
|
||||
|
||||
Value encode() const { return ObjectWriter::toValue(*this, IncludeVersion(ProtocolVersion::withTenantGroups())); }
|
||||
Value encode() const { return ObjectWriter::toValue(*this, IncludeVersion(ProtocolVersion::withTenants())); }
|
||||
|
||||
static TenantMapEntry decode(ValueRef const& value) {
|
||||
TenantMapEntry entry;
|
||||
@ -75,7 +75,7 @@ struct TenantMapEntry {
|
||||
|
||||
template <class Ar>
|
||||
void serialize(Ar& ar) {
|
||||
serializer(ar, id, tenantGroup, tenantState, assignedCluster, configurationSequenceNum);
|
||||
serializer(ar, id, tenantState, tenantGroup, assignedCluster, configurationSequenceNum);
|
||||
if constexpr (Ar::isDeserializing) {
|
||||
if (id >= 0) {
|
||||
prefix = idToPrefix(id);
|
||||
@ -93,7 +93,7 @@ struct TenantGroupEntry {
|
||||
TenantGroupEntry() = default;
|
||||
TenantGroupEntry(Optional<ClusterName> assignedCluster) : assignedCluster(assignedCluster) {}
|
||||
|
||||
Value encode() { return ObjectWriter::toValue(*this, IncludeVersion(ProtocolVersion::withMetacluster())); }
|
||||
Value encode() { return ObjectWriter::toValue(*this, IncludeVersion(ProtocolVersion::withTenants())); }
|
||||
static TenantGroupEntry decode(ValueRef const& value) {
|
||||
TenantGroupEntry entry;
|
||||
ObjectReader reader(value.begin(), IncludeVersion());
|
||||
|
@ -268,8 +268,8 @@ struct TenantManagementWorkload : TestWorkload {
|
||||
wait(tr->commit());
|
||||
} else if (operationType == OperationType::MANAGEMENT_DATABASE) {
|
||||
ASSERT(tenantsToCreate.size() == 1);
|
||||
Optional<TenantMapEntry> result = wait(TenantAPI::createTenant(
|
||||
self->dataDb.getReference(), tenantsToCreate.begin()->first, tenantsToCreate.begin()->second));
|
||||
wait(success(TenantAPI::createTenant(
|
||||
self->dataDb.getReference(), tenantsToCreate.begin()->first, tenantsToCreate.begin()->second)));
|
||||
} else if (operationType == OperationType::MANAGEMENT_TRANSACTION) {
|
||||
tr->setOption(FDBTransactionOptions::ACCESS_SYSTEM_KEYS);
|
||||
int64_t _nextId = wait(TenantAPI::getNextTenantId(tr));
|
||||
@ -802,9 +802,9 @@ struct TenantManagementWorkload : TestWorkload {
|
||||
std::string base64Prefix;
|
||||
std::string printablePrefix;
|
||||
std::string tenantStateStr;
|
||||
std::string assignedClusterStr;
|
||||
std::string base64TenantGroup;
|
||||
std::string printableTenantGroup;
|
||||
std::string assignedClusterStr;
|
||||
|
||||
jsonDoc.get("id", id);
|
||||
jsonDoc.get("prefix.base64", base64Prefix);
|
||||
@ -815,11 +815,6 @@ struct TenantManagementWorkload : TestWorkload {
|
||||
|
||||
jsonDoc.get("tenant_state", tenantStateStr);
|
||||
|
||||
Optional<ClusterName> assignedCluster;
|
||||
if (jsonDoc.tryGet("assigned_cluster", assignedClusterStr)) {
|
||||
assignedCluster = ClusterNameRef(assignedClusterStr);
|
||||
}
|
||||
|
||||
Optional<TenantGroupName> tenantGroup;
|
||||
if (jsonDoc.tryGet("tenant_group.base64", base64TenantGroup)) {
|
||||
jsonDoc.get("tenant_group.printable", printableTenantGroup);
|
||||
@ -828,7 +823,12 @@ struct TenantManagementWorkload : TestWorkload {
|
||||
tenantGroup = TenantGroupNameRef(tenantGroupStr);
|
||||
}
|
||||
|
||||
TenantMapEntry entry(id, tenantGroup, TenantMapEntry::stringToTenantState(tenantStateStr));
|
||||
Optional<ClusterName> assignedCluster;
|
||||
if (jsonDoc.tryGet("assigned_cluster", assignedClusterStr)) {
|
||||
assignedCluster = ClusterNameRef(assignedClusterStr);
|
||||
}
|
||||
|
||||
TenantMapEntry entry(id, TenantMapEntry::stringToTenantState(tenantStateStr), tenantGroup);
|
||||
ASSERT(entry.prefix == prefix);
|
||||
return entry;
|
||||
}
|
||||
@ -896,6 +896,7 @@ struct TenantManagementWorkload : TestWorkload {
|
||||
try {
|
||||
retry = true;
|
||||
wait(tr->onError(e));
|
||||
retry = true;
|
||||
} catch (Error& e) {
|
||||
error = e;
|
||||
retry = false;
|
||||
@ -1185,8 +1186,8 @@ struct TenantManagementWorkload : TestWorkload {
|
||||
ASSERT(!hasInvalidOption);
|
||||
ASSERT(!hasSystemTenantGroup);
|
||||
ASSERT(!specialKeysUseInvalidTuple);
|
||||
auto itr = self->createdTenants.find(tenant);
|
||||
|
||||
auto itr = self->createdTenants.find(tenant);
|
||||
if (itr->second.tenantGroup.present()) {
|
||||
auto tenantGroupItr = self->createdTenantGroups.find(itr->second.tenantGroup.get());
|
||||
ASSERT(tenantGroupItr != self->createdTenantGroups.end());
|
||||
|
@ -234,8 +234,8 @@ ERROR( tenants_disabled, 2136, "Tenants have been disabled in the cluster" )
|
||||
ERROR( unknown_tenant, 2137, "Tenant is not available from this server" )
|
||||
ERROR( illegal_tenant_access, 2138, "Illegal tenant access" )
|
||||
ERROR( invalid_tenant_group_name, 2139, "Tenant group name cannot begin with \\xff" )
|
||||
ERROR( tenant_removed, 2140, "The tenant was removed" )
|
||||
ERROR( invalid_tenant_configuration, 2141, "Tenant configuration is invalid" )
|
||||
ERROR( invalid_tenant_configuration, 2140, "Tenant configuration is invalid" )
|
||||
ERROR( tenant_removed, 2141, "The tenant was removed" )
|
||||
ERROR( invalid_tenant_state, 2142, "Operation cannot be applied to tenant in its current state" )
|
||||
|
||||
ERROR( invalid_cluster_name, 2150, "Data cluster name cannot begin with \\xff" )
|
||||
|
Loading…
x
Reference in New Issue
Block a user