Configure Dynamic Extensions
You configure dynamic extensions for your plug-in by using properties in the
plugin.json
manifest file. These properties identify the dynamic extensions and provide SPI endpoints for queries from the client code.Dynamic Monitor and Configure extensions are
configured in the same way. Dynamic Summary extensions and dynamic Menu extensions are
similar. Where the steps differ, the examples show the differences.
- Edit the manifest file,plugin.json.{ "manifestVersion": "1.0.0", "requirements": {"plugin.api.version": "1.0.0"} ...
- Within theobjectsobject, locate the type of vSphere managed object for which the plug-in can supply a dynamic extension.{ "manifestVersion": "1.0.0", "requirements": {"plugin.api.version": "1.0.0"} ... "objects": { ... "VirtualMachine": { ...
- Within the managed object type, locate the extension type for which the plug-in can supply a dynamic extension.For a dynamic extension in theSummarytab.... "objects": { ... "VirtualMachine": { ... "summary": { ...For a dynamic extension in theMonitortab.... "objects": { ... "VirtualMachine": { ... "monitor": { ...For a dynamic extension in theConfiguretab.... "objects": { ... "VirtualMachine": { ... "configure": { ...For a dynamic extension in theActionsmenu.... "objects": { ... "VirtualMachine": { ... "menu": { ...
- Within the object representing the extension type object, add adynamicUriproperty to identify the endpoint where the client code will query the plug-in server for its filter choices.If the plug-in manifest server will supply filter choices, you can specify a string containing the URI path. If an auxiliary server will supply filter choices, specify a JSON object containing apathproperty (typestring) and aserverTypeproperty (typestring), where theserverTypecorresponds to theServerInfo.typeproperty in the Extension Manager registration record. TheserverTypevalue maps to the auxiliary server base URI that the user interface code uses to construct the endpoint for the dynamic extension filter query.When you register an auxiliary server that will supply filter choices, itsServerInfo.urlproperty in theExtensionrecord must end with a slash (/). See Registering Auxiliary Plug-in Servers.For a dynamic extension in theSummarytab.... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": "rest/dynamics/vm/summary", ...(if an auxiliary server handles filter queries)... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": { "serverType": "DYNAMIC_AUX_SERVER", "path": "rest/dynamics/vm/summary" }, ...For a dynamic extension in theMonitortab.... "objects": { ... "VirtualMachine": { ... "monitor": { "dynamicUri": "rest/dynamics/vm/monitor", ...(if an auxiliary server handles filter queries)... "objects": { ... "VirtualMachine": { ... "monitor": { "dynamicUri": { "serverType": "DYNAMIC_AUX_SERVER", "path": "rest/dynamics/vm/monitor" }, ...For a dynamic extension in theConfiguretab.... "objects": { ... "VirtualMachine": { ... "configure": { "dynamicUri": "rest/dynamics/vm/configure", ...(if an auxiliary server handles filter queries)... "objects": { ... "VirtualMachine": { ... "configure": { "dynamicUri": { "serverType": "DYNAMIC_AUX_SERVER", "path": "rest/dynamics/vm/configure" }, ...For a dynamic extension in theActionsmenu.... "objects": { ... "VirtualMachine": { ... "menu": { "dynamicUri": "rest/dynamics/vm/actions", ...(if an auxiliary server handles filter queries)... "objects": { ... "VirtualMachine": { ... "menu": { "dynamicUri": { "serverType": "DYNAMIC_AUX_SERVER", "path": "rest/dynamics/vm/actions" }, ...For more information about theServerInfo.typeproperty, see Registering Auxiliary Plug-in Servers.
- At the same level as thedynamicUriproperty, locate theviewsarray or theviewobject (for Summary extensions), theviewsarray (for Monitor or Configure extensions) or theactionsarray (for Menu extensions)For a single dynamic extension in theSummarytab.... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": "rest/dynamics/vm/summary", "view": { ...For multiple dynamic extensions in the Summary tab.... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": "rest/dynamics/vm/summary", "views": [ ... ] } ...For a dynamic extension in theMonitortab.... "objects": { ... "VirtualMachine": { ... "monitor": { "dynamicUri": "rest/dynamics/vm/monitor", "views": [ ...For a dynamic extension in theConfiguretab.... "objects": { ... "VirtualMachine": { ... "configure": { "dynamicUri": "rest/dynamics/vm/configure", "views": [ ...For a dynamic extension in theActionsmenu.... "objects": { ... "VirtualMachine": { ... "menu": { "dynamicUri": "rest/dynamics/vm/actions", "actions": [ ...
- To each view or action that will be treated as dynamic, add thedynamicproperty.For a single dynamic extension in theSummarytab.... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": "rest/dynamics/vm/summary", "view": { "dynamic": true ...For multiple dynamic extensions in the Summary tab.... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": "rest/dynamics/vm/summary", "views": [ { "dynamic": true, ... }, { "dynamic": true, ... } ] } ...For a dynamic extension in theMonitortab.... "objects": { ... "VirtualMachine": { ... "monitor": { "dynamicUri": "rest/dynamics/vm/monitor", "views": [ { "dynamic": true, ...For a dynamic extension in theConfiguretab.... "objects": { ... "VirtualMachine": { ... "configure": { "dynamicUri": "rest/dynamics/vm/configure", "views": [ { "dynamic": true, ...For a dynamic extension in theActionsmenu.... "objects": { ... "VirtualMachine": { ... "menu": { "dynamicUri": "rest/dynamics/vm/actions", "actions": [ { "dynamic": true, ...
- Add anidproperty to each Summary card or Menu action, and anavigationIdto each Monitor or Configure view, if not already present.For a single dynamic extension in theSummarytab.... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": "rest/dynamics/vm/summary", "view": { "dynamic": true "id": "vmSummaryCard", ...For multiple dynamic extensions in the Summary tab.... "objects": { ... "VirtualMachine": { ... "summary": { "dynamicUri": "rest/dynamics/vm/summary", "views": [ { "dynamic": true, "id": "summary-card-1", ... }, { "dynamic": true, "id": "summary-card-2", ... } ] } ...For a dynamic extension in theMonitortab.... "objects": { ... "VirtualMachine": { ... "monitor": { "dynamicUri": "rest/dynamics/vm/monitor", "views": [ { "dynamic": true, "navigationId": "MonitorDynView", ...For a dynamic extension in theConfiguretab.... "objects": { ... "VirtualMachine": { ... "configure": { "dynamicUri": "rest/dynamics/vm/configure", "views": [ { "dynamic": true, "navigationId": "ConfigureDynView", ...For a dynamic extension in theActionsmenu.... "objects": { ... "VirtualMachine": { ... "menu": { "dynamicUri": "rest/dynamics/vm/actions", "actions": [ { "dynamic": true, "id": "TakeAction", ...AnavigationIdoridstring is required to identify the dynamic view or action in the plug-in server's response to a filter query.
The following example shows a
plugin.json
file with a dynamic Summary card, a dynamic Monitor view, a
fixed Configure view, and a dynamic action. The dynamic Summary view is filtered by the
manifest server, which is the default when a specific server is not named. The dynamic
Monitor view is filtered by the the manifest server, configured with an explicit reference.
The dynamic menu action is filtered by an auxiliary server. plugin.json With Dynamic Extensions
{ "manifestVersion": "1.0.0", "requirements": {"plugin.api.version": "1.0.0"}, "configuration": { "nameKey": "Dynamic Extension Manifest Example" } "objects": { "VirtualMachine": { "summary": { "dynamicUri": "rest/dynamics/vm/summary", "view": { "dynamic": true "id": "vmSummaryCard", "uri": "index.html#vm-portlet", } }, "monitor": { "dynamicUri": { "serverType": "MANIFEST_SERVER", "path": "rest/dynamics/vm/monitor" }, "views": [ { "dynamic": true, "navigationId": "MonitorDynView", "uri": "rest/views/vm/monitor/index.html" } ], "configure": { "views": [ { "navigationId": "ConfigureFixView", "uri": "rest/views/vm/configure/index.html" }, "menu": { "dynamicUri": { "serverType": "DYNAMIC_AUX_SERVER", "path": "rest/dynamics/vm/actions" }, "actions": [ { "dynamic": true, "id": "TakeAction", "labelKey": "Take action", "trigger": { "type": "modal", "uri": "rest/actions/vm/action1.html" } } ] } } } }
Implement server-side code to handle filter queries at the endpoints that you configured in the manifest file. For more information about filter queries, see Dynamic Extensions Filter Query.