---
# System prepended metadata

title: TWCC二期Harbor 2.0
tags: [Harbor]

---

# TWCC二期Harbor 2.0
###### tags: `Harbor`

## 目的

落實用戶私有映像檔概念，並結合TWCC計劃共享概念，以下列設計達成

## 設計

### 使用者權限
1. 一般用戶:可存取私有影像檔，或計劃內共享影像檔，或全系統共享影像檔
2. 計劃管理者:可管理計劃內共享影像檔
3. 系統管理者:可管理所有影像檔

### 架構與實作
![](https://i.imgur.com/mOncNP0.png)


![](https://i.imgur.com/57U4bTV.png)



#### 計劃管理
提供Event API給GOC呼叫
* 新增
    * 建立twcc專案與harbor專案間的對應關係
        * User-project:  registry.twcc.ai/c00yun00/{imagename}
        * shared-project: registry.twcc.ai/gov108029/{imagename}
    * 導入member到Harbot專案中
        * user-proj只有user and harbor admin
        * 加入user到shared-project group中
* 刪除
    * Freeze
    [GOC預期行為]:當有錢包用完等商務的問題時，各服務需對應此狀態，進行相對應動作，K8S會停止vm，container等運算資源. 
    [Harbor預期行為]: 禁止檔案上傳，但允許檔案下載、
        1. 透過額度管理:限額機制達成
    
    * Business Freeze
    [GOC預期行為]: 當有被hacker入侵，project以不當方式使用計算資源等，需立即停止時，各服務需對應此狀態，進行相對應動作，例如禁止read/write。
    [Harbor預期行為]: 禁止對該專案執行任何映像檔相關之操作如建立容器，read/write映像檔之行為
        1. Delete API-account from project member
        2. Save the project member info to db
        3. Delete project member

    * Delete
    [GOC預期行為]: 計畫終止，刪除所有相關資源、檔案等
    [Harbor預期行為]: 刪除專案本身與專案下之映像檔與其儲存空間
        1. Delete project member 
        2. Delete repositories 
        3. Delete project
        4. Enable GC
    * 

* 查詢 
    * List project
    * List repositories/tags

#### 映像檔管理

* 新增
    * 私有映像檔上傳
        * UI
         ![](https://i.imgur.com/1etVosO.png)
            1. 來源有Http(s)/s3/dockerhub
            2. UI端輸入相關資訊,運用docker pull/push到harbor
registry.twcc.ai/c00yun00/{imagename}
            3. 掃描並將結果透過webhook回傳給AIR
            4. 更新DB
        * CLI
            1. docker push registry.twcc.ai/c00yun00/{imagename}
            2. 掃描並呈現結果
            3. 取用時goc/UI需濾掉掃描沒過的映像檔
    * 公有映像檔上傳(only for admin)
            1.Image builder確認ngc映像檔版本差異
            2.Image builder觸發cicd build
            3.cicd上傳映像檔到Harbor
* 刪除
    * shared image: 只有project admin能透過映像檔管理頁面刪除
    * user image: user透過私有映像檔管理頁面刪除

* 修改
    * 容器複本
* 查詢
    * 新增私有映像檔管理頁面
* 取用
    * 映像檔的取用包含user + shared專案
        1. 取用列表需綜合不同來源的映像檔 (GOC/UI)
        2. 取用時需濾掉掃描沒過的映像檔 (GOC)
    * 映像檔執行的環境設置 (評估中)
        1. dropbear install script
        2. dropbear bring up
            * 透過UI上傳ssh public key (UI)
            * mount user public key 並帶起dropbear (GOC)
        3. initial container
            * add ldap-user account
        5. 
    * 
* 共享機制
同時應存在計畫id對應之project name，此project為計劃下用戶均可存取
例如計畫gov108029,該計劃可共享之影像檔位址為 registry.twcc.ai/gov108029/{imagename}
    * 實現分享image的流程
        1. API for doing docker pull/push
        2. UI透過分享鈕觸發
        
#### 待評估
**UI**
1. 新增私有映像檔管理頁面，可對應到 user image 
* 映像檔列表
    * First level content
        * ID
        * Name
        * tags
        * pulls
        * quota
    * Second level content
        * Tag
        * size
        * pull-command
        * status
        * create time
        * download button
        * scan result
        * delete
        * (share botton)
2. 上傳管理頁面
* 上傳工作列表
    * First level content
        * ID
        * 檔案來源
        * 檔案名稱
        * 檔案大小
        * 上傳狀態
        * 建立時間
        * delete
2. 分享管理頁面
* 分享工作列表
    * First level content
        * ID
        * 來源映象檔名稱
        * 分享狀態
        * 建立時間
        * delete
3. 映像檔管理頁面則對應Shared project image
* 映像檔列表
    * First level content
        * ID
        * Name
        * (Tags)
        * (pulls)
        * (quota)
        * ~~createTime~~
        * ~~updateTime~~
    * Second level content
        * Tag
        * size
        * pull-command
        * status
        * create time
        * ~~download button~~
        * scan result
        * ~~delete~~

4. 額度管理頁面(site admin?)
* 專案列表
    * First level content
        * capacity (used/total)
        * image count (pushed/total)
        * shared-project name
            * capacity and count (used/allocated)
        * user-project name
            * capacity and count (used/allocated)
        * check button
        * submit button
    * 
5. 開發型容器
* 開發型容器詳細資料分頁-網路與連線
    * 私有映像檔開啟之容器沒有Jupyter, 請goc在gsp端做區分(ngc or private)
6. 
**GOC/UI**
1. 要在不同情境、頁面底下來撈 user image並可在列舉時綜合不同來源的映像檔
* 開發型容器頁面
    * 映像檔取用列表
* AIM模板建立頁面
    * 映像檔取用列表
2. 取用時需濾掉掃描沒過的映像檔

#### 額度管理
* 額度計算邏輯
在新的架構下，每個使用者擁有user和shared兩個專案存放映像檔，根據[映像檔管理-4查詢與取用]說明兩個專案的映像檔皆可使用

方案一: 總額度為兩個專案總和.可透過UI執行分配管理
    * 初始化專案時，建立專案分享空間`gov108029`和專案使用者空間`gov108029-c00yun00` 並需要紀錄iService額度與專案額度之對應關係於DB中
    ![](https://i.imgur.com/KAHuzff.png)
    iService認知: 1T
    pool (400G)
    gov108029(500G)
    gov108029-users(100G)
    * 專案管理者可以透過UI介面分配總額度給某member
        1. 額度管理頁面
            * 顯示所有專案額度() 
        2. 額度檢查與分配
            * check quota
            * submit quota

方案二: 分享空間和使用者空間分開討論,提供API讓使用者或是專案管理者可以依需求擴增額度. 

* 限額
如何限制超額上傳
    * UI上傳
        1. 提供get harbor quota api 
        2. 提供get remain usage api
        3. 額度判斷與訊息回饋 (UI)
    * CLI上傳
        1. Harbor project default api quota
    * 
* 增額
如何增加額度
    * 提供 set harbor quota api

7. Demo情境
7-1. 專案啟動
* 建立私有與專案空間
    * 兩個專案皆成功被建立出來
* 使用者資訊與權限配給
    * 私有空間只有自己和project admin(待確認), 共享空間需包含所有LDAP記錄中的members
7-2. 權限操作
* 映像檔操作: 
    * 使用者可以刪除自己空間的映像檔.
* 映像檔上傳: 
    * 同專案下的兩個使用者不可上傳/下載至各對方的私有空間
    * 不同專案下的兩個使用者,不可上傳/下載至各對方的私有空間
7-3. 額度限制測試
* 限額:
    * 額度滿額時無法上傳映像檔
    * 額度滿額時擴增容量(專案與額度對應資訊紀錄在哪還須討論)
7-4. 列舉專案資訊
* 私有映像檔:
    * 使用POST MAN顯示以下資訊
    * First level content
        * ID
        * Name
        * tags
        * pulls
    * Second level content
        * Tag
        * size
        * pull-command (UI處理)
        * status
        * create time
        * download button (UI/Charlie處理)
        * scan result
        * delete
        * (share botton) (UI/Charlie處理)

* 共享映像檔:
    * 使用POST MAN顯示以下資訊
    * First level content
        * ID
        * Name
        * tags
        * pulls
    * Second level content
        * Tag
        * size
        * status
        * create time
        * scan result
        * delete (only project admin)

7-4. 映像檔上傳功能
* 上傳來源
    * 使用3種來源(S3/DH/Http(s))執行映像檔上傳
        * 目的專案要有映像檔
        * 映像檔的資訊需正確
    * 額度檢測機制
* 狀態檢視
    * 檢視上傳管理頁面工作狀態(Finished, error)

7-5. 映像檔分享功能
* 分享流程
    * 分享至共享頁面
* 狀態檢視
    * 檢視共享管理頁面工作狀態(Finished, error)
    * 使用POST MAN顯示以下資訊
    * First level content
        * ID
        * 來源映象檔名稱
        * 分享狀態
        * 建立時間
        * delete

7-6 複本功能
* 


7-7. 總共有3個項目分成兩個大綱. 
1. 私有映像檔架構實作
2. 私有映像檔功能開發
    1. 映像檔上傳
        a. 
    3. 映像檔分享

