案例二

目的

计算并保存文件夹内每个文件的 Hash

案例相关文件

easy-rsa.tar.gz

操作步骤

  1. 创建任务:创建一个计算任务,同时上传任务依赖文件 (tar.gz格式),该任务遍历解压后的文件夹,计算每个文件的 Hash 并保存到/result文件中
  2. 获取结果:任务进行中,读取result结果文件;任务结束后,下载result结果文件

1. 创建任务

1.1 创建 job

本案例中,计算文件 Hash 的逻辑都写在了接口入参的 cmd 参数中

请求

# 注意请把 Authorization 对应的值修改为自己的用户 token
curl --request POST \
  --url 'http://matpool.com:30100/v1/job' \      
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM' \
  --header 'content-type: multipart/form-data' \                                                
  --form 'spec={"diskGB":10}' \
  --form 'envs="SS=ssss;ZZ=qqqqq"' \
  --form file_name=easy-rsa.tar.gz \
  --form easy-rsa.tar.gz=@/home/huangzhiran/tmp/easy-rsa.tar.gz \
  --form 'cmd="find . -type f -print0 | xargs -0 md5sum >>  /mnt/result;"' \
  --form app_name=ubuntu \
  --form app_version=18.04

返回

以下返回表明 job 已被成功创建, 由 job.state 里的内容可知 job 已完成初始化,当前处于排队中的状态

{
    "code":0,
    "msg":"",
    "job":{
        "id":526,
        "ctx":{
            "ownerId":1,
            "nodeId":-1
        },
        "state":{
            "status":1,
            "log":[
                {
                    "id":2579,
                    "status":6,
                    "ts":{
                        "seconds":1562321532
                    },
                    "sourceId":526
                },
                {
                    "id":2580,
                    "status":1,
                    "ts":{
                        "seconds":1562321532
                    },
                    "sourceId":526
                }
            ]
        },
        "status":1,
        "app":{
            "name":"ubuntu",
            "ver":"18.04",
            "envs":"SS=ssss;ZZ=qqqqq",
            "format":2,
            "files":{
                "mnt":"/mnt",
                "input":"input",
                "output":"",
                "stdout":"",
                "stderr":""
            },
            "cmd":"find . -type f -print0 | xargs -0 md5sum >> /mnt/result;",
            "hostname":"",
            "creds":""
        },
        "res":{
            "cpus":0,
            "gpus":0,
            "diskGB":10
        },
        "createTime":{
            "seconds":1562321532
        }
    }
}

2. 获取结果

2.1 通过 job/file_content 接口获取 result 文件内容

header 中的 Range 字段指明了读取文件的范围

请求

# 注意请把 Authorization 对应的值修改为自己的用户 token
# 注意把 jobID 修改为自己创建的 jobID
curl --request GET \
  --url 'http://matpool.com:30100/v1/job/file_content?id=526&path=/result' \ 
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM' \
  --header 'Range: bytes=0-50'

返回

直接返回文件内容

46438b614dcb2175148fa7e0bdc604a4  ./root/.profile

2.2 获取 job 状态

请求

# 注意请把 Authorization 对应的值修改为自己的用户 token
# 注意把 jobID 修改为自己创建的 jobID
curl --request GET \
  --url 'http://matpool.com:30100/v1/job?id=526' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

由 job.state 可知 job 现已完成

{
    "code":0,
    "msg":"",
    "job":{
        "id":526,
        "ctx":{
            "ownerId":1,
            "nodeId":603
        },
        "state":{
            "status":4,
            "log":[
                {
                    "id":2579,
                    "status":6,
                    "ts":{
                        "seconds":1562321532
                    },
                    "sourceId":526
                },
                {
                    "id":2580,
                    "status":1,
                    "ts":{
                        "seconds":1562321532
                    },
                    "sourceId":526
                },
                {
                    "id":2581,
                    "status":2,
                    "ts":{
                        "seconds":1562321533
                    },
                    "sourceId":526
                },
                {
                    "id":2582,
                    "status":3,
                    "ts":{
                        "seconds":1562321558
                    },
                    "sourceId":526
                },
                {
                    "id":2583,
                    "status":4,
                    "ts":{
                        "seconds":1562321950
                    },
                    "sourceId":526
                }
            ]
        },
        "status":4,
        "app":{
            "name":"ubuntu",
            "ver":"18.04",
            "envs":"SS=ssss;ZZ=qqqqq",
            "format":2,
            "files":{
                "mnt":"/mnt",
                "input":"input",
                "output":"",
                "stdout":"",
                "stderr":""
            },
            "cmd":"find . -type f -print0 | xargs -0 md5sum >> /mnt/result;",
            "hostname":"",
            "creds":""
        },
        "res":{
            "cpus":0,
            "gpus":0,
            "diskGB":10
        },
        "createTime":{
            "seconds":1562321532
        }
    }
}

2.3 通过 job/files 接口下载 result 文件

请求

# 注意请把 Authorization 对应的值修改为自己的用户 token
# 注意把 jobID 修改为自己创建的 jobID
curl --request GET \
  --url 'http://matpool.com:30100/v1/job/files?id=526&src_path=/result&dest_name=result' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

直接返回文件内容

85ac22e89166668551f1897025221ecb  ./proc/1/task/1/smaps
9b410a16ec5c6805b06122c2fa126a23  ./proc/1/task/1/smaps_rollup
f9b3a6e1dc0e5433359bde9b848b40a8  ./proc/1/task/1/pagemap

2.4 访问用户根目录

请求

# 注意请把 Authorization 对应的值修改为自己的用户 token
curl --request GET \
  --url 'http://matpool.com:30100/v1/fs?path=/' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

由“1.1 创建 job”步骤的返回可知,该 job 的 id 是 526,相应地,在用户的根目录下有个名为 526 (对应 job id)的文件夹被自动创建

{
    "code":0,
    "msg":"",
    "infos":[
        {
            "name":"526",
            "size":270233,
            "createTime":{
                "seconds":1562321542,
                "nanos":921790399
            },
            "modTime":{
                "seconds":1562321542,
                "nanos":921790399
            },
            "ownerId":0,
            "isDir":true
        }
    ]
}

2.5 访问job目录

查看 526 目录里的内容

请求

# 注意请把 Authorization 对应的值修改为自己的用户 token
curl --request GET \
  --url 'http://matpool.com:30100/v1/fs?path=/526/' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

infos字段显示 526 目录下有一个文件夹 input 和一个文件 result,前者是创建 job 时上传的 *.tar.gz 压缩包解压路径,后者是 job 生成的 result 文件,之后可使用 fs 的 API 来管理这些文件

{
    "code":0,
    "msg":"",
    "infos":[
        {
            "name":"input",
            "size":15340,
            "createTime":{
                "seconds":1562321531,
                "nanos":989803153
            },
            "modTime":{
                "seconds":1562321531,
                "nanos":989803153
            },
            "ownerId":0,
            "isDir":true
        },
        {
            "name":"result",
            "size":254893,
            "createTime":{
                "seconds":1562321968,
                "nanos":964071716
            },
            "modTime":{
                "seconds":1562321968,
                "nanos":964071716
            },
            "ownerId":0,
            "isDir":false
        }
    ]
}

上次修改: 2019-07-12 16:59