
# 发布算子
#### 操作场景
所有开发者均可以创建用于数据处理的算子，审核通过后发布至DWR算子市场，开放给所有华为云用户使用。
当算子被华为云用户使用之后，算子发布者将会获得相应的收益，详情参见[计费说明](https://support.huaweicloud.com/productdesc-dwr/dwr_01_0005.html)。
算子从API上线、开发、到发布的整个流程如[图1]所示，本节主要介绍如何使用DWR发布已开发好的算子到算子市场。
![](https://support.huaweicloud.com/usermanual-dwr/public_sys-resources/note_3.0-zh-cn.png)
算子开发完成后，您可以参考[抽帧截图（自定义算子）](https://support.huaweicloud.com/bestpractice-dwr/dwr_07_0006.html)来验证算子。
图1算子发布流程   
![](https://support.huaweicloud.com/usermanual-dwr/zh-cn_image_0000001215353932.png)
#### 约束与限制
当前发布算子功能仅支持IAM主账号。
#### 前提条件
算子已开发完成，开发规范参考[自定义函数开发规范](https://support.huaweicloud.com/usermanual-dwr/dwr_03_0008.html)，建议使用Go、Python开发（算子的冷启动效果更好）。
算子已在华为云云商店上架，上架指导参考[发布API类商品操作指导](https://support.huaweicloud.com/usermanual-marketplace/sp_topic_0000026.html)。
![](https://support.huaweicloud.com/usermanual-dwr/public_sys-resources/note_3.0-zh-cn.png)
开发的新算子如果要支持同步工作流，需要保证同步工作流最后一个算子返回方式为以下的一种：
- 返回方式1：字符串数据
  ```
  {
      "execution_name":"84a3dd2bd67f43aa9b98cdd74604ca68", //工作流实例名称
      "graph_name":"test_workflow", //工作流名称
      "Records":[  // 处理对象
      ],
       "dynamic_source": {//执行算子的输出结果
       "tasks": [
      {body},  // 直接返回body字符串
      ]
    }
  }
  ```
  
- 返回方式2：文件流数据
  ```
  {
      "execution_name":"84a3dd2bd67f43aa9b98cdd74604ca68", //工作流实例名称
      "graph_name":"test_workflow", //工作流名称
      "Records":[  // 处理对象
      ],
      "dynamic_source":{ //执行算子的输出结果
      "tasks":[
              {   
                      "output":{  // 同步返回的输出文件地址：桶名、对象名、区域
                      "bucket":"bucketname",
                      "object":"objectname",
                      "location":"cn-north-4"
                  }
              }
          ]
      }
  }
  ```
  
 
#### 操作步骤
1. [登录DWR控制台](https://console.huaweicloud.com/dwr/?locale=zh-cn)。
2. 在左侧导航栏选中"发布算子"，进入"发布算子"页面。
3. 单击界面右上角的"发布公共算子"。
4. 配置算子基本信息。 
   表1配置基本信息 
   | 参数     | 说明                 |
   |:---|:---|
   | 算子名称   | 算子名称不能与本用户已有的算子重名。 |
   | 算子提供方  | -                  |
   | 算子描述   | -                  |
   | API链接  | 填写华为云云商店已上架的算子链接。  |
   | 算子分类   | 根据算子市场上提供的分类进行选择。  |
   | 算子logo | 支持主流图片格式。          |
      
   图2算子基本信息   
   ![](https://support.huaweicloud.com/usermanual-dwr/zh-cn_image_0000001215033954.png)
   
   
5. 上传算子文件。 
   上传文件包括：算子代码包、中文和英文帮助文档、中文和英文服务协议文档、中文和英文开源声明、中文和英文测试报告。
   图3上传文件   
   ![](https://support.huaweicloud.com/usermanual-dwr/zh-cn_image_0000001215193942.png)
   
   
6. 配置算子参数。 
   
   | 参数           | 说明                                                                                   |
   |:---|:---|
   | Inputs参数（可选） | 提供算子入参中动态参数对应的参数值，其Key值需要与动态参数中保持一致。                                                 |
   | 动态参数（可选）     | 提供算子入参的参数列表，可配置静态参数或动态参数，动态参数需要从Inputs参数中根据定义的Key取值。                                 |
   | 权限版本         | 华为云统一身份认证（IAM）的权限版本，1.0版本以服务为粒度，提供有限的服务相关角色用于授权。1.1版本支持细粒度授权，可以精确到具体服务的操作、资源以及请求条件等。 |
      
   
   
7. 单击右下角的"提交审核"。 
   审核通过后，算子将发布至算子市场。您可以过滤第三方的算子提供方，查看您发布的算子。
   
   
 
#### 算子参数配置示例
**Inputs参数**
Input结构体参数说明参见[创建工作流API](https://support.huaweicloud.com/api-dwr/dwr_04_0122.html#obs_04_0122__table285619212450)。
![](https://support.huaweicloud.com/usermanual-dwr/public_sys-resources/note_3.0-zh-cn.png)
regex参数设置的正则表达式请使用**[regexploit](https://github.com/doyensec/regexploit)**工具校验。
```
[
{    //算子所在工作流输入列表
"parameter_name": "bucket",
"parameter_value": "",
"value_type": "",
"default": "",
"type": "string",
"label": "Body",
"constraints": {
"regex": ".*"//正则表达式请使用regexploit工具校验
},
"invisible": false,
"description": "doc destination bucket name"
}
]
```
**动态参数**
```
{
"bucket": {
"get_input": "$.inputs.bucket"//该值需要跟inputs参数中的parameter_name取值保持一致
}
}
```
**权限版本**
obs授权参见[对象相关授权项](https://support.huaweicloud.com/api-obs/obs_04_0112.html)和[桶相关授权](https://support.huaweicloud.com/api-obs/obs_04_0111.html)。
```
[
      { //1.1版本支持细粒度授权，可以精确到具体服务的操作、资源以及请求条件等
        "version": "1.1",
        "statement": [
          {
          //对IAM用户组授予OBS指定资源的指定操作权限
            "action": [
              "obs:bucket:HeadBucket",
              "obs:bucket:ListBucketMultipartUploads",
              "obs:object:AbortMultipartUpload",
              "obs:object:PutObject",
              "obs:bucket:GetBucketAcl",
              "obs:object:GetObject"
            ]
          }
        ]
      }      
    ]
```
