Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion common/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
PYTHON_SRC = 'src/main/python'

install_requires = [
"dvp-api == 1.9.0",
"dvp-api == 1.10.0.dev0",
"six >= 1.17, < 1.18",
]

Expand Down
2 changes: 1 addition & 1 deletion libs/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
version = version_file.read().strip()

install_requires = [
"dvp-api == 1.9.0",
"dvp-api == 1.10.0.dev0",
"dvp-common == {}".format(version),
"six >= 1.17, < 1.18",
]
Expand Down
2 changes: 1 addition & 1 deletion platform/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
version = version_file.read().strip()

install_requires = [
"dvp-api == 1.9.0",
"dvp-api == 1.10.0.dev0",
"dvp-common == {}".format(version),
"six >= 1.17, < 1.18",
]
Expand Down
152 changes: 151 additions & 1 deletion platform/src/main/python/dlpx/virtualization/platform/_linked.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from dlpx.virtualization.common.exceptions import PluginRuntimeError
from dlpx.virtualization.platform import (DirectSource, Mount,
MountSpecification, StagedSource,
Status)
Status, PhysicalSource)
from dlpx.virtualization.platform import validation_util as v
from dlpx.virtualization.platform.exceptions import (
IncorrectReturnTypeError, OperationAlreadyDefinedError,
Expand All @@ -33,6 +33,7 @@ def __init__(self):
self.worker_impl = None
self.mount_specification_impl = None
self.source_size_impl = None
self.source_to_physical_impl = None

def pre_snapshot(self):
def pre_snapshot_decorator(pre_snapshot_impl):
Expand Down Expand Up @@ -112,6 +113,16 @@ def source_size_decorator(source_size_impl):

return source_size_decorator

def source_to_physical(self):
def source_to_physical_decorator(source_to_physical_impl):
if self.source_to_physical_impl:
raise OperationAlreadyDefinedError(Op.LINKED_SOURCE_TO_PHYSICAL)
self.source_to_physical_impl = v.check_function(
source_to_physical_impl, Op.LINKED_SOURCE_TO_PHYSICAL)
return source_to_physical_impl

return source_to_physical_decorator

@staticmethod
def _from_protobuf_remote_mount(remote_mount):
return Mount(remote_environment=RemoteEnvironment.from_proto(
Expand Down Expand Up @@ -323,6 +334,72 @@ def _internal_direct_source_size(self, request):

return direct_source_size_response

def _internal_direct_source_to_physical(self, request):
"""Direct Source to Physical Wrapper for direct plugins.

Executed as part of several operations to convert a virtual source
to a physical source for a direct source.

Run virtual_to_physical operation for a direct source.

Args:
request (DirectSourceToPhysicalRequest): Virtual to Physical Request
arguments.

Returns:
DirectSourceToPhysicalResponse: A response containing the return value -
DirectSourceToPhysicalResult. In case of errors, response object will
contain PluginErrorResult.
"""
# Reasoning for method imports are in this file's docstring.
from generated.definitions import RepositoryDefinition
from generated.definitions import LinkedSourceDefinition
from generated.definitions import SourceConfigDefinition
from generated.definitions import SnapshotDefinition
from generated.definitions import VirtualToPhysicalDefinition

#
# While linked.virtual_to_physical() is not a required operation,
# this should not be called if it wasn't implemented.
#
if not self.source_to_physical_impl:
raise OperationNotDefinedError(Op.LINKED_SOURCE_TO_PHYSICAL)

direct_source_definition = LinkedSourceDefinition.from_dict(
json.loads(request.direct_source.linked_source.parameters.json))
direct_source = DirectSource(
guid=request.direct_source.linked_source.guid,
connection=RemoteConnection.from_proto(
request.direct_source.connection),
parameters=direct_source_definition)
virtual_to_physical_source_definition = VirtualToPhysicalDefinition.from_dict(
json.loads(request.physical_source.parameters.json))
physical_source = PhysicalSource(
guid=request.physical_source.guid,
connection=RemoteConnection.from_proto(request.physical_source.connection),
target_directory=request.physical_source.target_directory,
parameters=virtual_to_physical_source_definition)

repository = RepositoryDefinition.from_dict(
json.loads(request.repository.parameters.json))
source_config = SourceConfigDefinition.from_dict(
json.loads(request.source_config.parameters.json))
snapshot = SnapshotDefinition.from_dict(
json.loads(request.snapshot.parameters.json))

self.source_to_physical_impl(
direct_source=direct_source,
repository=repository,
source_config=source_config,
snapshot=snapshot,
physical_source=physical_source)

direct_source_to_physical_response = (
platform_pb2.DirectSourceToPhysicalResponse())
direct_source_to_physical_response.return_value.CopyFrom(
platform_pb2.DirectSourceToPhysicalResult())
return direct_source_to_physical_response

def _internal_staged_pre_snapshot(self, request):
"""Pre Snapshot Wrapper for staged plugins.

Expand Down Expand Up @@ -852,3 +929,76 @@ def _internal_staged_source_size(self, request):
staged_source_size_response.return_value.database_size = source_size

return staged_source_size_response

def _internal_staged_source_to_physical(self, request):
"""Staged Source to Physical Wrapper for staged plugins.

Executed as part of several operations to convert a virtual source
to a physical source for a staged source.

Run virtual_to_physical operation for a staged source.

Args:
request (StagedSourceToPhysicalRequest): Virtual to Physical Request
arguments.

Returns:
StagedSourceToPhysicalResponse: A response containing the return value -
StagedSourceToPhysicalResult. In case of errors, response object will
contain PluginErrorResult.
"""
# Reasoning for method imports are in this file's docstring.
from generated.definitions import RepositoryDefinition
from generated.definitions import LinkedSourceDefinition
from generated.definitions import SourceConfigDefinition
from generated.definitions import SnapshotDefinition
from generated.definitions import VirtualToPhysicalDefinition

#
# While linked.virtual_to_physical() is not a required operation,
# this should not be called if it wasn't implemented.
#
if not self.source_to_physical_impl:
raise OperationNotDefinedError(Op.LINKED_SOURCE_TO_PHYSICAL)

staged_source_definition = LinkedSourceDefinition.from_dict(
json.loads(request.staged_source.linked_source.parameters.json))
staged_mount, mounts = LinkedOperations._get_mounts_from_request(request)
staged_source = StagedSource(
guid=request.staged_source.linked_source.guid,
source_connection=RemoteConnection.from_proto(
request.staged_source.source_connection),
parameters=staged_source_definition,
mount=staged_mount,
staged_connection=RemoteConnection.from_proto(
request.staged_source.staged_connection),
mounts=mounts)

virtual_to_physical_source_definition = VirtualToPhysicalDefinition.from_dict(
json.loads(request.physical_source.parameters.json))
physical_source = PhysicalSource(
guid=request.physical_source.guid,
connection=RemoteConnection.from_proto(request.physical_source.connection),
target_directory=request.physical_source.target_directory,
parameters=virtual_to_physical_source_definition)

repository = RepositoryDefinition.from_dict(
json.loads(request.repository.parameters.json))
source_config = SourceConfigDefinition.from_dict(
json.loads(request.source_config.parameters.json))
snapshot = SnapshotDefinition.from_dict(
json.loads(request.snapshot.parameters.json))

self.source_to_physical_impl(
staged_source=staged_source,
repository=repository,
source_config=source_config,
snapshot=snapshot,
physical_source=physical_source
)

staged_source_to_physical_response = (
platform_pb2.StagedSourceToPhysicalResponse())
staged_source_to_physical_response.return_value.CopyFrom(
platform_pb2.StagedSourceToPhysicalResult())
return staged_source_to_physical_response
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@
of the autogenerated classes from the schemas (e.g. VirtualSourceDefinition)
"""
__all__ = [
"VirtualSource", "StagedSource", "DirectSource", "Status", "MigrationType",
"Mount", "OwnershipSpecification", "MountSpecification"
"VirtualSource", "StagedSource", "DirectSource", "PhysicalSource",
"Status", "MigrationType", "Mount", "OwnershipSpecification",
"MountSpecification"
]


Expand Down Expand Up @@ -137,6 +138,44 @@ def parameters(self):
return self._parameters


class PhysicalSource(object):
def __init__(self, guid, connection, target_directory, parameters):
self._guid = guid
if not isinstance(connection, RemoteConnection):
raise IncorrectTypeError(RemoteConnection, 'connection',
type(connection), RemoteConnection)
self._connection = connection
if not isinstance(target_directory, six.string_types):
raise IncorrectTypeError(PhysicalSource, 'target_directory',
type(target_directory),
six.string_types[0])
self._target_directory = target_directory
self._parameters = parameters

@property
def guid(self):
"""str: The unique guid identifier for this PhysicalSource."""
return self._guid

@property
def connection(self):
"""RemoteConnection: The RemoteConnection for this
PhysicalSource."""
return self._connection

@property
def target_directory(self):
"""str: The target directory path for this PhysicalSource."""
return self._target_directory

@property
def parameters(self):
"""PhysicalSourceDefinition: The PhysicalSourceDefinition for this
PhysicalSource.
"""
return self._parameters


class Status(Enum):
ACTIVE = 0
INACTIVE = 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from dlpx.virtualization.api import common_pb2, platform_pb2
from dlpx.virtualization.common import RemoteConnection, RemoteEnvironment
from dlpx.virtualization.platform import (Mount, MountSpecification, Status,
VirtualSource)
VirtualSource, PhysicalSource)
from dlpx.virtualization.platform import validation_util as v
from dlpx.virtualization.platform.exceptions import (
IncorrectReturnTypeError, OperationAlreadyDefinedError,
Expand All @@ -35,6 +35,7 @@ def __init__(self):
self.initialize_impl = None
self.mount_specification_impl = None
self.source_size_impl = None
self.source_to_physical_impl = None

def configure(self):
def configure_decorator(configure_impl):
Expand Down Expand Up @@ -153,6 +154,17 @@ def source_size_decorator(source_size_impl):

return source_size_decorator

def source_to_physical(self):
def source_to_physical_decorator(source_to_physical_impl):
if self.source_to_physical_impl:
raise OperationAlreadyDefinedError(
Op.VIRTUAL_SOURCE_TO_PHYSICAL)
self.source_to_physical_impl = v.check_function(
source_to_physical_impl, Op.VIRTUAL_SOURCE_TO_PHYSICAL)
return source_to_physical_impl

return source_to_physical_decorator

@staticmethod
def _from_protobuf_single_subset_mount(single_subset_mount):
return Mount(remote_environment=RemoteEnvironment.from_proto(
Expand Down Expand Up @@ -848,3 +860,72 @@ def _internal_virtual_source_size(self, request):
virtual_source_size_response.return_value.database_size = source_size

return virtual_source_size_response

def _internal_virtual_source_to_physical(self, request):
"""Virtual to Physical Wrapper.

Executed as part of several operations to convert a virtual source
to a physical source.

Run virtual_to_physical operation for a virtual source.

Args:
request (VirtualSourceToPhysicalRequest): Virtual to Physical Request
arguments.

Returns:
VirtualSourceToPhysicalResponse: A response containing the return value -
VirtualSourceToPhysicalResult. In case of errors, response object will
contain PluginErrorResult.
"""
# Reasoning for method imports are in this file's docstring.
from generated.definitions import VirtualSourceDefinition
from generated.definitions import RepositoryDefinition
from generated.definitions import SourceConfigDefinition
from generated.definitions import SnapshotDefinition
from generated.definitions import VirtualToPhysicalDefinition

#
# While virtual.virtual_to_physical() is not a required operation,
# this should not be called if it wasn't implemented.
#
if not self.source_to_physical_impl:
raise OperationNotDefinedError(Op.VIRTUAL_SOURCE_TO_PHYSICAL)

virtual_source_definition = VirtualSourceDefinition.from_dict(
json.loads(request.virtual_source.parameters.json))
mounts = [
VirtualOperations._from_protobuf_single_subset_mount(m)
for m in request.virtual_source.mounts
]
virtual_source = VirtualSource(guid=request.virtual_source.guid,
connection=RemoteConnection.from_proto(
request.virtual_source.connection),
parameters=virtual_source_definition,
mounts=mounts)
virtual_to_physical_source_definition = VirtualToPhysicalDefinition.from_dict(
json.loads(request.physical_source.parameters.json))
physical_source = PhysicalSource(
guid=request.physical_source.guid,
connection=RemoteConnection.from_proto(request.physical_source.connection),
target_directory=request.physical_source.target_directory,
parameters=virtual_to_physical_source_definition)
repository = RepositoryDefinition.from_dict(
json.loads(request.repository.parameters.json))
source_config = SourceConfigDefinition.from_dict(
json.loads(request.source_config.parameters.json))
snapshot = SnapshotDefinition.from_dict(
json.loads(request.snapshot.parameters.json))

self.source_to_physical_impl(
virtual_source=virtual_source,
repository=repository,
source_config=source_config,
snapshot=snapshot,
physical_source=physical_source)

virtual_to_physical_response = (
platform_pb2.VirtualSourceToPhysicalResponse())
virtual_to_physical_response.return_value.CopyFrom(
platform_pb2.VirtualSourceToPhysicalResult())
return virtual_to_physical_response
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class Operation(Enum):
LINKED_WORKER = 'linked.worker()'
LINKED_MOUNT_SPEC = 'linked.mount_specification()'
LINKED_SOURCE_SIZE = 'linked.source_size()'
LINKED_SOURCE_TO_PHYSICAL = 'linked.source_to_physical()'

VIRTUAL_CONFIGURE = 'virtual.configure()'
VIRTUAL_UNCONFIGURE = 'virtual.unconfigure()'
Expand All @@ -31,6 +32,7 @@ class Operation(Enum):
VIRTUAL_INITIALIZE = 'virtual.initialize()'
VIRTUAL_MOUNT_SPEC = 'virtual.mount_specification()'
VIRTUAL_SOURCE_SIZE = 'virtual.source_size()'
VIRTUAL_SOURCE_TO_PHYSICAL = 'virtual.source_to_physical()'

UPGRADE_REPOSITORY = 'upgrade.repository()'
UPGRADE_SOURCE_CONFIG = 'upgrade.source_config()'
Expand Down
Loading
Loading