Skip to content

Commit

Permalink
[resourcemanager] Parse all node config JSON fields
Browse files Browse the repository at this point in the history
Signed-off-by: Mykhailo Lohvynenko <[email protected]>
  • Loading branch information
mlohvynenko committed Oct 9, 2024
1 parent fc159aa commit 4757b66
Show file tree
Hide file tree
Showing 3 changed files with 509 additions and 26 deletions.
283 changes: 283 additions & 0 deletions src/resourcemanager/resourcemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,282 @@ namespace aos::zephyr::resourcemanager {
* Static
**********************************************************************************************************************/

namespace {

/**
* Device.
*/
struct Device {
const char* name;
const char* hostDevices[aos::cMaxNumHostDevices];
size_t hostDevicesLen;
int sharedCount;
const char* groups[aos::cMaxNumGroups];
size_t groupsLen;
};

/**
* FS mount.
*/
struct FSMount {
const char* destination;
const char* source;
const char* type;
const char* options[aos::cFSMountMaxNumOptions];
size_t optionsLen;
};

/**
* Host.
*/
struct Host {
const char* ip;
const char* hostName;
};

/**
* Resource.
*/
struct Resource {
const char* name = "";
const char* groups[aos::cMaxNumGroups];
size_t groupsLen;
FSMount mounts[aos::cMaxNumFSMounts];
size_t mountsLen;
const char* env[aos::cMaxNumEnvVariables];
size_t envLen;
Host hosts[aos::cMaxNumHosts];
size_t hostsLen;
};

/**
* Node config.
*/
struct NodeConfig {
const char* version = "";
const char* nodeType = "";
Device devices[aos::cMaxNumDevices];
size_t devicesLen;
Resource resources[aos::cMaxNumNodeResources];
size_t resourcesLen;
const char* labels[aos::cMaxNumNodeLabels];
size_t labelsLen;
uint32_t priority = 0;
};

} // namespace

// Device.

static const struct json_obj_descr cDeviceDescr[] = {
JSON_OBJ_DESCR_PRIM(Device, name, JSON_TOK_STRING),
JSON_OBJ_DESCR_ARRAY(Device, hostDevices, aos::cMaxNumHostDevices, hostDevicesLen, JSON_TOK_STRING),
JSON_OBJ_DESCR_PRIM(Device, sharedCount, JSON_TOK_NUMBER),
JSON_OBJ_DESCR_ARRAY(Device, groups, aos::cMaxNumGroups, groupsLen, JSON_TOK_STRING),
};

// FS mount.

static const struct json_obj_descr cFSMountDescr[] = {
JSON_OBJ_DESCR_PRIM(FSMount, destination, JSON_TOK_STRING),
JSON_OBJ_DESCR_PRIM(FSMount, source, JSON_TOK_STRING),
JSON_OBJ_DESCR_PRIM(FSMount, type, JSON_TOK_STRING),
JSON_OBJ_DESCR_ARRAY(FSMount, options, aos::cFSMountMaxNumOptions, optionsLen, JSON_TOK_STRING),
};

// Host.

static const struct json_obj_descr cHostDescr[] = {
JSON_OBJ_DESCR_PRIM(Host, ip, JSON_TOK_STRING),
JSON_OBJ_DESCR_PRIM(Host, hostName, JSON_TOK_STRING),
};

// Resource.

static const struct json_obj_descr cResourceDescr[] = {
JSON_OBJ_DESCR_PRIM(Resource, name, JSON_TOK_STRING),
JSON_OBJ_DESCR_ARRAY(Resource, groups, aos::cMaxNumGroups, groupsLen, JSON_TOK_STRING),
JSON_OBJ_DESCR_OBJ_ARRAY(
Resource, mounts, aos::cMaxNumFSMounts, mountsLen, cFSMountDescr, ARRAY_SIZE(cFSMountDescr)),
JSON_OBJ_DESCR_ARRAY(Resource, env, aos::cMaxNumEnvVariables, envLen, JSON_TOK_STRING),
JSON_OBJ_DESCR_OBJ_ARRAY(Resource, hosts, aos::cMaxNumHosts, hostsLen, cHostDescr, ARRAY_SIZE(cHostDescr)),
};

// Node config.

static const struct json_obj_descr cNodeConfigDescr[] = {
JSON_OBJ_DESCR_PRIM(NodeConfig, version, JSON_TOK_STRING),
JSON_OBJ_DESCR_PRIM(NodeConfig, nodeType, JSON_TOK_STRING),
JSON_OBJ_DESCR_OBJ_ARRAY(
NodeConfig, devices, aos::cMaxNumDevices, devicesLen, cDeviceDescr, ARRAY_SIZE(cDeviceDescr)),
JSON_OBJ_DESCR_OBJ_ARRAY(
NodeConfig, resources, aos::cMaxNumNodeResources, resourcesLen, cResourceDescr, ARRAY_SIZE(cResourceDescr)),
JSON_OBJ_DESCR_ARRAY(NodeConfig, labels, aos::cMaxNumNodeLabels, labelsLen, JSON_TOK_STRING),
JSON_OBJ_DESCR_PRIM(NodeConfig, priority, JSON_TOK_NUMBER),
};

/***********************************************************************************************************************
* Private
**********************************************************************************************************************/

static void FillJSONStruct(const Array<DeviceInfo>& inDevices, NodeConfig& jsonNodeConfig)
{
jsonNodeConfig.devicesLen = inDevices.Size();

for (size_t i = 0; i < inDevices.Size(); ++i) {
const auto& inDevice = inDevices[i];
auto& jsonDevice = jsonNodeConfig.devices[i];

jsonDevice.name = inDevice.mName.CStr();
jsonDevice.sharedCount = inDevice.mSharedCount;
jsonDevice.groupsLen = inDevice.mGroups.Size();
jsonDevice.hostDevicesLen = inDevice.mHostDevices.Size();

for (size_t j = 0; j < inDevice.mGroups.Size(); ++j) {
jsonDevice.groups[j] = inDevice.mGroups[j].CStr();
}

for (size_t j = 0; j < inDevice.mHostDevices.Size(); ++j) {
jsonDevice.hostDevices[j] = inDevice.mHostDevices[j].CStr();
}
}
}

static void FillJSONStruct(const Array<ResourceInfo>& inResources, NodeConfig& jsonNodeConfig)
{
jsonNodeConfig.resourcesLen = inResources.Size();

for (size_t i = 0; i < inResources.Size(); ++i) {
const auto& inResource = inResources[i];
auto& jsonResource = jsonNodeConfig.resources[i];

jsonResource.name = inResource.mName.CStr();
jsonResource.groupsLen = inResource.mGroups.Size();

for (size_t j = 0; j < inResource.mGroups.Size(); ++j) {
jsonResource.groups[j] = inResource.mGroups[j].CStr();
}

jsonResource.mountsLen = inResource.mMounts.Size();

for (size_t j = 0; j < inResource.mMounts.Size(); ++j) {
const auto& inMount = inResource.mMounts[j];
auto& outMount = jsonResource.mounts[j];

outMount.destination = inMount.mDestination.CStr();
outMount.source = inMount.mSource.CStr();
outMount.type = inMount.mType.CStr();
outMount.optionsLen = inMount.mOptions.Size();

for (size_t k = 0; k < inMount.mOptions.Size(); ++k) {
outMount.options[k] = inMount.mOptions[k].CStr();
}
}

jsonResource.envLen = inResource.mEnv.Size();

for (size_t j = 0; j < inResource.mEnv.Size(); ++j) {
jsonResource.env[j] = inResource.mEnv[j].CStr();
}

jsonResource.hostsLen = inResource.mHosts.Size();

for (size_t j = 0; j < inResource.mHosts.Size(); ++j) {
const auto& inHost = inResource.mHosts[j];
auto& outHost = jsonResource.hosts[j];

outHost.ip = inHost.mIP.CStr();
outHost.hostName = inHost.mHostname.CStr();
}
}
}

static Error FillAosStruct(const NodeConfig& in, Array<DeviceInfo>& outDevices)
{
if (auto err = outDevices.Resize(in.devicesLen); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}

for (size_t i = 0; i < in.devicesLen; ++i) {
const auto& inDeviceInfo = in.devices[i];
DeviceInfo& outDeviceInfo = outDevices[i];

outDeviceInfo.mName = inDeviceInfo.name;
outDeviceInfo.mSharedCount = inDeviceInfo.sharedCount;

for (size_t j = 0; j < inDeviceInfo.groupsLen; ++j) {
if (auto err = outDeviceInfo.mGroups.PushBack(inDeviceInfo.groups[j]); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}
}

for (size_t j = 0; j < inDeviceInfo.hostDevicesLen; ++j) {
if (auto err = outDeviceInfo.mHostDevices.PushBack(inDeviceInfo.hostDevices[j]); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}
}
}

return ErrorEnum::eNone;
}

static Error FillAosStruct(const NodeConfig& in, Array<ResourceInfo>& outResources)
{
if (auto err = outResources.Resize(in.resourcesLen); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}

for (size_t i = 0; i < in.resourcesLen; ++i) {
const auto& inResourceInfo = in.resources[i];
ResourceInfo& outResourceInfo = outResources[i];

outResourceInfo.mName = inResourceInfo.name;

for (size_t j = 0; j < inResourceInfo.groupsLen; ++j) {
if (auto err = outResourceInfo.mGroups.PushBack(inResourceInfo.groups[j]); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}
}

if (auto err = outResourceInfo.mMounts.Resize(inResourceInfo.mountsLen); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}

for (size_t i = 0; i < inResourceInfo.mountsLen; ++i) {
const auto& parsedMount = inResourceInfo.mounts[i];

aos::FileSystemMount& mount = outResourceInfo.mMounts[i];

mount.mDestination = parsedMount.destination;
mount.mType = parsedMount.type;
mount.mSource = parsedMount.source;

for (size_t j = 0; j < parsedMount.optionsLen; ++j) {
if (auto err = mount.mOptions.PushBack(parsedMount.options[j]); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}
}
}

for (size_t j = 0; j < inResourceInfo.envLen; ++j) {
if (auto err = outResourceInfo.mEnv.PushBack(inResourceInfo.env[j]); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}
}

if (auto err = outResourceInfo.mHosts.Resize(inResourceInfo.hostsLen); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}

for (size_t i = 0; i < inResourceInfo.hostsLen; ++i) {
outResourceInfo.mHosts[i].mIP = inResourceInfo.hosts[i].ip;
outResourceInfo.mHosts[i].mHostname = inResourceInfo.hosts[i].hostName;
}
}

return ErrorEnum::eNone;
}

/***********************************************************************************************************************
* JSONProvider
**********************************************************************************************************************/
Expand All @@ -48,6 +309,14 @@ Error JSONProvider::DumpNodeConfig(const sm::resourcemanager::NodeConfig& config
jsonNodeConfig->nodeType = config.mNodeConfig.mNodeType.CStr();
jsonNodeConfig->priority = config.mNodeConfig.mPriority;

FillJSONStruct(config.mNodeConfig.mDevices, *jsonNodeConfig);
FillJSONStruct(config.mNodeConfig.mResources, *jsonNodeConfig);

jsonNodeConfig->labelsLen = config.mNodeConfig.mLabels.Size();
for (size_t i = 0; i < config.mNodeConfig.mLabels.Size(); ++i) {
jsonNodeConfig->labels[i] = config.mNodeConfig.mLabels[i].CStr();
}

auto ret = json_obj_encode_buf(
cNodeConfigDescr, ARRAY_SIZE(cNodeConfigDescr), jsonNodeConfig.Get(), json.Get(), json.MaxSize());
if (ret < 0) {
Expand Down Expand Up @@ -81,6 +350,20 @@ Error JSONProvider::ParseNodeConfig(const String& json, sm::resourcemanager::Nod
config.mNodeConfig.mNodeType = parsedNodeConfig->nodeType;
config.mNodeConfig.mPriority = parsedNodeConfig->priority;

if (auto err = FillAosStruct(*parsedNodeConfig, config.mNodeConfig.mDevices); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}

if (auto err = FillAosStruct(*parsedNodeConfig, config.mNodeConfig.mResources); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}

for (size_t i = 0; i < parsedNodeConfig->labelsLen; ++i) {
if (auto err = config.mNodeConfig.mLabels.PushBack(parsedNodeConfig->labels[i]); !err.IsNone()) {
return AOS_ERROR_WRAP(err);
}
}

return ErrorEnum::eNone;
}

Expand Down
8 changes: 3 additions & 5 deletions src/resourcemanager/resourcemanager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,9 @@ class JSONProvider : public sm::resourcemanager::JSONProviderItf {
Error ParseNodeConfig(const String& json, sm::resourcemanager::NodeConfig& config) const override;

private:
static constexpr size_t cJsonMaxContentLen = 1024;

mutable Mutex mMutex;
mutable StaticString<cJsonMaxContentLen> mJSONBuffer;
mutable StaticAllocator<sizeof(NodeConfig)> mAllocator;
mutable Mutex mMutex;
mutable StaticString<aos::sm::resourcemanager::cNodeConfigJSONLen> mJSONBuffer;
mutable StaticAllocator<sizeof(NodeConfig)> mAllocator;
};

/**
Expand Down
Loading

0 comments on commit 4757b66

Please sign in to comment.