首页 > 解决方案 > 无法使用 XPath 匹配功能来查找与名称模式与 vRealize Orchestrator 的 VcPlugin 匹配的虚拟机

问题描述

就上下文而言,下面的代码示例是用 Javascript (Mozilla Rhino) 编写的,但VcPlugin实现是用 Java 完成的。vRealize Orchestrator 在执行代码时依赖于这两个运行时,并且一些 Java 构造暴露给通过 Rhino 执行的脚本。我不确定发生的事情是否与这两种语言的独特组合有关,所以我在这两个类别下都标记了这个问题。


在 vRO 7.6 中,我们使用VcPlugin6.5 从 vCenter 中提取清单。我正在尝试返回VC:VirtualMachine与特定命名模式匹配的所有对象。现在我有以下代码使用该XPath starts-with函数,但这并不理想,因为我们需要starts-with为每个可能的字符调用,这些字符在 VM 名称的开头可能是唯一的:

var vCenterVMs = connection.getAllVirtualMachines(
  ['name'],
  "xpath:name[starts-with(.,'acc') or starts-with(.,'aco') or starts-with(.,'acm')]" );

这有效,并返回VC:VirtualMachine名称与模式匹配的任何对象^ac[com]。但是,我尝试使用该XPath matches函数来匹配命名模式,因为表达式更易于维护:

var vCenterVMs = connection.getAllVirtualMachines(
  ['name'],
  'xpath:name[matches(.,"^ac[com]")]' );

这不返回任何内容。此外,^从上述表达式中删除标记不会返回任何内容,就像删除所有正则表达式标记并简单地'acc'使用matches函数查找一样:

var vCenterVMs = connection.getAllVirtualMachines( ['name'], "xpath:name[matches(.,'acc')]" );

我还尝试了在同一个插件的供应商工作流程之一中找到的替代语法,但无济于事(供应商工作流程成功使用matches但使用不同的属性,而不是name):

var vCenterVMs = connection.getAllVirtualMachines( null, "xpath:matches(name, '^ac[com]')]" );

我的第一个想法是,也许这个插件XPath由于某种原因被 1.0 卡住了(1.0 没有定义fn:matches),但是来自同一个插件的其他工作流使用了这个XPath matches功能,所以插件必须实现XPath2.0,如果不是更新的话。

我无法从 VMware 找到有关 vCenter API 或其本身使用的XML架构或XPath版本的VcPlugin文档(vCenter REST API 文档举例说明了在响应中使用 JSON,进一步混淆了水域),但 a 的name属性VC:VirtualMachine是一种类型的String。这里发生了什么starts-with工作正常但等效的正则表达式失败?

标签: javaregexxpathvmwarerhino

解决方案


推荐阅读