如何在我的 Jelastic 清单中进行可选的电子邮件设置并 return 给用户的值?

How can I make an optional email settings in my Jelastic manifest and return the value to the user?

假设我有一个 Jelastic 清单,在设置部分,我要求用户提供电子邮件地址(以设置某些服务)。因为使用 Jelastic 的用户已经使用电子邮件登录 Jelastic,所以向用户建议她使用该电子邮件可能是有意义的。它在清单设置期间节省了她的输入。所以,理想情况下,我想做的是:

settings:
  fields:
    - name: email
      caption: Email
      type: string
      default: ${user.email}

然后,在清单成功文本中,我想显示它,以及已安装的 Jelastic 环境中已部署服务的其他凭据:

success:
  text: |
    **Email**: ${settings.email}

电子邮件通常用作部署在新 Jelastic 环境中的服务中的用户名,在成功文本中,它会显示在相应密码附近。

以上这些都很好,但它不起作用。事实上,我不能在 default 字段中使用 ${user.email} 来设置 email

目前,我发现唯一可行的方法如下:

settings:
  fields:
    - name: useJelasticEmailAsEmail
      type: toggle
      caption: Use Jelastic Email
      value: true
      hidden: false
      showIf:
        false:
          name: email
          caption: email
          type: string
          required: true

然后,我可以用它来安装这样的服务:

onInstall:
- script: 'return { result: 0, email: ${settings.useJelasticEmailAsEmail} ? "${user.email}" : "${settings.email}" };'
- install:
    jps: my-service-manifest.yml
    settings:
      username: ${response.email}

但是,安装 my-service-manifest.yml 后,我无法再访问实际使用的电子邮件,因此我无法在成功文本中使用 ${response.email},除非 my-service-manifest.yml return以某种方式编辑了电子邮件(可能带有 return 语句?)。

问题是,我可能有很多这样的服务要安装,但只有一个需要电子邮件。此外,可能出于某种原因必须首先安装需要电子邮件的服务。在这种情况下,使用上述解决方案,我需要通过所有服务传播电子邮件,以便将其发送到成功文本。电子邮件将被第一个服务使用,并以某种方式 returned 到下一个。下一个服务不需要电子邮件,但必须传播它,因此它应该将其作为设置参数并将其 return 传递给下一个服务,依此类推。清单采用它不需要的参数并不是很好,因此该解决方案可能不是正确的解决方案。

我发现对于一个非常简单的问题来说非常复杂。一定有更容易做的事情,对吧?有人可以给我提示吗?

我需要一个清单解决方案,我有很多这样的可选参数。目前,我对电子邮件和机密有疑问。在我的用例中,这些秘密由我直接在设置中提供,或者它们是自动生成的,例如${fn.password(20)}。有些安装我需要自己设置,有些安装我需要让它们自动生成。

因此,假设我有 2 个可选参数,我找到的工作解决方案如下:

  1. 在我的 jps 清单的 settings 部分,我
settings:
  fields:
    - name: useOptionalParam1
      type: toggle
      caption: Use optional param1
      value: true
      hidden: false
      showIf:
        false:
          name: param1
          caption: Param1
          type: string
          required: true
    - name: useOptionalParam2
      type: toggle
      caption: Use optional param2
      value: true
      hidden: false
      showIf:
        false:
          name: param2
          caption: Param2
          type: string
          required: true
  1. globals 部分定义这些参数的值(对于电子邮件,这不是必需的,因为它被定义为 user.email):
globals:
  OPTIONAL_PARAM1: ${fn.password(20)}
  OPTIONAL_PARAM2: ${fn.password(20)}
  1. 像这样定义一个动作:
actions:
  getOptionalParams:
    - script: 'return { result: 0, param1: ${settings.useOptionalParam1} ? "${globals.OPTIONAL_PARAM1}" : "${settings.param1}", param2: ${settings.useOptionalParam2} ? "${globals.OPTIONAL_PARAM2}" : "${settings.param2}" };'
  1. 必要时调用操作;例如,在成功文本之前:
# settings, globals, nodes sections
[...]

onInstall:
  - myVariousInstalls
  - getOptionalParams

success:
  text: |
    **PARAM1**: ${response.param1}  
    **PARAM2**: ${response.param2}

请注意 onInstall 部分末尾对 getOptionalParams 的最后一次调用。它用于向 success 部分提供 [​​=20=] 对象。有趣的是,这很好用。 getOptionalParams 动作也可以在 myVariousInstalls 动作的任何地方调用。它必须在操作之前调用,例如这样:

actions:
[...]
  myVariousInstalls:
    - getOptionalParams
    - install:
        jps: path/to/manifest
        settings:
          param1: ${response.param1}

这样做,我解决了最初的问题。