---
# System prepended metadata

title: Test automation restful APIs design for Software Smart Factory
tags: [Test automation, Smart factory, Testlink]

---

---
title: 'Test automation restful APIs design for Software Smart Factory'
disqus: hackmd
---
# Test automation APIs design for Software Smart Factory(SSF)
DRAFT rev.20230301. Continuous improvement and modification.


# Table of Contents

[TOC]

# APIs design
## 1. Test jobs
### 1.1 getTestQueuingJobs(plan_match_keyword)

**Parameter:**
| Args         | Type   | Description                                                      |
| ------------ | ------ | ---------------------------------------------------------------- |
| plan_match_keyword | String | optional. only return the jobs that contain the keyword in <tl_test_plan> value. |

**Return:**
return current queuing jobs of Test.
> time unit is second; 
  the lower the order, the higher the priority.


http://xxx.xxx.xxx/getTestQueuingJobs
Sample:
```
request:
{
    "plan_match_keyword":"6490_A11"
}

return:
{
    "status":"ok",
    "message":
    [
        {
            "job_id":1,
            "job_name":"test_mainjob",
            "job_owner":"Jack_Ma",
            "project_name":"Jaws",
            "tl_test_project":"SW_Zebra_A11",
            "tl_test_plan":"TP_Regression_6490_A11_Jaws_V1_20230413",
            "test_type":"Sanity",
            "sub_jobs":[
                {
                    "sub_job_id":100,
                    "sub_job_name":"test_mainjob_subjob_1",
                    "tl_test_build":"TC58_Jaws_Android_R_11-06-13.00-RG-U00-PRD-ATH-04_2022-01-14",
                    "model":"TC57",
                    "queue_time":1800,
                    "estimated_to_start_time":300,
                    "order":2
                },
                {
                    "sub_job_id":101,
                    "sub_job_name":"test_mainjob_subjob_2",
                    "tl_test_build":"TC58_Jaws_Android_R_11-06-13.00-RG-U00-PRD-ATH-04_2022-01-14",
                    "model":"TC55",
                    "queue_time":1800,
                    "estimated_to_start_time":300,
                    "order":3
                }，
                ...
            ]
        }，
        ...
    ]
}
```
### 1.2 getTestTestingJobs(plan_match_keyword)
**Parameter:**
| Args         | Type   | Description                                                      |
| ------------ | ------ | ---------------------------------------------------------------- |
| plan_match_keyword | String | optional. only return the jobs that contain the keyword in <tl_test_plan> value. |

**Return:**
return current testing jobs of Test.
> time unit is second; 

http://xxx.xxx.xxx/getTestTestingJobs
Sample:
```
request:
{
    "plan_match_keyword":"6490_A11"
}

return:
{
    "status":"ok",
    "message":
    [
        {
            "job_id":1,
            "job_name":"test_mainjob",
            "job_owner":"Jack_Ma",
            "testing_time":1800,
            "estimated_to_finish_time":300,
            "project_name":"Jaws",
            "tl_test_project":"SW_Zebra_A11",
            "tl_test_plan":"TP_Regression_6490_A11_Jaws_V1_20230413",
            "test_type":"Sanity",
            "sub_jobs":[
                {
                    "sub_job_id":100,
                    "sub_job_name":"test_mainjob_subjob_1",
                    "machine_name":"hostName1",
                    "dut_sn":"serialNumber1",
                    "dut_model":"TC57",
                    "tl_test_build":"TC58_Jaws_Android_R_11-06-13.00-RG-U00-PRD-ATH-04_2022-01-14",
                    "job_conditions":"NFC,Camera,SIM",
                    "reservation_id":123,
                    "completed_testcase":10,
                    "total_testcase":12,
                    "node_name":"nodeName30"
                },
                {
                    "sub_job_id":101,
                    "sub_job_name":"test_mainjob_subjob_2",
                    "machine_name":"hostName1",
                    "dut_sn":"serialNumber2",
                    "dut_model":"TC57",
                    "tl_test_build":"TC58_Jaws_Android_R_11-06-13.00-RG-U00-PRD-ATH-04_2022-01-14",
                    "job_conditions":"NFC,Camera,SIM",
                    "reservation_id":124,
                    "completed_testcase":9,
                    "total_testcase":9,
                    "node_name":"nodeName31"
                }
                ...
            ]
        },
        ...
    ]
}
```
### 1.3 getTestCompletedJobs(start_datetime,end_datetime,plan_match_keyword)
> Note: 
> 1. only returns main jobs.
> 2. suitable for the following UI scenarios: 
Distribution by owner, Distribution by time,  Distribution by Test machine, Distribution by DUT, Distribution by project, average queuing time, average test time, jobs details list, download test result.
    
**Parameter:**
| Args      | Type   | Description                                              |
| --------- | ------ | -------------------------------------------------------- |
| start_datetime | String | mandatory. the start time for query, format is yyyy-MM-dd HH:mm:ss |
| end_datetime | String | mandatory. the end time for query, format is yyyy-MM-dd HH:mm:ss  |
| plan_match_keyword | String | optional. only return the jobs that contain the keyword in <tl_test_plan> value. |

**Return:**
If have date parameters, returns the completed jobs of Test for the specific scope.
> 1. timestamp format is <yyyy-MM-dd HH:mm:ss>; 
> 2. start_datetime <= finished_datetime <= end_datetime
  

http://xxx.xxx.xxx/getTestCompletedJobs
Sample:
```
request:
{
    "start_datetime":"2023-03-01 03:00:00",
    "end_datetime":"2023-03-02 15:00:00",
    "plan_match_keyword":"6490_A11"
}

return:
{
    "status":"ok",
    "message":
    [
        {
            "job_id":1,
            "job_name":"test_mainjob",
            "job_owner":"Jack_Ma",
            "project_name":"Jaws",
            "create_test_datetime":"2023-02-28 15:00:00",
            "tl_test_project":"SW_Zebra_A11",
            "tl_test_plan":"TP_Regression_6490_A11_Jaws_V1_20230413",
            "test_type":"Sanity",
            "sub_jobs":[
                {
                    "sub_job_id":100,
                    "sub_job_name":"test_mainjob_subjob_1",
                    "machine_name":"hostName1",
                    "dut_sn":"serialNumber1",
                    "dut_model":"TC57",
                    "tl_test_build":"TC58_Jaws_Android_R_11-06-13.00-RG-U00-PRD-ATH-04_2022-01-14",
                    "job_conditions":"NFC,Camera,SIM",
                    "reservation_id":123,
                    "start_test_datetime":"2023-02-28 20:00:00",
                    "finished_datetime":"2023-03-01 09:00:20",
                    "pass_rate":"12/12",
                    "tl_result_link":"http://xxx.xxx.xxx/WiReady/x/x/x/result.html",
                    "node_name":"nodeName30"
                },
                {
                    "sub_job_id":101,
                    "sub_job_name":"test_mainjob_subjob_2",
                    "machine_name":"hostName1",
                    "dut_sn":"serialNumber2",
                    "dut_model":"TC57",
                    "tl_test_build":"TC58_Jaws_Android_R_11-06-13.00-RG-U00-PRD-ATH-04_2022-01-14",
                    "job_conditions":"NFC,Camera,SIM",
                    "reservation_id":124,
                    "start_test_datetime":"2023-02-28 20:00:00",
                    "finished_datetime":"2023-03-01 09:00:20",
                    "pass_rate":"12/12",
                    "tl_result_link":"http://xxx.xxx.xxx/WiReady/x/x/x/result.html",
                    "node_name":"nodeName31"
                },
                ...
            ]
        },
        ...
    ]
}
```
### 1.4 moveTestJobToTop(job_id)
> Note: 
    1. Approval process will be handled by SSF system.
    
**Parameter:**
| Args | Type | Description |
| -------- | -------- | -------- |
| job_id     | int     | mandatory. the job id which you want to operate|

**Return:**
return operation result

http://xxx.xxx.xxx/moveTestJobToTop
Sample:
```
request:
{
    "job_id":1
}

return:
{
    "status":"ok",
    "message":"ok"
}
```
### 1.5 abortTestJob(job_id)
> Note:
    1.only suitable for queuing and testing job.
    
**Parameter:**
| Args | Type | Description |
| -------- | -------- | -------- |
| job_id   | int | mandatory. the job id which you want to operate;it's the id of main job.   |

**Return:**
return operation result

http://xxx.xxx.xxx/abortTestJob
Sample:
```
request:
{
    "job_id":1
}

return:
{
    "status":"ok",
    "message":"ok"
}
```
    
### [TBD]1.6 getTimelineOfJob(job_id)
>Note: need to implement on both BC side and Testlink side.
    
**Parameter:**
| Args | Type | Description |
| -------- | -------- | -------- |
| job_id  | int  | mandatory. the job id which you want to operate   |

**Return:**
return operation result
> timestamp format is <yyyy-MM-dd HH:mm:ss>; 

http://xxx.xxx.xxx/getTimelineOfJob
Sample:
```
request:
{
    "job_id":15
}

return:
{
    "status":"ok",
    "message":
    {
        "build_creation_datetime":"2022-12-22 08:00:00",
        "build_start_datetime":"2022-12-22 09:00:00",
        "build_finished_datetime":"2022-12-22 13:00:00",
        "test_creation_datetime":"2023-01-12 19:00:00",
        "test_start_datetime":"2023-01-12 20:00:00",
        "test_finished_datetime":"2023-01-13 10:00:00",
    }
}
```
    


## 2. DUT reservation
### 2.1 createDUTReservationRequest(reservation_id,user,machine_name,model,sn,start_datetime,end_datetime,project_name,reason,key)
> Note: Approval process and get DUT's reservation will be handled by SSF system.
    
**Parameter:**
| Args           | Type   | Description                                                          |
| -------------- | ------ | -------------------------------------------------------------------- |
| reservation_id | int    | mandatory. the id of reservation                                                |
| user           | string | mandatory. user name who request the reservation                                |
| machine_name   | string | mandatory. the test machine                                                     |
| model          | string | mandatory. dut model name                                                       |
| sn             | string | mandatory. DUT's serial number                                                  |
| start_datetime | string | mandatory. the start date time for the reservation,format is <yyyy-MM-dd HH:mm> |
| end_datetime   | string | mandatory. the end date time for the reservation, format is <yyyy-MM-dd HH:mm>  |
| project_name | string | mandatory. the project name of the reservation|
| reason  |   string     |  mandatory.the reason of reservation |
| key   | string | mandatory. reservation keyword  |

**Return:**
return operation result

http://xxx.xxx.xxx/createDUTReservationRequest
Sample:
```
request:
{
    "reservation_id":123,
    "user":"Jack_Ma",
    "machine_name":"hostName1",
    "model":"TC57",
    "sn":"12343535E0001",
    "start_datetime":"2023-05-01 08:00",
    "end_datetime":"2023-05-01 17:00",
    "project_name":"Jaws",
    "reason":"Jaws test",
    "key":"00123456"
}

return:
{
    "status":"ok",
    "message":"ok"
}
```
### [TBD]2.2 getDUTReservationInfo(reservation_ids)
> Note: it may be a local API.

**Parameter:**
| Args           | Type   | Description|
| -------------- | ------ | ----------------------------------------------------------------------- |
| reservation_ids | array    | mandatory. the reservation id list which need to query |

**Return:**
return the information of reservation per the query condition.

http://xxx.xxx.xxx/getDUTReservationInfo
Sample:
```
request:
{
    "reservation_ids":"123,125"
}

return:
{
    "status":"ok",
    "message":
    {
        "123":{
            "user":"Jack_Ma",
            "machine_name":"hostName1",
            "model":"TC57",
            "sn":"12343535E0001",
            "start_datetime":"2023-05-01 08:00",
            "end_datetime":"2023-05-01 17:00",
            "project_name":"Jaws",
            "reason":"Jaws test"
        },
        "125":{
            "user":"Susan_Ji",
            "machine_name":"hostName2",
            "model":"Bobcat",
            "sn":"12343535E8761",
            "start_datetime":"2023-05-01 08:00",
            "end_datetime":"2023-05-01 17:00",
            "project_name":"Bobcat",
            "reason":"Bobcat test"
        },
        ...
    }
}
```
### 2.3 cancelDUTReservation(reservation_id)
> Note: 
    1. can only cancel the reservation which is not started yet.
    
**Parameter:**
| Args | Type | Description |
| -------- | -------- | -------- |
| reservation_id     | int     | mandatory. the reservation id which you want to operate   |

**Return:**
return operation result

http://xxx.xxx.xxx/cancelDUTReservation
Sample:
```
request:
{
    "reservation_id":123
}

return:
{
    "status":"ok",
    "message":"ok"
}
```

## 3. Test farm
### 3.1 getTestMachineList()
**No Parameter:**

**Return:**
return all test machines' information
> timestamp format is <yyyy-MM-dd HH:mm:ss>; 

http://xxx.xxx.xxx/getTestMachineList
Sample:
```
return:
{
    "status":"ok",
    "message":
    [
        {
            "id":100,
            "machine_name":"hostName1",
            "ip":"192.168.0.102",
            "location":"wks",
            "network":"OA",
            "os":"Linux",
            "owner":"Jack_Ma",
            "type":"NB",
            "status":"Online",
            "update_time":"2023-03-02 08:00:00"
        },
        ...
    ]
}
```
### 3.2 getDUTList(machine_names)
**Parameter:**
| Args         | Type   | Description                                                 |
| ------------ | ------ | ----------------------------------------------------------- |
| machine_names | array | Optional. can only return DUTs under the specific test machine |

**Return:**
return all test DUTs' information(match the given condition).
> timestamp format is <yyyy-MM-dd HH:mm:ss>; 

<br>   
    
http://xxx.xxx.xxx/getDUTList
Sample:
```
request:
{
    "machine_names":"hostName1,hostName2"
}

return:
{
    "status":"ok",
    "message":
    {
        "hostName1":
        [
            {
                "id":100,
                "sn":"12343535E0001",
                "machine_name":"hostName1",
                "model":"TC57",
                "dut_conditions":"NFC,Camera,SIM",
                "phase":"EV1",
                "priority":
                {
                    "0":"1",
                    "1":"2",
                    "2":"4",
                    "3":"5",
                    "4":""
                },
                "owner":"Jack_Ma",
                "status":"Testing",
                "update_time":"2023-03-02 08:00:00",
                "reservation_id":123,
                "node_name":"xxx_xxx"
            },
            ...
        ],
        "hostName2":
        [
             ...   
        ]
    }

}
```
    
### 3.3 getDUTAvailability(start_date,end_date)
**Parameter:**
| Args         | Type   | Description                                                 |
| ------------ | ------ | ----------------------------------------------------------- |
| start_date | string | mandatory, the start date for the query,format is <yyyy-MM-dd> |
| end_date   | string | mandatory, the end date for the query, format is <yyyy-MM-dd>  |

**Return:**
return all test DUTs' availability(match the given condition).

<br>   
    
http://xxx.xxx.xxx/getDUTAvailability
Sample:
```
request:
{
    "start_date":"2023-03-02",
    "end_date":"2023-03-10"
}

return:
{
    "status":"ok",
    "message":
    {
        "2023-03-02":[
            {
                "sn":"12343535E0001",
                "model":"TC57",
                "status":"Offline"
            },
            {
                "sn":"12343535E0002",
                "model":"TC57",
                "status":"Online"
            },
            {
                "sn":"12343535E0003",
                "model":"TC57",
                "status":"Offline"
            },
            {
                "sn":"12343535E0004",
                "model":"TC57",
                "status":"Online"
            }
        ],
        "2023-03-03":[
            {
                "sn":"12343535E0001",
                "model":"TC57",
                "status":"Online"
            },
            {
                "sn":"12343535E0002",
                "model":"TC57",
                "status":"Online"
            },
            {
                "sn":"12343535E0003",
                "model":"TC57",
                "status":"Online"
            },
            {
                "sn":"12343535E0004",
                "model":"TC57",
                "status":"Online"
            }
        ],
        ...
    }
}
```
    
### 3.4 getDUTUtilizationRates(start_datetime,end_datetime,sn_list)
**Parameter:**
| Args           | Type   | Description                                                                               |
| -------------- | ------ | ----------------------------------------------------------------------------------------- |
| start_datetime | string | mandatory. the start date time for the query,format is <yyyy-MM-dd> or <yyyy-MM-dd HH:00> |
| end_datetime   | string | mandatory. the end date time for the query, format is <yyyy-MM-dd> or <yyyy-MM-dd HH:00>  |
| sn_list        | array  | optional.  the sn names which you want to query. |

**Return:**
return all test DUTs' utilization rate(match the given condition).
(1) return data by day if request datetime format is <yyyy-MM-dd>;
(2) return data by hour if request datetime format is <yyyy-MM-dd HH:00>.

<br>   
    
http://xxx.xxx.xxx/getDUTUtilizationRates
Sample 1 (format is <yyyy-MM-dd>):
```
request:
{
    "start_datetime":"2023-03-02",
    "end_datetime":"2023-03-10",
    "sn_list":"12343535E0001,12343535E0002,12343535E0003,12343535E0004"
}

return:
{
    "status":"ok",
    "message":
    {
        "2023-03-02":[
            {
                "sn":"12343535E0001",
                "model":"TC57",
                "value":80
            },
            {
                "sn":"12343535E0002",
                "model":"TC57",
                "value":100
            },
            {
                "sn":"12343535E0003",
                "model":"TC57",
                "value":50
            },
            {
                "sn":"12343535E0004",
                "model":"TC57",
                "value":0
            }
        ],
        "2023-03-03":[
            {
                "sn":"12343535E0001",
                "model":"TC57",
                "value":100
            },
            {
                "sn":"12343535E0002",
                "model":"TC57",
                "value":100
            },
            {
                "sn":"12343535E0003",
                "model":"TC57",
                "value":40
            },
            {
                "sn":"12343535E0004",
                "model":"TC57",
                "value":0
            }
        ],
        ...
    }
}
```
Sample 2 (format is <yyyy-MM-dd HH:00>):
```
request:
{
    "start_datetime":"2023-03-02 04:00",
    "end_datetime":"2023-03-02 15:00"
}

return:
{
    "status":"ok",
    "message":
    {
        "04:00":[
            {
                "sn":"12343535E0001",
                "model":"TC57",
                "value":80
            },
            {
                "sn":"12343535E0002",
                "model":"TC57",
                "value":100
            },
            {
                "sn":"12343535E0003",
                "model":"TC57",
                "value":30
            },
            {
                "sn":"12343535E0004",
                "model":"TC57",
                "value":0
            }
        ],
        "05:00":[
            {
                "sn":"12343535E0001",
                "model":"TC57",
                "value":100
            },
            {
                "sn":"12343535E0002",
                "model":"TC57",
                "value":100
            },
            {
                "sn":"12343535E0003",
                "model":"TC57",
                "value":60
            },
            {
                "sn":"12343535E0004",
                "model":"TC57",
                "value":0
            }
        ],
        ...
    }
}
```
    
## [TBD] 4. Workspace/Build/Test Request
### 4.1 createWorkspaceRequest()
### 4.2 getWorkspaces()
### 4.3 modifyWorkspace()
### 4.4 deleteWorkspace()
### 4.5 createBuildJobRequest()
### 4.6 createAutoTestJobRequest()
TBD
    
:::info
Copyright © Wistron Corporation. All Rights Reserved.
:::
###### tags: `Smart factory` `Test automation` `Testlink`
