docker_images/pythonv2/wrapper/python_glue/internal_glue_factory.py (62 lines of code) (raw):
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for
# full license information.
import logging
import internal_control_glue
from internal_iothub_glue import InternalDeviceGlueSync, InternalModuleGlueSync
try:
from internal_iothub_glue_async import (
InternalDeviceGlueAsync,
InternalModuleGlueAsync,
)
import wrap_async_in_sync
import wrap_sync_in_async
except SyntaxError:
pass
logger = logging.getLogger(__name__)
device = "device"
sync_device = "sync_device"
async_device = "async_device"
module = "module"
sync_module = "sync_module"
async_module = "async_module"
sync_interface = "sync_interface"
async_interface = "async_interface"
valid_object_types = [device, module]
valid_interface_types = [sync_interface, async_interface]
def create_glue_object(object_type, interface_type):
if object_type not in valid_object_types:
raise ValueError(
"object_type {} invalid. only {} are accepted".format(
object_type, valid_object_types
)
)
if interface_type not in valid_interface_types:
raise ValueError(
"interface_type {} invalid. only {} are accepted".format(
interface_type, valid_interface_types
)
)
if internal_control_glue.do_async:
object_type = "async_" + object_type
else:
object_type = "sync_" + object_type
logger.info("making {} object with {}".format(object_type, interface_type))
if object_type == sync_device:
logger.info("Creating DeviceGlue")
obj = InternalDeviceGlueSync()
elif object_type == async_device:
logger.info("Creating DeviceGlueAsync")
obj = InternalDeviceGlueAsync()
elif object_type == sync_module:
logger.info("Creating ModuleGlue")
obj = InternalModuleGlueSync()
elif object_type == async_module:
logger.info("Creating ModuleGlueAsync")
obj = InternalModuleGlueAsync()
else:
assert False
if interface_type.startswith("async_"):
# async glue has some sync methods (connection_status.py) that need to be wrapped,
# so we call this for sync and async glue both
logger.info("Wrapping sync methods in async facade")
wrap_sync_in_async.wrap_object(obj)
if interface_type.startswith("sync_") and object_type.startswith("async_"):
# only wrap async in sync if we're using async glue. sync glue doesn't have
# any async methods.
logger.info("Wrapping async methods in sync facade")
wrap_async_in_sync.wrap_object(obj)
return obj