实现用于 IP 计划匹配的 DMN - 如何使用 FEEEL 表达式将 CIDIR 与 IP 进行匹配以设置名称

问题描述 投票:0回答:1

目标

目标是通过 DMN 中的决策表运行具有 IP 的设备列表,以根据使用 CIDIR 的 IP 规划来确定设备使用哪种命名约定,以选择要使用的命名模式。

期望

  • 修复编译错误:看来问题出在按位比较上。我知道,它可以用另一种语言正确实现逻辑,但因为我正在努力对其将运行的 DMN 实现保持中立。关于如何在 FEEL 中以不同方式实现 CIDR 匹配的想法,非常棒。
  • 运行
    tDevices
    列表,尽管 DMN 获取具有给定名称模式的
    tIPPlanLine
    列表,以便在后续流程中使用。

当前解决方案设计

DMN 由具有 FEEL 函数的 BKM(业务知识模型)组成,它将 IP 与 CIDIR 进行匹配并返回布尔值和使用 FEEL 函数的决策表。

使用给定的数据类型:

  • t设备(结构)

    • ip
      (字符串)
    • mac
      (字符串)
    • vendor
      (字符串)
    • match
      (布尔值)//这只是一个虚拟占位符,用于进行匹配检查
  • tIPPlanLine(结构)

    • cidrIP
      (字符串)
    • prefixLength
      (字符串)
    • namePattern
      (字符串)
  • tIP段(数量)列表

使用给定函数

CIDRvalidator (boolean)
,它接受以下输入:

  • ip
    (字符串)
  • cidrIp
    (字符串)
  • prefixLength
    (数字)

它运行以下 FEEL 函数,该函数使用 Context 来存储时间值

F CIDRvalidator(布尔值)
F
(ip:(string), cidrIp:(string), prefixLength: (string))
1
Context{}
1
splitIp (tIPSegment)
[for part in split(ip, ".") return number(part)]
1
splitCidrIp (tIPSegment)
[for part in split(cidrIp, ".") return number(part)]
1
ipBits(number)
splitIp[1] * 2**24 + splitIp[2] * 2**16 + splitIp[3] * 2**8 + splitIp[4]
1
cidrBits(number)
splitCidrIp[1] * 2**24 + splitCidrIp[2] * 2**16 + splitCidrIp[3] * 2**8 + splitCidrIp[4]
1
mask(number)
(2**prefixLength - 1) * 2**(32 - prefixLength)
1
<result>
(ipBits & mask) = (cidrBits & mask)

然后,我尝试在决策表中使用此函数,该决策表将

tDevice (Structure)
作为输入并生成
tIPPlanLine
作为输出。我尝试了各种创建决策表的方法,以使其使用该函数并使用
cidrIp
prefixLength
来选择名称。

尝试构建决策表

第一次尝试

(“match”属性不是 tDevice 的一部分)

(输入)设备.ip (输入)Device.mac (输入)设备.供应商 (输入)CIDRvalidator(Device.ip,cidrIp,prefixLength) (输出)cidr (输出)前缀长度 (输出)名称模式
- - - 真实 192.168.1.1 24 名称模式1
- - - 真实 192.168.2.1 24 名称模式2

问题:它重复了输入行。

第二次尝试

(“匹配”属性已添加到tDevice

(输入)设备.ip (输入)Device.mac (输入)设备.供应商 (输入)匹配 (输出)cidr (输出)前缀长度 (输出)名称模式
- - - CIDRvalidator(Device.ip, cidrIp, prefixLength) 192.168.1.1 24 “名称模式1”
- - - CIDRvalidator(Device.ip, cidrIp, prefixLength) 192.168.2.1 24 “名称模式2”

问题:它重复了输入行。

第三次尝试

(输出中的“cidrIp”和“prefixLength”属性被替换为它们的值,以使行唯一(复制这些值是次要的))

(输入)设备.ip (输入)Device.mac (输入)设备.供应商 (输入)匹配 (输出)cidr (输出)前缀长度 (输出)名称模式
- - - CIDRvalidator(Device.ip, "192.168.1.1", 24) 192.168.1.1 24 “名称模式1”
- - - CIDRvalidator(Device.ip, "192.168.2.1", 24) 192.168.2.1 24 “名称模式2”

问题: FEEL 表达式存在语法错误。

[ERROR] Error compiling FEEL expression '(ipBits & mask) = (cidrBits & mask)' for name 'CIDRvalidator' on node 'CIDRvalidator': syntax error near '&'

DMN 的现状

<?xml version="1.0" encoding="UTF-8"?>
<dmn:definitions xmlns:dmn="http://www.omg.org/spec/DMN/20180521/MODEL/" xmlns="https://kiegroup.org/dmn/_8213A7EA-FB3C-4323-8E45-D1AE2F2CDCB3" xmlns:feel="http://www.omg.org/spec/DMN/20180521/FEEL/" xmlns:kie="http://www.drools.org/kie/dmn/1.2" xmlns:dmndi="http://www.omg.org/spec/DMN/20180521/DMNDI/" xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" id="_80BEA9F1-0F0C-4FBC-ABBB-8A4F66A10B9C" name="ip_plan" typeLanguage="http://www.omg.org/spec/DMN/20180521/FEEL/" namespace="https://kiegroup.org/dmn/_8213A7EA-FB3C-4323-8E45-D1AE2F2CDCB3">
  <dmn:extensionElements/>
  <dmn:itemDefinition id="_DDC31CD8-7CB4-4993-B0EE-85131DFDA7C4" name="tDevice" isCollection="false">
    <dmn:itemComponent id="_3EFAF0CF-6490-4F55-A40C-DF47AB112388" name="ip" isCollection="false">
      <dmn:typeRef>string</dmn:typeRef>
    </dmn:itemComponent>
    <dmn:itemComponent id="_A77DC46A-B52A-4A69-9FE7-BBA7C2014578" name="mac" isCollection="false">
      <dmn:typeRef>string</dmn:typeRef>
    </dmn:itemComponent>
    <dmn:itemComponent id="_ECCE017F-FB81-4D39-83D5-490798BDC7E8" name="vendor" isCollection="false">
      <dmn:typeRef>string</dmn:typeRef>
    </dmn:itemComponent>
    <dmn:itemComponent id="_5775B59C-D190-474A-9E72-0E810F658685" name="match" isCollection="false">
      <dmn:typeRef>boolean</dmn:typeRef>
    </dmn:itemComponent>
  </dmn:itemDefinition>
  <dmn:itemDefinition id="_CBF7CF1B-DAC1-41FE-9B44-B3AFBCFBA553" name="tIPPlanLine" isCollection="false">
    <dmn:itemComponent id="_56B199F3-BB24-4E7A-B6A0-FE944867B950" name="cidrIP" isCollection="false">
      <dmn:typeRef>string</dmn:typeRef>
    </dmn:itemComponent>
    <dmn:itemComponent id="_5B3A06F6-FEF9-411D-9D5C-CB8DACB9CE46" name="prefixLength" isCollection="false">
      <dmn:typeRef>string</dmn:typeRef>
    </dmn:itemComponent>
    <dmn:itemComponent id="_B7A96201-879B-4EEE-9244-8198CF085C64" name="namePattern" isCollection="false">
      <dmn:typeRef>string</dmn:typeRef>
    </dmn:itemComponent>
  </dmn:itemDefinition>
  <dmn:itemDefinition id="_CFE6F064-C8FE-42C8-878D-84B72A05F972" name="tIPSegments" isCollection="true">
    <dmn:typeRef>number</dmn:typeRef>
  </dmn:itemDefinition>
  <dmn:inputData id="_19F5D0A7-D55D-4E17-9BAE-7359B0C2FE21" name="Device">
    <dmn:extensionElements/>
    <dmn:variable id="_F7A74B32-C449-4F80-A879-3D65722C3CC3" name="Device" typeRef="tDevice"/>
  </dmn:inputData>
  <dmn:decision id="_E0CF4F27-2184-4C01-BE0B-314EDCE8441D" name="IPplanLine">
    <dmn:extensionElements/>
    <dmn:variable id="_DE1B32F5-F93F-4341-9D6D-B087E16755A4" name="IPplanLine" typeRef="tIPPlanLine"/>
    <dmn:informationRequirement id="_DE116BF0-FC7D-4AEC-AAC0-BE2D67EACC41">
      <dmn:requiredInput href="#_19F5D0A7-D55D-4E17-9BAE-7359B0C2FE21"/>
    </dmn:informationRequirement>
    <dmn:knowledgeRequirement id="_AEB52860-B199-438A-9A34-C59A08B28ECC">
      <dmn:requiredKnowledge href="#_6FE98E04-586E-46D3-BB1D-E2E2FB305791"/>
    </dmn:knowledgeRequirement>
    <dmn:decisionTable id="_9059DF09-BB5D-4B93-85E8-98666481B9CA" hitPolicy="FIRST" preferredOrientation="Rule-as-Row">
      <dmn:input id="_8D618DA3-4BC1-4C77-AB95-6B0C43B32DA6">
        <dmn:inputExpression id="_743D7EBE-2B2B-4EE5-B4DE-33D1D241D0EE">
          <dmn:text>Device.ip</dmn:text>
        </dmn:inputExpression>
      </dmn:input>
      <dmn:input id="_A5E17F4F-5A87-489B-AE41-59DD69581B4D">
        <dmn:inputExpression id="_B19A149E-4257-4656-BD00-90935F09E16B" typeRef="string">
          <dmn:text>Device.mac</dmn:text>
        </dmn:inputExpression>
      </dmn:input>
      <dmn:input id="_1CC9B798-BDC2-44E2-AE95-1D34F0D3A2CF">
        <dmn:inputExpression id="_4ADA3384-F73A-471E-8F24-2AFAD6904AD4" typeRef="string">
          <dmn:text>Device.vendor</dmn:text>
        </dmn:inputExpression>
      </dmn:input>
      <dmn:input id="_4DAF1A7A-6330-4388-B49F-A45DF96D16AD">
        <dmn:inputExpression id="_8530615F-DA05-468F-A3A8-7A108014BD46" typeRef="boolean">
          <dmn:text>Device.match</dmn:text>
        </dmn:inputExpression>
      </dmn:input>
      <dmn:output id="_DDCAFA4F-7756-41A1-860D-6A1DD21B0F3E" name="cidrIP" typeRef="string"/>
      <dmn:output id="_723BE867-D081-4B7F-AB86-AFE4BB176A90" name="namePattern" typeRef="string"/>
      <dmn:output id="_7C5554BD-C2D8-4DDB-9194-3D5B39A2136D" name="prefixLength" typeRef="number"/>
      <dmn:annotation name="annotation-1"/>
      <dmn:rule id="_B874FE75-6478-4F28-9FE0-88FB601B41E2">
        <dmn:inputEntry id="_ED696F9F-6E9D-48A0-8905-E01857B05868">
          <dmn:text>-</dmn:text>
        </dmn:inputEntry>
        <dmn:inputEntry id="_BC1C6BE6-63CA-480A-8155-81B2BACCE39C">
          <dmn:text>-</dmn:text>
        </dmn:inputEntry>
        <dmn:inputEntry id="_AB4F5322-734F-4C93-9AF0-829151AD1587">
          <dmn:text>-</dmn:text>
        </dmn:inputEntry>
        <dmn:inputEntry id="_68947F2A-D021-4DC4-8F78-7BBFD20DF3DF">
          <dmn:text>CIDRvalidator(Device.ip,"10.56.11.222",24)</dmn:text>
        </dmn:inputEntry>
        <dmn:outputEntry id="_E592BEDC-24F0-4A48-9AA5-41D9562F9A26">
          <dmn:text>"10.56.11.222"</dmn:text>
        </dmn:outputEntry>
        <dmn:outputEntry id="_F710DBFE-255D-4A15-B82E-AAE132A5CB2C">
          <dmn:text>"name1"</dmn:text>
        </dmn:outputEntry>
        <dmn:outputEntry id="_5F9C9052-4146-479D-86BC-E86732F6AEE4">
          <dmn:text>24</dmn:text>
        </dmn:outputEntry>
        <dmn:annotationEntry>
          <dmn:text/>
        </dmn:annotationEntry>
      </dmn:rule>
      <dmn:rule id="_61F5698F-EBDE-4AB1-9C97-C572A46A645D">
        <dmn:inputEntry id="_AC6CCC25-2DAA-4F27-B005-A392C03B3D69">
          <dmn:text>-</dmn:text>
        </dmn:inputEntry>
        <dmn:inputEntry id="_3469243A-E23E-402C-B14B-8E9186B1F97B">
          <dmn:text>-</dmn:text>
        </dmn:inputEntry>
        <dmn:inputEntry id="_FAA65F8D-ADD1-4399-9629-537BB7624572">
          <dmn:text>-</dmn:text>
        </dmn:inputEntry>
        <dmn:inputEntry id="_6E5A1053-411D-448F-BB4D-D91141415642">
          <dmn:text>CIDRvalidator(Device.ip,"10.56.21.8",24)</dmn:text>
        </dmn:inputEntry>
        <dmn:outputEntry id="_351FEF01-D875-4F6B-A01C-229E4B6A4F93">
          <dmn:text>"10.56.21.8"</dmn:text>
        </dmn:outputEntry>
        <dmn:outputEntry id="_CDB14B6F-C537-4784-AF6E-4ECF9C4A4485">
          <dmn:text>"name2"</dmn:text>
        </dmn:outputEntry>
        <dmn:outputEntry id="_691324BE-A9DB-48B7-9568-0AB91283CFA2">
          <dmn:text>24</dmn:text>
        </dmn:outputEntry>
        <dmn:annotationEntry>
          <dmn:text/>
        </dmn:annotationEntry>
      </dmn:rule>
    </dmn:decisionTable>
  </dmn:decision>
  <dmn:businessKnowledgeModel id="_6FE98E04-586E-46D3-BB1D-E2E2FB305791" name="CIDRvalidator">
    <dmn:extensionElements/>
    <dmn:variable id="_2B2A3D19-C45E-4EAD-8DC0-D81BA1D183D3" name="CIDRvalidator" typeRef="boolean"/>
    <dmn:encapsulatedLogic id="_6307CC06-C3AC-4A34-B833-E81C7721D0D5" kind="FEEL">
      <dmn:formalParameter id="_A8442321-71DB-4142-A8AD-75D1859C649F" name="ip" typeRef="string"/>
      <dmn:formalParameter id="_6904C2A7-7BF2-4F00-B74D-FB46E2F95D8D" name="cidrIp" typeRef="string"/>
      <dmn:formalParameter id="_F5A37C49-D10C-4BC5-B8A1-71E3D5849EFB" name="prefixLength" typeRef="number"/>
      <dmn:context id="_957FE2BD-70DE-4762-AC21-C998ADB67341">
        <dmn:contextEntry>
          <dmn:variable id="_8DA684EA-CA55-46E3-8774-0D8A1A0E16FD" name="splitIp" typeRef="tIPSegments">
            <dmn:description>Split IP address into numerical parts</dmn:description>
          </dmn:variable>
          <dmn:literalExpression id="_972AACD9-3443-48E2-8697-AF20FD4DBFB5">
            <dmn:text>[for part in split(ip, ".") return number(part)]</dmn:text>
          </dmn:literalExpression>
        </dmn:contextEntry>
        <dmn:contextEntry>
          <dmn:variable id="_ADA7E3AC-0E7B-42DB-BD80-6387F9E8CAB9" name="splitCidrIp" typeRef="tIPSegments">
            <dmn:description>Split CIDR IP address into numerical parts</dmn:description>
          </dmn:variable>
          <dmn:literalExpression id="_20CA00E3-9838-41E9-985E-CEBA4C5FC035">
            <dmn:text>[for part in split(cidrIp, ".") return number(part)]</dmn:text>
          </dmn:literalExpression>
        </dmn:contextEntry>
        <dmn:contextEntry>
          <dmn:variable id="_AB3A623E-342B-48CA-98AC-1355F5ACAA25" name="ipBits" typeRef="number">
            <dmn:description>Convert split parts to IP bits</dmn:description>
          </dmn:variable>
          <dmn:literalExpression id="_C9CE7B83-E441-47C9-AE35-BD8786EC19BA">
            <dmn:text>splitIp[1] * 2**24 + splitIp[2] * 2**16 + splitIp[3] * 2**8 + splitIp[4]</dmn:text>
          </dmn:literalExpression>
        </dmn:contextEntry>
        <dmn:contextEntry>
          <dmn:variable id="_D072192F-95B4-4C17-89B8-7DD24EACDC1F" name="cidrBits" typeRef="number">
            <dmn:description>Convert split parts to CIDR IP bits</dmn:description>
          </dmn:variable>
          <dmn:literalExpression id="_1B107F0B-22CD-4FF3-818B-73DF7C138C92">
            <dmn:text>splitCidrIp[1] * 2**24 + splitCidrIp[2] * 2**16 + splitCidrIp[3] * 2**8 + splitCidrIp[4]</dmn:text>
          </dmn:literalExpression>
        </dmn:contextEntry>
        <dmn:contextEntry>
          <dmn:variable id="_60A2DE4A-29E0-4815-80DD-64AF0B948B24" name="mask" typeRef="number">
            <dmn:description>Generate mask</dmn:description>
          </dmn:variable>
          <dmn:literalExpression id="_8F50D5B8-1444-4C89-9DDA-E63ABC0D7DD4">
            <dmn:text>(2**prefixLength - 1) * 2**(32 - prefixLength)</dmn:text>
          </dmn:literalExpression>
        </dmn:contextEntry>
        <dmn:contextEntry>
          <dmn:literalExpression id="_B3CEE1BC-E004-457E-B200-28A60280D229">
            <dmn:text>(ipBits &amp; mask) = (cidrBits &amp; mask)</dmn:text>
          </dmn:literalExpression>
        </dmn:contextEntry>
      </dmn:context>
    </dmn:encapsulatedLogic>
  </dmn:businessKnowledgeModel>
  <dmndi:DMNDI>
    <dmndi:DMNDiagram id="_65E29651-CE18-4371-A45A-323DE635E4B9" name="DRG">
      <di:extension>
        <kie:ComponentsWidthsExtension>
          <kie:ComponentWidths dmnElementRef="_9059DF09-BB5D-4B93-85E8-98666481B9CA">
            <kie:width>50</kie:width>
            <kie:width>100</kie:width>
            <kie:width>100</kie:width>
            <kie:width>100</kie:width>
            <kie:width>286</kie:width>
            <kie:width>100</kie:width>
            <kie:width>100</kie:width>
            <kie:width>100</kie:width>
            <kie:width>100</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_957FE2BD-70DE-4762-AC21-C998ADB67341">
            <kie:width>50</kie:width>
            <kie:width>120</kie:width>
            <kie:width>279</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_972AACD9-3443-48E2-8697-AF20FD4DBFB5">
            <kie:width>279</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_20CA00E3-9838-41E9-985E-CEBA4C5FC035">
            <kie:width>279</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_C9CE7B83-E441-47C9-AE35-BD8786EC19BA">
            <kie:width>279</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_1B107F0B-22CD-4FF3-818B-73DF7C138C92">
            <kie:width>279</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_8F50D5B8-1444-4C89-9DDA-E63ABC0D7DD4">
            <kie:width>279</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_B3CEE1BC-E004-457E-B200-28A60280D229">
            <kie:width>279</kie:width>
          </kie:ComponentWidths>
          <kie:ComponentWidths dmnElementRef="_6307CC06-C3AC-4A34-B833-E81C7721D0D5">
            <kie:width>50</kie:width>
            <kie:width>469</kie:width>
          </kie:ComponentWidths>
        </kie:ComponentsWidthsExtension>
      </di:extension>
      <dmndi:DMNShape id="dmnshape-drg-_19F5D0A7-D55D-4E17-9BAE-7359B0C2FE21" dmnElementRef="_19F5D0A7-D55D-4E17-9BAE-7359B0C2FE21" isCollapsed="false">
        <dmndi:DMNStyle>
          <dmndi:FillColor red="255" green="255" blue="255"/>
          <dmndi:StrokeColor red="0" green="0" blue="0"/>
          <dmndi:FontColor red="0" green="0" blue="0"/>
        </dmndi:DMNStyle>
        <dc:Bounds x="550" y="172" width="100" height="50"/>
        <dmndi:DMNLabel/>
      </dmndi:DMNShape>
      <dmndi:DMNShape id="dmnshape-drg-_E0CF4F27-2184-4C01-BE0B-314EDCE8441D" dmnElementRef="_E0CF4F27-2184-4C01-BE0B-314EDCE8441D" isCollapsed="false">
        <dmndi:DMNStyle>
          <dmndi:FillColor red="255" green="255" blue="255"/>
          <dmndi:StrokeColor red="0" green="0" blue="0"/>
          <dmndi:FontColor red="0" green="0" blue="0"/>
        </dmndi:DMNStyle>
        <dc:Bounds x="378" y="304" width="100" height="50"/>
        <dmndi:DMNLabel/>
      </dmndi:DMNShape>
      <dmndi:DMNShape id="dmnshape-drg-_6FE98E04-586E-46D3-BB1D-E2E2FB305791" dmnElementRef="_6FE98E04-586E-46D3-BB1D-E2E2FB305791" isCollapsed="false">
        <dmndi:DMNStyle>
          <dmndi:FillColor red="255" green="255" blue="255"/>
          <dmndi:StrokeColor red="0" green="0" blue="0"/>
          <dmndi:FontColor red="0" green="0" blue="0"/>
        </dmndi:DMNStyle>
        <dc:Bounds x="204" y="402" width="100" height="50"/>
        <dmndi:DMNLabel/>
      </dmndi:DMNShape>
      <dmndi:DMNEdge id="dmnedge-drg-_DE116BF0-FC7D-4AEC-AAC0-BE2D67EACC41-AUTO-SOURCE-AUTO-TARGET" dmnElementRef="_DE116BF0-FC7D-4AEC-AAC0-BE2D67EACC41">
        <di:waypoint x="600" y="172"/>
        <di:waypoint x="428" y="354"/>
      </dmndi:DMNEdge>
      <dmndi:DMNEdge id="dmnedge-drg-_AEB52860-B199-438A-9A34-C59A08B28ECC" dmnElementRef="_AEB52860-B199-438A-9A34-C59A08B28ECC">
        <di:waypoint x="254" y="427"/>
        <di:waypoint x="428" y="354"/>
      </dmndi:DMNEdge>
    </dmndi:DMNDiagram>
    <dmndi:DMNDiagram id="_C026D2CA-057A-41BB-B495-BF3503771880" name="new-diagram">
      <di:extension>
        <kie:ComponentsWidthsExtension/>
      </di:extension>
    </dmndi:DMNDiagram>
  </dmndi:DMNDI>
</dmn:definitions>
ip cidr dmn feel-language
1个回答
0
投票

修复编译错误:看起来问题是按位比较。

问题:FEEL 表达式存在语法错误。

[错误] 为节点“CIDRvalidator”上的名称“CIDRvalidator”编译 FEEL 表达式“(ipBits & mask) = (cidrBits & mask)”时出错:“&”附近的语法错误

DMN规范v1.5,我看不到任何关于按位运算的提及。

因此,在我看来,使用

number & number
并不是有效的 FEEL 语法。

正如 @jomarko 在 comment 中提到的,这里的务实方法是将其委托给进行外部调用的 BKM。 (或将 FEEL 中的按位运算符实现为自定义函数)。

© www.soinside.com 2019 - 2024. All rights reserved.