Skip to content

Commit

Permalink
* resolve : #4
Browse files Browse the repository at this point in the history
* resolve : #5
* docs : README.MD 내용 추가

Signed-off-by: DongChuelKim <terrinens@gmail.com>
  • Loading branch information
terrinens committed Sep 24, 2024
1 parent 4710d9e commit f95b5ed
Show file tree
Hide file tree
Showing 3 changed files with 180 additions and 13 deletions.
151 changes: 150 additions & 1 deletion README.MD
Original file line number Diff line number Diff line change
@@ -1 +1,150 @@
<img src="/flow%20chart.png" alt="">
<img src="/flow%20chart.png" alt="">

# Upload Event Control

## 목차

- [주요기능](#주요-기능)
- [프로그램 실행 인수](#실행-인수)
- [URL 목록](#url-목록)

## 주요 기능

- **JAR 업로드 URL**
- **JAR 서버 자동 실행**
- **실행 실패 시 버전 롤백**
- **버전 관리**
- **파일 일정 수 유지**
- **서비스 등록** (현재 우분투 환경만 가능)

## 프로그램 실행 인수

| 인수 | 설명 | 기본값 |
|------------------------------|-----------------------------------------------------------|----------------------------------|
| `-up`, `--uec_port` | UEC를 실행하기 위한 Port 설정 | 4074 |
| `-bp`, `--backend_port` | 실행 및 감시할 JAR Server Port 설정 | 8080 |
| `-sd`, `--save_dir` | 업로드된 JAR을 저장할 위치 | 리눅스: `/temp` <br/> 윈도우: `%TEMP%` |
| `-d`, `--dir_created` | 감시할 디렉토리를 생성합니다. 감시할 디렉토리는 파일을 저장하는 위치입니다. | false |
| `-mc`, `--maintenance_count` | 유지할 업로드 파일의 수 입니다. | inf:int |
| `-reg`, `--register` | 서비스 자동 등록입니다. 기존 서비스가 존재시 재등록 및 재실행합니다. (현재 우분투 환경에서만 작동) | false |
| `--debug` | 모든 로그를 표시합니다. | false |

## URL 목록

| 메소드 | URI | 설명 | 파라미터 |
|------|----------------------|--------------|----------------|
| POST | `/jar_upload` | 파일 업로드 | 파일 (jar) |
| GET | `/test` | 서버 응답 테스트 | 없음 |
| GET | `/tasking?uuid=UUID` | 진행 현황 확인 | uuid (쿼리 파라미터) |
| GET | `/ready` | 대기중인 작업 수 확인 | 없음 |

### jar_upload

#### 본문 인수

`jar` file 필수
JAR 파일을 업로드 하기위한 인수입니다.

#### 요청 예제

```curl
curl \
-X POST http://ADDRESS/jar_upload \
-H "Accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "jar=@/path/to/youfile.jar" \
```

#### 응답 예제

Status: 202

```json
{
"message": "Upload has been completed. Work is in progress.",
"polling": "/tasking?uuid=9cc32cf5-f6bb-5abe-b57b-4a82e5de432c"
}
```

### test

#### 요청 예제

```curl
curl \
-G http://ADDRESS/test \
-H "Accept: application/json" \
```

#### 응답 예제

Status: 200

```json
{
"message": "Test Successful"
}
```

### tasking?uuid=UUID

#### 요청 예제

```curl
curl \
-G http://ADDRESS/tasking \
--data-urlencode "uuid=9cc32cf5-f6bb-5abe-b57b-4a82e5de432c" \
-H "Accept: application/json" \
```

#### 응답 예제

Status: 200
해당 작업이 완료되었을 경우 반환합니다.

```json
{
"message": "That work has been completed."
}
```

Status: 202
작업이 대기열에 존재할 경우 해당 응답을 반환합니다.
polling의 요청으로 재요청시 반복적으로 확인이 가능합니다.

```json
{
"message": "Work is in progress. waiting number : 5",
"polling": "/tasking?uuid=9cc32cf5-f6bb-5abe-b57b-4a82e5de432c"
}
```

### ready

#### 요청 예제

```curl
curl \
-G http://ADDRESS/ready \
-H "Accept: application/json" \
```

#### 응답 예제

Status: 200
프로그램의 모든 작업이 끝나 대기상태입니다.

```json
{
"message": "There are no pending tasks."
}
```

Status: 202
작업이 대기열에 남아있으며, 진행중인 작업의 수를 반환합니다.

```json
{
"message": "Number of pending tasks : 8"
}
```
31 changes: 23 additions & 8 deletions app.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import argparse
import asyncio
import math
import os.path
import sys
from uuid import UUID
Expand Down Expand Up @@ -51,7 +52,7 @@ def jar_upload():


@app.route('/test', methods=['GET'])
def test(): return jsonify({'message': '테스트 성공'}), 200
def test(): return jsonify({'message': 'Test Successful'}), 200


@app.route('/tasking', methods=['GET'])
Expand Down Expand Up @@ -79,12 +80,15 @@ def ready():


def add_parse(parse: argparse.ArgumentParser):
save_default = "C:\\temp\\" if os.name == 'nt' else "~/uec_temp"

parse.add_argument('--uec_port', type=int, required=False, default=4074, help='해당 프로그램이 사용할 포트')
parser.add_argument('--backend_port', type=int, required=False, default=8080, help='감시할 백엔드 포트')
parser.add_argument('--save_dir', type=str, required=False, default=save_default, help='파일을 저장할 위치')
parser.add_argument('--register', action='store_true', help='app 최초 실행시 서비스를 자동 등록')
temp = os.getenv('TEMP', '/temp')
save_default = os.path.join(temp, 'uec')

parse.add_argument('-up', '--uec_port', type=int, required=False, default=4074, help='해당 프로그램이 사용할 포트')
parser.add_argument('-bp', '--backend_port', type=int, required=False, default=8080, help='감시할 백엔드 포트')
parser.add_argument('-sd', '--save_dir', type=str, required=False, default=save_default, help='파일을 저장할 위치')
parser.add_argument('-d', '--dir_created', action='store_true', help='디렉토리가 존재하지 않을 경우 생성합니다.')
parse.add_argument('-mc', '--maintenance_count', type=int, required=False, default=math.inf, help='유지할 파일의 수 입니다.')
parser.add_argument('-reg', '--register', action='store_true', help='app 최초 실행시 서비스를 자동 등록')
parser.add_argument('--debug', action='store_true', help='디버깅')

return parse.parse_args()
Expand All @@ -97,17 +101,28 @@ def add_parse(parse: argparse.ArgumentParser):
port = args.uec_port
backend_port = args.backend_port
save_dir = args.save_dir
dir_created = args.dir_created
maintenance_count = args.maintenance_count
register = args.register
debug = args.debug

if not os.path.exists(save_dir):
if dir_created:
os.makedirs(save_dir)
else:
exit(f'Could not find the path to "{save_dir}" Exit the program.')

if register:
success = asyncio.run(registration(args))
sys.exit()

if debug:
log = create_logger('UEC_log', 'uec.log', console_level=debug)

manager = Manager(target_dir=save_dir, server_port=backend_port, debug=debug, maintenance_count=10).start()
manager = (Manager(target_dir=save_dir, server_port=backend_port,
debug=debug,
maintenance_count=maintenance_count)
.start())

log.info(f"The server has started. Port : {port}")
app.run(host='0.0.0.0', port=port, debug=debug)
11 changes: 7 additions & 4 deletions manager/runner_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,13 @@ def __file_maintenance(self):
old_file_remove(self.target_dir, '.jar', self.maintenance_count, _task_list)

def __start_observer(self):
log.debug(f'{self.server_port} Starts port process monitoring.')
log.debug(f'{self.target_dir} Starts directory monitoring')
try:
log.debug(f'{self.server_port} Starts port process monitoring.')
log.debug(f'{self.target_dir} Starts directory monitoring')
self.observer.start()
except FileNotFoundError:
log.error(f"Directory : {self.target_dir} Location could not be found. Exit the program.")
log.error(f"Directory : {self.target_dir} Location could not be found. Observer is not Started.")
self.queue.close()
sys.exit(1)

@staticmethod
Expand Down Expand Up @@ -144,7 +145,9 @@ def complete_tasking(self):
pass

def start(self):
threading.Thread(target=self.__start_observer, daemon=True).start()
thread = threading.Thread(target=self.__start_observer, daemon=True)
thread.setName('UEC Observer')
thread.start()
return self

def __add_queue(self, obj):
Expand Down

0 comments on commit f95b5ed

Please sign in to comment.