# Fault Injection

Fault Injection 기능은 System의 안정성과 오류 처리 능력을 검증하기 위해 의도적으로 실패를 발생시키는 API입니다. 이를 통해 특정 Module을 사용하는 Decoder, Filter, Encodoer의 초기화 실패, Frame 처리 실패, 지연을 발생시킬 수 있으며, 실제 장애 상황과 유사한 환경을 조성하여 테스트를 진행할 수 있습니다.

## Fault Injection 활성화하기

Fault Injection은 아래와 같이 `Server.xml` 내 `<Server><Module>`에서 설정할 수 있습니다:

```xml
<Server>
    ...
    <Modules>
        ...
        <FaultInject>
            <Enable>true</Enable>
        </FaultInject>
        ...
    </Modules>
    ...
</Server>
```

## API Interface

### Fault Injection 설정하기

`transcoder` 하위에 배열로 설정할 수 있습니다. 신규 설정 시 기존 설정은 모두 해제되며, 마찬가지로 OvenMediaEngine이 재시작되면 관련된 모든 설정이 초기화됩니다.

> **Request**

<details>

<summary><mark style="color:blue;">POST</mark> /v2/internals/tests:setFaultInject</summary>

**Header**

```http
Authorization: Basic {credentials}

# Authorization
Credentials for HTTP Basic Authentication created with <AccessToken>
```

**Body**

```json
{
  "transcoder" : [
      { 
         "targetModule" : "default",
         "targetDeviceId" : 0,
         "targetComponent" : "decoder",
         "faultType" : "initFailed",
         "faultRate" : 50
      },        
      { 
         "targetModule" : "openh264",
         "targetDeviceId" : 0,
         "targetComponent" : "filter",
         "faultType" : "processFailed",
         "faultRate" : 2.0
       },    
      { 
         "targetModule" : "nv",
         "targetDeviceId" : 0,
         "targetComponent" : "encoder",
         "faultType" : "lagging",
         "faultRate" : 10.0
       },
      { 
         "targetModule" : "default",
         "targetDeviceId" : 0,
         "targetComponent" : "decoder",
         "faultType" : "processFailed",
         "faultRate" : 2.0
       }
   ]
}
```

</details>

> **Responses**

<details>

<summary><mark style="color:blue;">200</mark> Ok</summary>

The request has succeeded

**Header**

```http
Content-Type: application/json
```

**Body**

```json
{
    "message": "OK",
    "statusCode": 200
}
```

</details>

<details>

<summary><mark style="color:red;">400</mark> Bad Request</summary>

Fault injection module is not enabled in the server configuration

</details>

<details>

<summary><mark style="color:red;">400</mark> Bad Request</summary>

Invalid request

</details>

<table><thead><tr><th width="154">Parameter</th><th width="159.5555419921875" align="center">Input Range</th><th>Description</th></tr></thead><tbody><tr><td><code>targetModule</code></td><td align="center">Codec Module</td><td><p>Fault Injection의 대상이 될 Module을 지정합니다.</p><ul><li><code>default</code>, <code>openh264</code>, <code>x264</code>, <code>libvpx</code>, <code>nv</code>, <code>xma</code> 등 <a href="../../additional-rest-api/v2/internals/codecs#id-200-ok">v2/internals/codecs</a>의 <code>name</code> 값을 참조하십시오.</li></ul></td></tr><tr><td><code>targetDeviceId</code></td><td align="center"><p>0~</p><p>(Device ID)</p></td><td><p>Fault Injection의 대상이 될 Module에 지정된 ID입니다.</p><ul><li><a href="../../additional-rest-api/v2/internals/codecs#id-200-ok">v2/internals/codecs</a>의 <code>id</code> 값을 참조하십시오.</li></ul></td></tr><tr><td><code>targetComponent</code></td><td align="center"><code>decoder</code>,<br><code>encoder</code>,<br><code>filter</code></td><td>Fault Injection의 대상이 될 Module의 Component Type을 지정합니다.</td></tr><tr><td><code>faultType</code></td><td align="center"><p></p><p><code>initFailed</code>,<br><code>processFailed</code>,<br><code>lagging</code></p></td><td><p>진행할 Fault Testing의 종류를 지정합니다.</p><ul><li><code>initFailed</code>: Module 초기화 실패를 재현합니다.</li><li><code>processFailed</code>: Decoding, Filtering, Encoder 실패를 재현합니다.</li><li><code>lagging</code>: 처리 지연 (300ms)을 재현합니다.</li></ul></td></tr><tr><td><code>faultRate</code></td><td align="center">0.01~100.0</td><td>Fault Testing이 발생할 확율 (%)을 지정합니다.</td></tr></tbody></table>

### Fault Injection 해제하기

`transcoder` 배열에 값을 지정하지 않으면 관련된 모든 설정이 해제됩니다.

> **Request**

<details>

<summary><mark style="color:blue;">POST</mark> /v2/internals/tests:setFaultInject</summary>

**Header**

```http
Authorization: Basic {credentials}

# Authorization
Credentials for HTTP Basic Authentication created with <AccessToken>
```

**Body**

```json
{
  "transcoder" : [ ]
}
```

</details>

> **Responses**

<details>

<summary><mark style="color:blue;">200</mark> Ok</summary>

The request has succeeded

**Header**

```http
Content-Type: application/json
```

**Body**

```json
{
    "message": "OK",
    "statusCode": 200
}
```

</details>
