updates to grpc to provide a consistent config response, mapping config ids to ConfigOptions

This commit is contained in:
Blake Harnden 2019-10-22 09:57:41 -07:00
parent 233ca92fd2
commit 0a689a3e96
4 changed files with 109 additions and 84 deletions

View file

@ -194,7 +194,7 @@ class CoreGrpcClient(object):
def get_session_options(self, session_id): def get_session_options(self, session_id):
""" """
Retrieve session options. Retrieve session options as a dict with id mapping.
:param int session_id: id of session :param int session_id: id of session
:return: response with a list of configuration groups :return: response with a list of configuration groups
@ -204,6 +204,18 @@ class CoreGrpcClient(object):
request = core_pb2.GetSessionOptionsRequest(session_id=session_id) request = core_pb2.GetSessionOptionsRequest(session_id=session_id)
return self.stub.GetSessionOptions(request) return self.stub.GetSessionOptions(request)
def get_session_options_group(self, session_id):
"""
Retrieve session options in a group list.
:param int session_id: id of session
:return: response with a list of configuration groups
:rtype: core_pb2.GetSessionOptionsGroupResponse
:raises grpc.RpcError: when session doesn't exist
"""
request = core_pb2.GetSessionOptionsGroupRequest(session_id=session_id)
return self.stub.GetSessionOptionsGroup(request)
def set_session_options(self, session_id, config): def set_session_options(self, session_id, config):
""" """
Set options for a session. Set options for a session.

View file

@ -46,38 +46,33 @@ def convert_value(value):
return value return value
def get_config_groups(config, configurable_options): def get_config_options(config, configurable_options):
""" """
Retrieve configuration groups in a form that is used by the grpc server Retrieve configuration options in a form that is used by the grpc server.
:param core.config.Configuration config: configuration :param dict config: configuration
:param core.config.ConfigurableOptions configurable_options: configurable options :param core.config.ConfigurableOptions configurable_options: configurable options
:return: list of configuration groups :return: mapping of configuration ids to configuration options
:rtype: [core.api.grpc.core_pb2.ConfigGroup] :rtype: dict[str,core.api.grpc.core_pb2.ConfigOption]
""" """
groups = [] results = {}
config_options = []
for configuration in configurable_options.configurations(): for configuration in configurable_options.configurations():
value = config[configuration.id] value = config[configuration.id]
config_option = core_pb2.ConfigOption() config_option = core_pb2.ConfigOption(
config_option.label = configuration.label label=configuration.label,
config_option.name = configuration.id name=configuration.id,
config_option.value = value value=value,
config_option.type = configuration.type.value type=configuration.type.value,
config_option.select.extend(configuration.options) select=configuration.options,
config_options.append(config_option) )
results[configuration.id] = config_option
for config_group in configurable_options.config_groups(): for config_group in configurable_options.config_groups():
start = config_group.start - 1 start = config_group.start - 1
stop = config_group.stop stop = config_group.stop
options = config_options[start:stop] options = list(results.values())[start:stop]
config_group_proto = core_pb2.ConfigGroup( for option in options:
name=config_group.name, options=options option.group = config_group.name
) return results
groups.append(config_group_proto)
return groups
def get_links(session, node): def get_links(session, node):
@ -390,20 +385,21 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
def GetSessionOptions(self, request, context): def GetSessionOptions(self, request, context):
""" """
Retrieve session options Retrieve session options.
:param core.api.grpc.core_pb2.GetSessionOptions request: get-session-options request :param core.api.grpc.core_pb2.GetSessionOptions request:
get-session-options request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-session-options response about all session's options :return: get-session-options response about all session's options
:rtype: core.api.grpc.core_pb2.GetSessionOptions :rtype: core.api.grpc.core_pb2.GetSessionOptions
""" """
logging.debug("get session options: %s", request) logging.debug("get session options: %s", request)
session = self.get_session(request.session_id, context) session = self.get_session(request.session_id, context)
config = session.options.get_configs() current_config = session.options.get_configs()
defaults = session.options.default_values() default_config = session.options.default_values()
defaults.update(config) default_config.update(current_config)
groups = get_config_groups(defaults, session.options) config = get_config_options(default_config, session.options)
return core_pb2.GetSessionOptionsResponse(groups=groups) return core_pb2.GetSessionOptionsResponse(config=config)
def SetSessionOptions(self, request, context): def SetSessionOptions(self, request, context):
""" """
@ -1115,7 +1111,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Retrieve all mobility configurations from a session Retrieve all mobility configurations from a session
:param core.api.grpc.core_pb2.GetMobilityConfigsRequest request: get-mobility-configurations request :param core.api.grpc.core_pb2.GetMobilityConfigsRequest request:
get-mobility-configurations request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-mobility-configurations response that has a list of configurations :return: get-mobility-configurations response that has a list of configurations
:rtype: core.api.grpc.core_pb2.GetMobilityConfigsResponse :rtype: core.api.grpc.core_pb2.GetMobilityConfigsResponse
@ -1130,33 +1127,36 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
for model_name in model_config: for model_name in model_config:
if model_name != Ns2ScriptedMobility.name: if model_name != Ns2ScriptedMobility.name:
continue continue
config = session.mobility.get_model_config(node_id, model_name) current_config = session.mobility.get_model_config(node_id, model_name)
groups = get_config_groups(config, Ns2ScriptedMobility) config = get_config_options(current_config, Ns2ScriptedMobility)
response.configs[node_id].groups.extend(groups) mapped_config = core_pb2.MappedConfig(config=config)
response.configs[node_id].CopyFrom(mapped_config)
return response return response
def GetMobilityConfig(self, request, context): def GetMobilityConfig(self, request, context):
""" """
Retrieve mobility configuration of a node Retrieve mobility configuration of a node
:param core.api.grpc.core_pb2.GetMobilityConfigRequest request: get-mobility-configuration request :param core.api.grpc.core_pb2.GetMobilityConfigRequest request:
get-mobility-configuration request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-mobility-configuration response :return: get-mobility-configuration response
:rtype: core.api.grpc.core_pb2.GetMobilityConfigResponse :rtype: core.api.grpc.core_pb2.GetMobilityConfigResponse
""" """
logging.debug("get mobility config: %s", request) logging.debug("get mobility config: %s", request)
session = self.get_session(request.session_id, context) session = self.get_session(request.session_id, context)
config = session.mobility.get_model_config( current_config = session.mobility.get_model_config(
request.node_id, Ns2ScriptedMobility.name request.node_id, Ns2ScriptedMobility.name
) )
groups = get_config_groups(config, Ns2ScriptedMobility) config = get_config_options(current_config, Ns2ScriptedMobility)
return core_pb2.GetMobilityConfigResponse(groups=groups) return core_pb2.GetMobilityConfigResponse(config=config)
def SetMobilityConfig(self, request, context): def SetMobilityConfig(self, request, context):
""" """
Set mobility configuration of a node Set mobility configuration of a node
:param core.api.grpc.core_pb2.SetMobilityConfigRequest request: set-mobility-configuration request :param core.api.grpc.core_pb2.SetMobilityConfigRequest request:
set-mobility-configuration request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: set-mobility-configuration response :return: set-mobility-configuration response
"rtype" core.api.grpc.SetMobilityConfigResponse "rtype" core.api.grpc.SetMobilityConfigResponse
@ -1172,7 +1172,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Take mobility action whether to start, pause, stop or none of those Take mobility action whether to start, pause, stop or none of those
:param core.api.grpc.core_pb2.MobilityActionRequest request: mobility-action request :param core.api.grpc.core_pb2.MobilityActionRequest request: mobility-action
request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: mobility-action response :return: mobility-action response
:rtype: core.api.grpc.core_pb2.MobilityActionResponse :rtype: core.api.grpc.core_pb2.MobilityActionResponse
@ -1212,7 +1213,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Retrieve all the default services of all node types in a session Retrieve all the default services of all node types in a session
:param core.api.grpc.core_pb2.GetServiceDefaultsRequest request: get-default-service request :param core.api.grpc.core_pb2.GetServiceDefaultsRequest request:
get-default-service request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-service-defaults response about all the available default services :return: get-service-defaults response about all the available default services
:rtype: core.api.grpc.core_pb2.GetServiceDefaultsResponse :rtype: core.api.grpc.core_pb2.GetServiceDefaultsResponse
@ -1231,7 +1233,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
def SetServiceDefaults(self, request, context): def SetServiceDefaults(self, request, context):
""" """
Set new default services to the session after whipping out the old ones Set new default services to the session after whipping out the old ones
:param core.api.grpc.core_pb2.SetServiceDefaults request: set-service-defaults request :param core.api.grpc.core_pb2.SetServiceDefaults request: set-service-defaults
request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: set-service-defaults response :return: set-service-defaults response
:rtype: core.api.grpc.core_pb2 SetServiceDefaultsResponse :rtype: core.api.grpc.core_pb2 SetServiceDefaultsResponse
@ -1249,7 +1252,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Retrieve a requested service from a node Retrieve a requested service from a node
:param core.api.grpc.core_pb2.GetNodeServiceRequest request: get-node-service request :param core.api.grpc.core_pb2.GetNodeServiceRequest request: get-node-service
request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-node-service response about the requested service :return: get-node-service response about the requested service
:rtype: core.api.grpc.core_pb2.GetNodeServiceResponse :rtype: core.api.grpc.core_pb2.GetNodeServiceResponse
@ -1277,7 +1281,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Retrieve a requested service file from a node Retrieve a requested service file from a node
:param core.api.grpc.core_pb2.GetNodeServiceFileRequest request: get-node-service request :param core.api.grpc.core_pb2.GetNodeServiceFileRequest request:
get-node-service request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-node-service response about the requested service :return: get-node-service response about the requested service
:rtype: core.api.grpc.core_pb2.GetNodeServiceFileResponse :rtype: core.api.grpc.core_pb2.GetNodeServiceFileResponse
@ -1301,8 +1306,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Set a node service for a node Set a node service for a node
:param core.api.grpc.core_pb2.SetNodeServiceRequest request: set-node-service request :param core.api.grpc.core_pb2.SetNodeServiceRequest request: set-node-service
that has info to set a node service request that has info to set a node service
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: set-node-service response :return: set-node-service response
:rtype: core.api.grpc.core_pb2.SetNodeServiceResponse :rtype: core.api.grpc.core_pb2.SetNodeServiceResponse
@ -1320,7 +1325,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Store the customized service file in the service config Store the customized service file in the service config
:param core.api.grpc.core_pb2.SetNodeServiceFileRequest request: set-node-service-file request :param core.api.grpc.core_pb2.SetNodeServiceFileRequest request:
set-node-service-file request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: set-node-service-file response :return: set-node-service-file response
:rtype: core.api.grpc.core_pb2.SetNodeServiceFileResponse :rtype: core.api.grpc.core_pb2.SetNodeServiceFileResponse
@ -1382,11 +1388,11 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
logging.debug("get wlan config: %s", request) logging.debug("get wlan config: %s", request)
session = self.get_session(request.session_id, context) session = self.get_session(request.session_id, context)
config = session.mobility.get_model_config( current_config = session.mobility.get_model_config(
request.node_id, BasicRangeModel.name request.node_id, BasicRangeModel.name
) )
groups = get_config_groups(config, BasicRangeModel) config = get_config_options(current_config, BasicRangeModel)
return core_pb2.GetWlanConfigResponse(groups=groups) return core_pb2.GetWlanConfigResponse(config=config)
def SetWlanConfig(self, request, context): def SetWlanConfig(self, request, context):
""" """
@ -1418,9 +1424,9 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
logging.debug("get emane config: %s", request) logging.debug("get emane config: %s", request)
session = self.get_session(request.session_id, context) session = self.get_session(request.session_id, context)
config = session.emane.get_configs() current_config = session.emane.get_configs()
groups = get_config_groups(config, session.emane.emane_config) config = get_config_options(current_config, session.emane.emane_config)
return core_pb2.GetEmaneConfigResponse(groups=groups) return core_pb2.GetEmaneConfigResponse(config=config)
def SetEmaneConfig(self, request, context): def SetEmaneConfig(self, request, context):
""" """
@ -1459,7 +1465,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Retrieve EMANE model configuration of a node Retrieve EMANE model configuration of a node
:param core.api.grpc.core_pb2.GetEmaneModelConfigRequest request: get-EMANE-model-configuration request :param core.api.grpc.core_pb2.GetEmaneModelConfigRequest request:
get-EMANE-model-configuration request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-EMANE-model-configuration response :return: get-EMANE-model-configuration response
:rtype: core.api.grpc.core_pb2.GetEmaneModelConfigResponse :rtype: core.api.grpc.core_pb2.GetEmaneModelConfigResponse
@ -1468,15 +1475,16 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
session = self.get_session(request.session_id, context) session = self.get_session(request.session_id, context)
model = session.emane.models[request.model] model = session.emane.models[request.model]
_id = get_emane_model_id(request.node_id, request.interface) _id = get_emane_model_id(request.node_id, request.interface)
config = session.emane.get_model_config(_id, request.model) current_config = session.emane.get_model_config(_id, request.model)
groups = get_config_groups(config, model) config = get_config_options(current_config, model)
return core_pb2.GetEmaneModelConfigResponse(groups=groups) return core_pb2.GetEmaneModelConfigResponse(config=config)
def SetEmaneModelConfig(self, request, context): def SetEmaneModelConfig(self, request, context):
""" """
Set EMANE model configuration of a node Set EMANE model configuration of a node
:param core.api.grpc.core_pb2.SetEmaneModelConfigRequest request: set-EMANE-model-configuration request :param core.api.grpc.core_pb2.SetEmaneModelConfigRequest request:
set-EMANE-model-configuration request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: set-EMANE-model-configuration response :return: set-EMANE-model-configuration response
:rtype: core.api.grpc.core_pb2.SetEmaneModelConfigResponse :rtype: core.api.grpc.core_pb2.SetEmaneModelConfigResponse
@ -1491,9 +1499,11 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
""" """
Retrieve all EMANE model configurations of a session Retrieve all EMANE model configurations of a session
:param core.api.grpc.core_pb2.GetEmaneModelConfigsRequest request: get-EMANE-model-configurations request :param core.api.grpc.core_pb2.GetEmaneModelConfigsRequest request:
get-EMANE-model-configurations request
:param grpc.ServicerContext context: context object :param grpc.ServicerContext context: context object
:return: get-EMANE-model-configurations response that has all the EMANE configurations :return: get-EMANE-model-configurations response that has all the EMANE
configurations
:rtype: core.api.grpc.core_pb2.GetEmaneModelConfigsResponse :rtype: core.api.grpc.core_pb2.GetEmaneModelConfigsResponse
""" """
logging.debug("get emane model configs: %s", request) logging.debug("get emane model configs: %s", request)
@ -1506,11 +1516,12 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
for model_name in model_config: for model_name in model_config:
model = session.emane.models[model_name] model = session.emane.models[model_name]
config = session.emane.get_model_config(node_id, model_name) current_config = session.emane.get_model_config(node_id, model_name)
config_groups = get_config_groups(config, model) config = get_config_options(current_config, model)
node_configurations = response.configs[node_id] model_config = core_pb2.GetEmaneModelConfigsResponse.ModelConfig(
node_configurations.model = model_name model=model_name, config=config
node_configurations.groups.extend(config_groups) )
response.configs[node_id].CopyFrom(model_config)
return response return response
def SaveXml(self, request, context): def SaveXml(self, request, context):

View file

@ -163,7 +163,7 @@ message GetSessionOptionsRequest {
} }
message GetSessionOptionsResponse { message GetSessionOptionsResponse {
repeated ConfigGroup groups = 1; map<string, ConfigOption> config = 2;
} }
message SetSessionOptionsRequest { message SetSessionOptionsRequest {
@ -428,10 +428,7 @@ message GetMobilityConfigsRequest {
} }
message GetMobilityConfigsResponse { message GetMobilityConfigsResponse {
message MobilityConfig { map<int32, MappedConfig> configs = 1;
repeated ConfigGroup groups = 1;
}
map<int32, MobilityConfig> configs = 1;
} }
message GetMobilityConfigRequest { message GetMobilityConfigRequest {
@ -440,7 +437,7 @@ message GetMobilityConfigRequest {
} }
message GetMobilityConfigResponse { message GetMobilityConfigResponse {
repeated ConfigGroup groups = 1; map<string, ConfigOption> config = 1;
} }
message SetMobilityConfigRequest { message SetMobilityConfigRequest {
@ -551,7 +548,7 @@ message GetWlanConfigRequest {
} }
message GetWlanConfigResponse { message GetWlanConfigResponse {
repeated ConfigGroup groups = 1; map<string, ConfigOption> config = 1;
} }
message SetWlanConfigRequest { message SetWlanConfigRequest {
@ -569,7 +566,7 @@ message GetEmaneConfigRequest {
} }
message GetEmaneConfigResponse { message GetEmaneConfigResponse {
repeated ConfigGroup groups = 1; map<string, ConfigOption> config = 1;
} }
message SetEmaneConfigRequest { message SetEmaneConfigRequest {
@ -597,7 +594,7 @@ message GetEmaneModelConfigRequest {
} }
message GetEmaneModelConfigResponse { message GetEmaneModelConfigResponse {
repeated ConfigGroup groups = 1; map<string, ConfigOption> config = 1;
} }
message SetEmaneModelConfigRequest { message SetEmaneModelConfigRequest {
@ -619,7 +616,7 @@ message GetEmaneModelConfigsRequest {
message GetEmaneModelConfigsResponse { message GetEmaneModelConfigsResponse {
message ModelConfig { message ModelConfig {
string model = 1; string model = 1;
repeated ConfigGroup groups = 2; map<string, ConfigOption> config = 2;
} }
map<int32, ModelConfig> configs = 1; map<int32, ModelConfig> configs = 1;
} }
@ -777,9 +774,8 @@ message NodeServiceData {
string meta = 10; string meta = 10;
} }
message ConfigGroup { message MappedConfig {
string name = 1; map<string, ConfigOption> config = 1;
repeated ConfigOption options = 2;
} }
message ConfigOption { message ConfigOption {
@ -788,6 +784,7 @@ message ConfigOption {
string value = 3; string value = 3;
int32 type = 4; int32 type = 4;
repeated string select = 5; repeated string select = 5;
string group = 6;
} }
message Session { message Session {

View file

@ -100,7 +100,7 @@ class TestGrpc:
response = client.get_session_options(session.id) response = client.get_session_options(session.id)
# then # then
assert len(response.groups) > 0 assert len(response.config) > 0
def test_get_session_location(self, grpc_server): def test_get_session_location(self, grpc_server):
# given # given
@ -457,7 +457,7 @@ class TestGrpc:
response = client.get_wlan_config(session.id, wlan.id) response = client.get_wlan_config(session.id, wlan.id)
# then # then
assert len(response.groups) > 0 assert len(response.config) > 0
def test_set_wlan_config(self, grpc_server): def test_set_wlan_config(self, grpc_server):
# given # given
@ -501,7 +501,7 @@ class TestGrpc:
response = client.get_emane_config(session.id) response = client.get_emane_config(session.id)
# then # then
assert len(response.groups) > 0 assert len(response.config) > 0
def test_set_emane_config(self, grpc_server): def test_set_emane_config(self, grpc_server):
# given # given
@ -540,6 +540,9 @@ class TestGrpc:
# then # then
assert len(response.configs) == 1 assert len(response.configs) == 1
assert emane_network.id in response.configs assert emane_network.id in response.configs
model_config = response.configs[emane_network.id]
assert model_config.model == EmaneIeee80211abgModel.name
assert len(model_config.config) > 0
def test_set_emane_model_config(self, grpc_server): def test_set_emane_model_config(self, grpc_server):
# given # given
@ -582,7 +585,7 @@ class TestGrpc:
) )
# then # then
assert len(response.groups) > 0 assert len(response.config) > 0
def test_get_emane_models(self, grpc_server): def test_get_emane_models(self, grpc_server):
# given # given
@ -610,6 +613,8 @@ class TestGrpc:
# then # then
assert len(response.configs) > 0 assert len(response.configs) > 0
assert wlan.id in response.configs assert wlan.id in response.configs
mapped_config = response.configs[wlan.id]
assert len(mapped_config.config) > 0
def test_get_mobility_config(self, grpc_server): def test_get_mobility_config(self, grpc_server):
# given # given
@ -623,7 +628,7 @@ class TestGrpc:
response = client.get_mobility_config(session.id, wlan.id) response = client.get_mobility_config(session.id, wlan.id)
# then # then
assert len(response.groups) > 0 assert len(response.config) > 0
def test_set_mobility_config(self, grpc_server): def test_set_mobility_config(self, grpc_server):
# given # given