From 7d18f8dba8bc9a6bd7cc9b69de51d456e2b70038 Mon Sep 17 00:00:00 2001 From: Tom Walsh Date: Thu, 10 Sep 2020 10:51:28 -0400 Subject: [PATCH 1/3] Fixes #250 Support empty VDBs --- common/setup.py | 2 +- docs/docs/References/Decorators.md | 5 +- docs/docs/References/Glossary.md | 9 ++- docs/docs/References/Plugin_Operations.md | 63 ++++++++++++++++++ docs/docs/References/Workflows.md | 4 ++ .../html/VirtualSourceCreateEmpty.html | 12 ++++ .../images/VirtualSourceCreateEmpty.png | Bin 0 -> 25178 bytes libs/setup.py | 2 +- platform/setup.py | 2 +- .../dlpx/virtualization/platform/_virtual.py | 15 +++-- .../python/dlpx/virtualization/test_plugin.py | 15 ++--- .../validation_schemas/plugin_importer.yaml | 2 - .../_internal/test_package_util.py | 4 +- 13 files changed, 111 insertions(+), 24 deletions(-) create mode 100644 docs/docs/References/html/VirtualSourceCreateEmpty.html create mode 100644 docs/docs/References/images/VirtualSourceCreateEmpty.png diff --git a/common/setup.py b/common/setup.py index 64e5643c..a5e92681 100644 --- a/common/setup.py +++ b/common/setup.py @@ -4,7 +4,7 @@ PYTHON_SRC = 'src/main/python' install_requires = [ - "dvp-api == 1.3.0", + "dvp-api == 1.4.0.dev10", ] with open(os.path.join(PYTHON_SRC, 'dlpx/virtualization/common/VERSION')) as version_file: diff --git a/docs/docs/References/Decorators.md b/docs/docs/References/Decorators.md index 20158783..038cf01c 100644 --- a/docs/docs/References/Decorators.md +++ b/docs/docs/References/Decorators.md @@ -13,13 +13,13 @@ plugin = Plugin() # Use the decorator to annotate the function that corresponds to the "Virtual Source Start" Plugin Operation @plugin.virtual_source.start() def my_start(virtual_source, repository, source_config): - print "running start" + print "running start" ``` !!! info Decorators exposed by the Virtualization SDK are inherently python function calls and needs parentheses `()` appended at the end. -Assuming the name of the object, is `plugin` as above, the table below lists the corresponding decorators for each plugin operation. +Assuming the name of the object is `plugin` as above, the table below lists the corresponding decorators for each plugin operation. Plugin Operation | Decorator ---------------- | -------- @@ -35,6 +35,7 @@ Plugin Operation | Decorator [Staged Linked Source Worker](Plugin_Operations.md#staged-linked-source-worker) | `@plugin.linked.worker()` [Staged Linked Source Mount Specification](Plugin_Operations.md#staged-linked-source-mount-specification) | `@plugin.linked.mount_specification()` [Virtual Source Configure](Plugin_Operations.md#virtual-source-configure) | `@plugin.virtual.configure()` +[Virtual Source Initialize](Plugin_Operations.md#virtual-source-initialize) | `@plugin.virtual.initialize()` [Virtual Source Unconfigure](Plugin_Operations.md#virtual-source-unconfigure) | `@plugin.virtual.unconfigure()` [Virtual Source Reconfigure](Plugin_Operations.md#virtual-source-reconfigure) | `@plugin.virtual.reconfigure()` [Virtual Source Start](Plugin_Operations.md#virtual-source-start) | `@plugin.virtual.start()` diff --git a/docs/docs/References/Glossary.md b/docs/docs/References/Glossary.md index a1038684..3d439050 100644 --- a/docs/docs/References/Glossary.md +++ b/docs/docs/References/Glossary.md @@ -28,6 +28,13 @@ The process by which the Delphix Engine learns about how a particular environmen ## dSource See [Linked Dataset](#linked-dataset) +## Empty VDB +A VDB that is created from scratch, without provisioning from another dataset. Users can create empty VDBs when they want to construct a brand-new dataset from within Delphix, instead of creating it externally and then ingesting it. + +This "empty" VDB, of course, will typically not stay empty for long. Data will be added as users work with the new dataset. + +A plugin can support this functionality by implementing the [initialize](Plugin_Operations.md#virtual-source-initialize) operation. + ## Environment A remote system that the Delphix Engine can interact with. An environment can be used as a [source](#source-environment), [staging](#staging-environment) or [target](#target-environment) environment (or any combination of those). For example, a Linux machine that the Delphix Engine can connect to is an environment. @@ -105,7 +112,7 @@ The process by which the Delphix Engine ingests data from a dataset on a [source An [environment](#environment) on which Delphix-provided virtualized datasets can be used. ## Lua Toolkit -Legacy model for writing "plugins" in Lua, with limited documentation and support for writing, building and uploading toolkits. This was the predecessor to the Virtualization SDK. +Legacy model for writing "plugins" in Lua, with limited documentation and limited support for writing, building and uploading toolkits. This was the predecessor to the Virtualization SDK. ## Upgrade Operation A special plugin operation that takes data produced by an older version of a plugin, and transforms it into the format expected by the new version of the plugin. diff --git a/docs/docs/References/Plugin_Operations.md b/docs/docs/References/Plugin_Operations.md index c0321ac2..32eac188 100644 --- a/docs/docs/References/Plugin_Operations.md +++ b/docs/docs/References/Plugin_Operations.md @@ -22,6 +22,7 @@ Plugin Operation | **Required** | Decorator | Delphix Engine Operations [Staged Linked Source
Status](#staged-linked-source-status) | **No** |`linked.status()` | N/A [Staged Linked Source
Worker](#staged-linked-source-worker) | **No** |`linked.worker()` | N/A [Staged Linked Source
Mount Specification](#staged-linked-source-mount-specification) | **Yes** | `linked.mount_specification()` | [Linked Source Sync](Workflows.md#linked-source-sync)
[Linked Source Enable](Workflows.md#linked-source-enable) +[Virtual Source
Initialize](#virtual-source-initialize) | **No** | `virtual.initialize()` | [Virtual Source Create Empty VDB](Workflows.md#virtual-source-create-empty-vdb) [Virtual Source
Configure](#virtual-source-configure) | **Yes** | `virtual.configure()` | [Virtual Source Provision](Workflows.md#virtual-source-provision)
[Virtual Source Refresh](Workflows.md#virtual-source-refresh) [Virtual Source
Unconfigure](#virtual-source-unconfigure) | **No** | `virtual.unconfigure()` | [Virtual Source Refresh](Workflows.md#virtual-source-refresh)
[Virtual Source Delete](Workflows.md#virtual-source-delete) [Virtual Source
Reconfigure](#virtual-source-reconfigure) | **Yes** | `virtual.reconfigure()` | [Virtual Source Rollback](Workflows.md#virtual-source-rollback)
[Virtual Source Enable](Workflows.md#virtual-source-enable) @@ -593,6 +594,68 @@ def linked_mount_specification(staged_source, repository): return MountSpecification([mount], ownership_spec) ``` +## Virtual Source Initialize + +Initializes a brand-new [empty VDB](Glossary.md#empty-vdb). As with all VDBs, this new dataset will have access to mounted Delphix Engine storage, but of course there will be no data there at first. + +The job of the plugin is to do whatever is necessary to set up a new dataset from scratch. For example, this might involve running a `CREATE DATABASE` command. This is an optional operation -- users will not be allowed to create empty VDBs for plugins that choose not to implement this operation. + +As with the `configure` operation, this `initialize` operation must return source config parameters that represent the new dataset. + +### Required / Optional +**Optional.** + +### Delphix Engine Operations + +* [Virtual Source Create Empty VDB](Workflows.md#virtual-source-create-empty-vdb) + +### Signature + +`def initialize_empty_dataset(virtual_source, repository)` + +### Decorator + +`virtual.initialize()` + +### Arguments + +Argument | Type | Description +-------- | ---- | ----------- +virtual_source | [VirtualSource](Classes.md#virtualsource) | The source associated with this operation. +repository | [RepositoryDefinition](Schemas_and_Autogenerated_Classes.md#repositorydefinition-class) | The repository associated with this source. + +### Returns +[SourceConfigDefinition](Schemas_and_Autogenerated_Classes.md#sourceconfigdefinition-class) + +### Example + +```python +from dlpx.virtualization.platform import Plugin +from generated.defintions import SourceConfigDefinition + +plugin = Plugin() + +@plugin.virtual.initialize() +def initialize(virtual_source, snapshot): + source_config = SourceConfigDefinition(name="config_name") + return source_config +``` + +> The above command assumes a [SourceConfig Schema](Schemas_and_Autogenerated_Classes.md#sourceconfig-schema) defined as: + +```json +{ + "type": "object", + "required": ["name"], + "additionalProperties": false, + "properties": { + "name": { "type": "string" } + }, + "identityFields": ["name"], + "nameField": ["name"] +} +``` + ## Virtual Source Configure Configures the data in a particular snapshot to be usable on a target environment. For database data files, this may mean recovering from a crash consistent format or backup. For application files, this may mean reconfiguring XML files or rewriting hostnames and symlinks. diff --git a/docs/docs/References/Workflows.md b/docs/docs/References/Workflows.md index 8bf50999..d58ed815 100644 --- a/docs/docs/References/Workflows.md +++ b/docs/docs/References/Workflows.md @@ -32,6 +32,10 @@ ![Screenshot](images/VirtualSourceSnapshot.png) +## Virtual Source Create Empty VDB + +![Screenshot](images/VirtualSourceCreateEmpty.png) + ## Virtual Source Refresh ![Screenshot](images/VirtualSourceRefresh.png) diff --git a/docs/docs/References/html/VirtualSourceCreateEmpty.html b/docs/docs/References/html/VirtualSourceCreateEmpty.html new file mode 100644 index 00000000..0a039f91 --- /dev/null +++ b/docs/docs/References/html/VirtualSourceCreateEmpty.html @@ -0,0 +1,12 @@ + + + +Draw.io Diagram + + + + +
+ + + diff --git a/docs/docs/References/images/VirtualSourceCreateEmpty.png b/docs/docs/References/images/VirtualSourceCreateEmpty.png new file mode 100644 index 0000000000000000000000000000000000000000..911b1072e259bbd01ca9ab23136e61432720a1db GIT binary patch literal 25178 zcmd?Q6*12>}vd(O>}<3j}AeU;%bFq;w}LK!2`i1xVuAuAi18zoSQ4|ihfoZ^u zWi64SW%gV)rtbQ*mr7AB+$0?31+gMt|kOxVaiM9Q|OT;Z4?QM}Y5`0{&?5rRT zb}m*9j(-=a7?~M4TK<33{Ikgw=ICT;Z}(r5IJj7OSdpUt8eq;w=Krk~cXV_#GjM`S zTdTuu%njTmq-5RxE92||hy7Q^6y|Dag1jlx5fG$H|HpSoHJ1P5Ej~*KhnQ=^9&h~B)C3YjYl9mLwCO0>iv^vsWF%B8HjFIwxN-Em!5L+ij zJ1J{hQB59xWp-6bq<}O?)&nBT$;qLvZY>J~A#Iaz_H>m1*}!d)Wd|t}Ger#tM^6t= zDN{u)ZsY|TytZLR-{B%?<{2Q!rQ73mw==hrMn0dII*d=lR^CyI$JmM; zDGyUnl!S?LxbcIO?NqEht&BaT&Ea5PUMCF&Q&AUfGZz^XISDZnXAfCp zO-o5rHsN&^l{S{r06Ez^ zsBkK}LQO%ko>F`;dnm7`i!6tPs*xPr!_!^e0j`eJ#4pRE>B4QUZo|prAua(k5$EH! zXIBA>DjGYx$coFkJE*B>^Z$D-qB0r~h`pw&r~~qZ6QZreZUT~3mFDKwkmQG|A?ws+ zG%ZY}? zVk{-E>Ef=y!7k%zr2^vOk+SC!wUpE1lXg?%Kt8byH=lp4(c++|*4~ju-hf z;`UmeU|vmbRc%Kj4MmW=ktb4=UCIh#=Ok$-uV8F$rDY|msiA-rWtVprMK*e>KoykK zk^Nmli`zrV&RNz))q|6t*ICopO4Cxt)J#>8+tyChjbB-vUD--XLPk!_iPu&}R)bef z+@4R~(Mdv7%n`1^t|~39%mH�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 z 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 gaez6Lh4@P2yI0uXwG9IJKO Date: Fri, 11 Sep 2020 12:28:28 -0400 Subject: [PATCH 2/3] Jeff's feedback on empty VDB code --- docs/docs/References/Plugin_Operations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/References/Plugin_Operations.md b/docs/docs/References/Plugin_Operations.md index 32eac188..2fe76756 100644 --- a/docs/docs/References/Plugin_Operations.md +++ b/docs/docs/References/Plugin_Operations.md @@ -611,7 +611,7 @@ As with the `configure` operation, this `initialize` operation must return sourc ### Signature -`def initialize_empty_dataset(virtual_source, repository)` +`def initialize(virtual_source, repository)` ### Decorator @@ -636,7 +636,7 @@ from generated.defintions import SourceConfigDefinition plugin = Plugin() @plugin.virtual.initialize() -def initialize(virtual_source, snapshot): +def initialize(virtual_source, repository): source_config = SourceConfigDefinition(name="config_name") return source_config ``` From 5d3921da59c67e58098b4a4bffeb74e34725a3f9 Mon Sep 17 00:00:00 2001 From: Tom Walsh Date: Fri, 11 Sep 2020 14:14:00 -0400 Subject: [PATCH 3/3] Add initialize to fake plugins --- .../_internal/fake_plugin/direct/successful.py | 5 +++++ .../_internal/fake_plugin/staged/successful.py | 3 +++ 2 files changed, 8 insertions(+) diff --git a/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/direct/successful.py b/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/direct/successful.py index 24d57a34..e8ef3d1c 100644 --- a/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/direct/successful.py +++ b/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/direct/successful.py @@ -33,6 +33,11 @@ def configure(virtual_source, repository, snapshot): name = "VDB mounted to " + path return None +@direct.virtual.initialize() +def initialize(virtual_source, repository): + path = virtual_source.parameters.path + name = "VDB mounted to " + path + return None @direct.virtual.mount_specification() def mount_specification(repository, virtual_source): diff --git a/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/staged/successful.py b/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/staged/successful.py index 31ae1151..0d6ca414 100644 --- a/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/staged/successful.py +++ b/tools/src/test/python/dlpx/virtualization/_internal/fake_plugin/staged/successful.py @@ -65,6 +65,9 @@ def staged_worker(repository, source_config, staged_source): def configure(virtual_source, repository, snapshot): return None +@staged.virtual.initialize() +def initialize(virtual_source, repository): + return None @staged.virtual.mount_specification() def mount_specification(virtual_source, repository):