gcube-cli 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. gcube_cli-0.1.0/PKG-INFO +505 -0
  2. gcube_cli-0.1.0/README.md +483 -0
  3. gcube_cli-0.1.0/pyproject.toml +56 -0
  4. gcube_cli-0.1.0/setup.cfg +4 -0
  5. gcube_cli-0.1.0/src/gcube_cli/__init__.py +6 -0
  6. gcube_cli-0.1.0/src/gcube_cli/__main__.py +4 -0
  7. gcube_cli-0.1.0/src/gcube_cli/_group.py +8 -0
  8. gcube_cli-0.1.0/src/gcube_cli/api/__init__.py +16 -0
  9. gcube_cli-0.1.0/src/gcube_cli/api/client.py +225 -0
  10. gcube_cli-0.1.0/src/gcube_cli/api/credential.py +68 -0
  11. gcube_cli-0.1.0/src/gcube_cli/api/logs.py +52 -0
  12. gcube_cli-0.1.0/src/gcube_cli/api/point.py +173 -0
  13. gcube_cli-0.1.0/src/gcube_cli/api/resource.py +108 -0
  14. gcube_cli-0.1.0/src/gcube_cli/api/workload.py +409 -0
  15. gcube_cli-0.1.0/src/gcube_cli/cli.py +87 -0
  16. gcube_cli-0.1.0/src/gcube_cli/commands/__init__.py +0 -0
  17. gcube_cli-0.1.0/src/gcube_cli/commands/configure.py +168 -0
  18. gcube_cli-0.1.0/src/gcube_cli/commands/credential.py +173 -0
  19. gcube_cli-0.1.0/src/gcube_cli/commands/gpu.py +129 -0
  20. gcube_cli-0.1.0/src/gcube_cli/commands/point.py +190 -0
  21. gcube_cli-0.1.0/src/gcube_cli/commands/resource.py +98 -0
  22. gcube_cli-0.1.0/src/gcube_cli/commands/workload.py +1020 -0
  23. gcube_cli-0.1.0/src/gcube_cli/config/__init__.py +3 -0
  24. gcube_cli-0.1.0/src/gcube_cli/config/config.py +86 -0
  25. gcube_cli-0.1.0/src/gcube_cli/output/__init__.py +39 -0
  26. gcube_cli-0.1.0/src/gcube_cli/output/json_out.py +10 -0
  27. gcube_cli-0.1.0/src/gcube_cli/output/table.py +40 -0
  28. gcube_cli-0.1.0/src/gcube_cli/output/yaml_out.py +11 -0
  29. gcube_cli-0.1.0/src/gcube_cli.egg-info/PKG-INFO +505 -0
  30. gcube_cli-0.1.0/src/gcube_cli.egg-info/SOURCES.txt +45 -0
  31. gcube_cli-0.1.0/src/gcube_cli.egg-info/dependency_links.txt +1 -0
  32. gcube_cli-0.1.0/src/gcube_cli.egg-info/entry_points.txt +2 -0
  33. gcube_cli-0.1.0/src/gcube_cli.egg-info/requires.txt +13 -0
  34. gcube_cli-0.1.0/src/gcube_cli.egg-info/top_level.txt +1 -0
  35. gcube_cli-0.1.0/tests/test_api_client.py +243 -0
  36. gcube_cli-0.1.0/tests/test_cli.py +74 -0
  37. gcube_cli-0.1.0/tests/test_configure.py +444 -0
  38. gcube_cli-0.1.0/tests/test_credential.py +392 -0
  39. gcube_cli-0.1.0/tests/test_gpu.py +371 -0
  40. gcube_cli-0.1.0/tests/test_output.py +146 -0
  41. gcube_cli-0.1.0/tests/test_point.py +515 -0
  42. gcube_cli-0.1.0/tests/test_resource.py +287 -0
  43. gcube_cli-0.1.0/tests/test_workload.py +508 -0
  44. gcube_cli-0.1.0/tests/test_workload_commands.py +530 -0
  45. gcube_cli-0.1.0/tests/test_workload_logs.py +371 -0
  46. gcube_cli-0.1.0/tests/test_workload_register.py +1136 -0
  47. gcube_cli-0.1.0/tests/test_workload_update.py +522 -0
@@ -0,0 +1,505 @@
1
+ Metadata-Version: 2.4
2
+ Name: gcube-cli
3
+ Version: 0.1.0
4
+ Summary: Official command-line tool for the gcube AI GPU cloud platform
5
+ Author-email: Data Alliance <support@data-alliance.com>
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://gcube.ai
8
+ Requires-Python: >=3.10
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: click>=8.1
11
+ Requires-Dist: httpx>=0.27
12
+ Requires-Dist: rich>=13.0
13
+ Requires-Dist: pyyaml>=6.0
14
+ Requires-Dist: websockets>=13.0
15
+ Provides-Extra: dev
16
+ Requires-Dist: pytest>=8.0; extra == "dev"
17
+ Requires-Dist: pytest-httpx>=0.30; extra == "dev"
18
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
19
+ Requires-Dist: ruff>=0.4; extra == "dev"
20
+ Requires-Dist: mypy>=1.10; extra == "dev"
21
+ Requires-Dist: types-PyYAML; extra == "dev"
22
+
23
+ # gcube CLI
24
+
25
+ gcube 플랫폼(AI GPU 클라우드) 공식 커맨드라인 도구.
26
+ 브라우저 없이 터미널만으로 GPU 워크로드를 등록하고, 리소스를 모니터링하고, 사용자를 관리한다.
27
+
28
+ ---
29
+
30
+ ## Overview
31
+
32
+ ```
33
+ gcube <service> <operation> [options]
34
+ ```
35
+
36
+ `gcube`는 [gcube 플랫폼](https://gcube.ai)의 REST API를 직접 호출하는 Python CLI다.
37
+
38
+ | 특징 | 설명 |
39
+ |---|---|
40
+ | pip 설치 | `pip install gcube-cli`로 설치, Python 3.10+ |
41
+ | AWS CLI 스타일 | `gcube <service> <operation>` 구조, `--output table\|json\|yaml` |
42
+ | 웹 토큰 인증 | gcube 웹 프론트에서 토큰 발급 후 CLI에 설정 |
43
+ | 주요 의존성 | click · httpx · rich · pyyaml |
44
+
45
+ ---
46
+
47
+ ## Installation
48
+
49
+ ### pip 설치 (권장)
50
+
51
+ ```bash
52
+ pip install gcube-cli
53
+ ```
54
+
55
+ ### 소스 설치
56
+
57
+ ```bash
58
+ git clone https://github.com/data-alliance/gcube-cli.git
59
+ cd gcube-cli
60
+ pip install -e ".[dev]"
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Quick Start
66
+
67
+ 핵심 워크플로우를 4개 명령어로 완료한다.
68
+
69
+ ```bash
70
+ # 1. 토큰 설정 (gcube 웹 프론트에서 복사한 토큰)
71
+ gcube configure set --token "eyJ..."
72
+
73
+ # 2. GPU 워크로드 등록
74
+ gcube workload register -f workload.yaml
75
+
76
+ # 3. 상태 확인
77
+ gcube workload list
78
+
79
+ # 4. 로그 조회
80
+ gcube workload logs my-train-job
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Configuration
86
+
87
+ ### 토큰 발급 및 설정
88
+
89
+ 1. [gcube 웹 프론트](https://gcube.ai)에 로그인
90
+ 2. "API 토큰 발급" 메뉴에서 토큰 복사
91
+ 3. CLI에서 토큰 설정:
92
+
93
+ ```bash
94
+ gcube configure set --token "eyJ..."
95
+ ```
96
+
97
+ ### 설정 파일
98
+
99
+ `gcube configure` 이후 `~/.gcube/config.yaml`에 자동 생성된다.
100
+
101
+ ```yaml
102
+ platform_url: https://console.gcube.ai
103
+ ws_url: wss://console.gcube.ai:61443
104
+ auth:
105
+ access_token: "eyJ..."
106
+ expires_at: "2026-04-03T10:00:00Z"
107
+ output: table # table | json | yaml
108
+ ```
109
+
110
+ ### Commands
111
+
112
+ ```
113
+ gcube configure # 대화형 설정
114
+ gcube configure set --token <token> # 토큰 설정
115
+ gcube configure set --platform-url <url> # 플랫폼 URL 설정
116
+ gcube configure set --ws-url <url> # WebSocket URL 설정 (로그 스트리밍용)
117
+ gcube configure set --output <format> # 기본 출력 형식 설정
118
+ gcube configure get <key> # 설정값 조회 (token, platform-url, ws-url, output)
119
+ gcube configure status # 현재 설정 및 토큰 유효 여부 표시
120
+ ```
121
+
122
+ ### 환경변수
123
+
124
+ 환경변수는 설정 파일보다 우선 적용된다.
125
+
126
+ | 환경변수 | 설명 | 예시 |
127
+ |---|---|---|
128
+ | `GCUBE_PLATFORM_URL` | 플랫폼 Base URL | `https://gcube.ai` |
129
+ | `GCUBE_ACCESS_TOKEN` | Bearer 토큰 (CI/CD용) | `eyJ...` |
130
+ | `GCUBE_OUTPUT` | 기본 출력 형식 | `json` |
131
+ | `GCUBE_CONFIG` | 설정 파일 경로 override | `/etc/gcube/config.yaml` |
132
+
133
+ ### 다중 프로파일
134
+
135
+ `--profile` 플래그로 여러 플랫폼 환경(dev/prod 등)을 전환한다.
136
+
137
+ ```bash
138
+ # 개발 환경 토큰 설정
139
+ gcube configure set --token "eyJ..." --platform-url https://dev.gcube.ai --profile dev
140
+
141
+ # dev 프로파일로 명령 실행
142
+ gcube workload list --profile dev
143
+ ```
144
+
145
+ 프로파일별 설정은 `~/.gcube/profiles/<profile>/config.yaml`에 저장된다.
146
+
147
+ ---
148
+
149
+ ## Command Reference
150
+
151
+ ### Workload
152
+
153
+ GPU 워크로드 수명주기를 관리한다.
154
+
155
+ | 명령 | 설명 |
156
+ |---|---|
157
+ | `gcube workload register -f <yaml>` | YAML 파일로 워크로드 등록 |
158
+ | `gcube workload register --image <img> ...` | 인라인 플래그로 워크로드 등록 |
159
+ | `gcube workload update <ser> -f <yaml>` | 중지된 워크로드 수정 |
160
+ | `gcube workload list` | 워크로드 목록 조회 |
161
+ | `gcube workload describe <name>` | 워크로드 상세 조회 |
162
+ | `gcube workload start <name>` | 워크로드 시작 |
163
+ | `gcube workload stop <name>` | 워크로드 중지 |
164
+ | `gcube workload delete <name>` | 워크로드 삭제 |
165
+ | `gcube workload logs <ser>` | 컨테이너 로그 실시간 스트리밍 (WebSocket) |
166
+ | `gcube workload logs <ser> --pod <idx>` | 특정 pod 로그 스트리밍 |
167
+ | `gcube workload logs <ser> --pod <idx> --container <idx>` | 특정 컨테이너 로그 스트리밍 |
168
+ | `gcube workload pods <name>` | Pod 목록 조회 |
169
+
170
+ **주요 플래그**
171
+
172
+ | 플래그 | 설명 | 기본값 |
173
+ |---|---|---|
174
+ | `-f, --file <path>` | 워크로드 YAML 파일 경로 | — |
175
+ | `--image <image>` | 컨테이너 이미지 | — |
176
+ | `--gpu <code>` | GPU 코드 (예: `029`, `gcube gpu list`의 CODE 컬럼) | — |
177
+ | `--cuda <version>` | CUDA 버전 코드 | — |
178
+ | `--category <type>` | 워크로드 유형: `infer\|learn` | — |
179
+ | `--owner <email>` | 워크로드 소유자 (list 필터) | — |
180
+ | `--container <name>` | 컨테이너명 (logs용) | — |
181
+ | `--backend astrago` | AstraGo 백엔드 사용 | — |
182
+ | `--namespace gai` | GAI 네임스페이스 사용 | — |
183
+
184
+ **CUDA 버전 코드** (형식: major×1000 + minor×10)
185
+
186
+ | 코드 | CUDA 버전 |
187
+ |---|---|
188
+ | `12000` | 12.0 |
189
+ | `12020` | 12.2 |
190
+ | `12030` | 12.3 |
191
+ | `12040` | 12.4 |
192
+ | `12050` | 12.5 |
193
+ | `12060` | 12.6 |
194
+ | `12080` | 12.8 |
195
+ | `12090` | 12.9 |
196
+ | `13000` | 13.0 |
197
+
198
+ **워크로드 YAML 형식** (`register -f` / `update -f` 공통)
199
+
200
+ ```yaml
201
+ # workload.yaml
202
+ description: "My ML training job" # 필수, 2-80자
203
+ cuda: "12020" # CUDA 버전 코드 (선택)
204
+ sharedMemory: 1 # GB
205
+
206
+ containers:
207
+ - containerImage: "pytorch/pytorch:2.0" # 필수
208
+ repo: docker.io
209
+ port: 0 # 0 = 자동 감지
210
+ maxConnection: 4
211
+ containerCommand: "python train.py"
212
+ isCredential: false
213
+ containerEnvs:
214
+ - EPOCHS: "100"
215
+ - BATCH_SIZE: "32"
216
+
217
+ gpuSpecs:
218
+ - gpuCode: "029" # 필수 — 'gcube gpu list'의 CODE 컬럼 값
219
+ # 레플리카 추가: 항목 반복
220
+ # - gpuCode: "029"
221
+ ```
222
+
223
+ > `gcube workload register --skeleton` 으로 빈 템플릿을 출력할 수 있습니다.
224
+ > `gcube workload update <ser> --skeleton > workload.yaml` 으로 현재 워크로드 설정을 내보낸 후 gpuCode를 채워 `-f`로 전달합니다.
225
+
226
+ ---
227
+
228
+ ### GPU
229
+
230
+ 사용 가능한 GPU 목록과 스펙·가격을 조회한다.
231
+
232
+ | 명령 | 설명 |
233
+ |---|---|
234
+ | `gcube gpu list` | 가용 GPU 목록 (CODE·스펙·시간당 가격 범위) |
235
+ | `gcube gpu list --all` | 전체 GPU 목록 (비가용 포함, AVAIL 컬럼 표시) |
236
+
237
+ ```bash
238
+ gcube gpu list # 가용 GPU만 (CODE 포함)
239
+ gcube gpu list --all # 전체 (비가용 포함)
240
+ gcube -o json gpu list # JSON 출력
241
+ gcube -o yaml gpu list # YAML 출력
242
+ ```
243
+
244
+ > CODE는 API 응답 순서 기반 3자리 순번(001, 002, ...)이며, 워크로드 등록 시 GPU 특정에 사용된다.
245
+
246
+ ---
247
+
248
+ ### Resource
249
+
250
+ 워크로드의 CPU·GPU·메모리 사용량을 조회한다. workload 이름을 입력하면 내부적으로 pod를 resolve하여 리소스를 조회한다.
251
+
252
+ | 명령 | 설명 |
253
+ |---|---|
254
+ | `gcube resource workload <name>` | 워크로드 리소스 사용량 (시간 평균) |
255
+
256
+ ---
257
+
258
+ ### Point
259
+
260
+ 포인트 잔액과 일별 지출 내역을 조회한다.
261
+
262
+ | 명령 | 설명 |
263
+ |---|---|
264
+ | `gcube point status` | 포인트 현황 (잔액·충전·지출 요약, 잔액 부족 경고) |
265
+ | `gcube point spending` | 당월 일별 지출 내역 |
266
+ | `gcube point spending --month 2026-03` | 특정 월 일별 지출 내역 |
267
+ | `gcube point spending --workload <ser>` | 특정 워크로드 지출 필터 |
268
+
269
+ ---
270
+
271
+ ### User
272
+
273
+ 사용자 계정과 크레덴셜을 관리한다.
274
+
275
+ | 명령 | 설명 |
276
+ |---|---|
277
+ | `gcube user list [--keyword <search>]` | 사용자 목록 조회 |
278
+ | `gcube user describe <email>` | 사용자 상세 조회 |
279
+ | `gcube user create --email <e> --name <n> [--role <r>]` | 사용자 생성 |
280
+ | `gcube user update <email> [--name <n>]` | 사용자 정보 수정 |
281
+ | `gcube user delete <email>` | 사용자 삭제 |
282
+ | `gcube user credentials list <email>` | 크레덴셜 목록 |
283
+ | `gcube user credentials create <email> --name <n>` | 크레덴셜 생성 |
284
+ | `gcube user credentials delete <email> --cred-id <id>` | 크레덴셜 삭제 |
285
+ | `gcube user token <email>` | 플랫폼 토큰 발급/조회 |
286
+
287
+ ---
288
+
289
+ ## Output Formats
290
+
291
+ `--output` 플래그(또는 `GCUBE_OUTPUT` 환경변수)로 출력 형식을 선택한다.
292
+
293
+ ### table (기본값)
294
+
295
+ ```
296
+ $ gcube workload list
297
+
298
+ NAME CATEGORY TARGET GPU GPU COUNT STATE
299
+ my-train-job learn any RTX4090 2 running
300
+ my-infer-svc infer svr A100 1 stopped
301
+ ```
302
+
303
+ ### json
304
+
305
+ ```
306
+ $ gcube -o json workload list
307
+
308
+ [
309
+ {"ser":"abc123","owner":"user@example.com","category":"learn","gpu":"RTX4090","gpuCount":2,"state":"running"},
310
+ {"ser":"def456","owner":"admin@example.com","category":"infer","gpu":"A100","gpuCount":1,"state":"stopped"}
311
+ ]
312
+ ```
313
+
314
+ ### yaml
315
+
316
+ ```
317
+ $ gcube -o yaml workload list
318
+
319
+ - ser: abc123
320
+ owner: user@example.com
321
+ category: learn
322
+ gpu: RTX4090
323
+ gpuCount: 2
324
+ state: running
325
+ - ser: def456
326
+ owner: admin@example.com
327
+ category: infer
328
+ gpu: A100
329
+ gpuCount: 1
330
+ state: stopped
331
+ ```
332
+
333
+ ---
334
+
335
+ ## Global Options
336
+
337
+ 모든 명령에서 사용 가능한 플래그.
338
+
339
+ | 플래그 | 설명 | 기본값 |
340
+ |---|---|---|
341
+ | `--platform-url <url>` | gcube 플랫폼 Base URL | `config.yaml` 값 |
342
+ | `--output <format>` | 출력 형식: `table\|json\|yaml` | `table` |
343
+ | `--profile <name>` | 사용할 프로파일 이름 | `default` |
344
+ | `--debug` | HTTP 요청/응답 상세 출력 | `false` |
345
+ | `--help`, `-h` | 도움말 출력 | — |
346
+
347
+ ---
348
+
349
+ ## Exit Codes
350
+
351
+ | 코드 | 의미 | 예시 |
352
+ |---|---|---|
353
+ | `0` | 성공 | 정상 출력 |
354
+ | `1` | 잘못된 인수 또는 플래그 | 필수 플래그 누락 |
355
+ | `2` | gcube API 오류 | `API Error [NOT_FOUND]: workload not found` |
356
+ | `3` | 인증 실패 또는 토큰 만료 | `Token expired or invalid. Please get a new token from https://gcube.ai` |
357
+ | `4` | 네트워크 오류 | `Cannot connect to https://gcube.ai. Check network.` |
358
+
359
+ 스크립트에서 활용:
360
+
361
+ ```bash
362
+ gcube workload start my-job
363
+ if [ $? -eq 3 ]; then
364
+ echo "Token expired. Please get a new token from https://gcube.ai"
365
+ echo "Then run: gcube configure set --token <new-token>"
366
+ fi
367
+ ```
368
+
369
+ ---
370
+
371
+ ## Environment Variables
372
+
373
+ | 변수 | 설명 |
374
+ |---|---|
375
+ | `GCUBE_PLATFORM_URL` | 플랫폼 Base URL (`--platform-url` override) |
376
+ | `GCUBE_ACCESS_TOKEN` | Bearer 토큰 직접 지정 (CI/CD 환경) |
377
+ | `GCUBE_OUTPUT` | 기본 출력 형식 (`--output` override) |
378
+ | `GCUBE_PROFILE` | 기본 프로파일 이름 (`--profile` override) |
379
+ | `GCUBE_CONFIG` | 설정 파일 경로 override |
380
+ | `GCUBE_DEBUG` | `1` 로 설정 시 `--debug` 활성화 |
381
+
382
+ ---
383
+
384
+ ## Examples
385
+
386
+ ### 토큰 설정
387
+
388
+ ```bash
389
+ # gcube 웹 프론트에서 복사한 토큰 설정
390
+ gcube configure set --token "eyJ..."
391
+
392
+ # 설정 상태 확인
393
+ gcube configure status
394
+
395
+ # 대화형 설정 (플랫폼 URL, 토큰, 출력 형식을 순서대로 입력)
396
+ gcube configure
397
+ ```
398
+
399
+ ### 워크로드 등록 및 관리
400
+
401
+ ```bash
402
+ # YAML 파일로 학습 잡 등록
403
+ gcube workload register -f train.yaml
404
+
405
+ # 인라인 플래그로 인퍼런스 서비스 등록 (GPU CODE는 gcube gpu list에서 확인)
406
+ gcube workload register \
407
+ --image pytorch/pytorch:2.0-cuda12.0 \
408
+ --gpu 029 \
409
+ --cuda 12020 \
410
+ --category infer
411
+
412
+ # 내 워크로드만 조회
413
+ gcube workload list --owner me@example.com
414
+
415
+ # 특정 워크로드 상세 + JSON 출력
416
+ gcube -o json workload describe my-train-job
417
+
418
+ # 실시간 로그 스트리밍 (단일 pod/컨테이너)
419
+ gcube workload logs 2041
420
+
421
+ # 멀티 pod/컨테이너 — 목록 확인 후 지정
422
+ gcube workload logs 2095
423
+ gcube workload logs 2095 --pod 0 --container 1
424
+
425
+ # 워크로드 중지 후 삭제
426
+ gcube workload stop my-train-job
427
+ gcube workload delete my-train-job
428
+ ```
429
+
430
+ ### 리소스 모니터링
431
+
432
+ ```bash
433
+ # 워크로드 리소스 사용량 (시간 평균)
434
+ gcube resource workload my-train-job
435
+
436
+ # JSON 출력
437
+ gcube -o json resource workload my-train-job
438
+ ```
439
+
440
+ ### 사용자 및 크레덴셜 관리
441
+
442
+ ```bash
443
+ # 사용자 검색
444
+ gcube user list --keyword kim
445
+
446
+ # 사용자 생성
447
+ gcube user create --email new@example.com --name "Kim Gildong" --role user
448
+
449
+ # 크레덴셜 발급
450
+ gcube user credentials create kim@example.com --name "dev-key"
451
+
452
+ # 플랫폼 토큰 발급 (다른 도구 연동용)
453
+ gcube user token kim@example.com
454
+ ```
455
+
456
+ ### CI/CD 파이프라인
457
+
458
+ ```bash
459
+ # 환경변수로 인증 (토큰 사전 발급)
460
+ export GCUBE_ACCESS_TOKEN="eyJ..."
461
+ export GCUBE_OUTPUT=json
462
+
463
+ # 파이프라인에서 워크로드 등록 후 상태 확인
464
+ gcube workload register -f pipeline.yaml
465
+ gcube workload describe pipeline-job-001 | jq '.state'
466
+ ```
467
+
468
+ ### GAI / AstraGo 백엔드
469
+
470
+ ```bash
471
+ # GAI 네임스페이스 워크로드 목록
472
+ gcube workload list --namespace gai
473
+
474
+ # AstraGo 백엔드 워크로드 상세
475
+ gcube workload describe my-job --backend astrago
476
+ ```
477
+
478
+ ---
479
+
480
+ ## Development
481
+
482
+ ```bash
483
+ # 소스 클론 및 개발 환경 설치
484
+ git clone https://github.com/data-alliance/gcube-cli.git
485
+ cd gcube-cli
486
+ pip install -e ".[dev]"
487
+
488
+ # 테스트
489
+ pytest --cov=gcube_cli --cov-report=term-missing
490
+
491
+ # 빌드
492
+ python -m build
493
+ ```
494
+
495
+ ---
496
+
497
+ ## Contributing
498
+
499
+ 버그 리포트 및 기능 요청은 [GitHub Issues](https://github.com/data-alliance/gcube-cli/issues)를 이용한다.
500
+
501
+ ---
502
+
503
+ ## License
504
+
505
+ Apache License 2.0 — [LICENSE](LICENSE) 참조