Onboard and Debug CORD Services

此篇文章將描述在開發 M-CORD Service 時,在 CORD 這種龐大的架構下,應該如何去 Debug Service 在哪裡寫錯了,作為未來找不到方向時的指引。

在最開始,我們可以做最基本的 Syntax Check,檢查 Service 是否有哪邊漏了冒號之類的:

1
2
# 對此資料夾下的所有 python 檔案做 Syntax Check
python -m py_compile $(find . -name '*.py')

若還是沒有錯誤,那可能就是引用到未知的 Library,畢竟在 M-CORD Service Development 時,修改別人的 Service 卻沒改對是很常見的。

Debug Using XOS API

在我們要 make xos 時,他會去 onboard 所有在 Makefile 被指定的 Service,若你的 Service 也在內且寫錯了,那就會看到一直處於 onboarding 的狀態當中。

此時,如果你檢查了 onboarding 使用的 check status api,可以發現是:

1
0.0.0.0:$1/api/utility/onboarding/$2/ready/

這邊所帶的兩個參數:

  • $1: 81 - XOS Default API Port
  • $2: services/name - 你的 Service 名稱

不過因為我們以 curl 回來的資訊,會是 html Source Code,並不便於我們觀看。

因此,可以考慮建立 SSH Tunnel 到 CORD Server 上:

1
2
# 192.168.121.233 為 prod 主機的 IP,請視情況更改
ssh -N -f -L 8888:192.168.121.233:81 [email protected]

接著你就能夠直接連線到以下網址去檢查問題:

localhost:8888/api/utility/onboarding/services/oai/ready/

Automatically create slice and instance

當我們已經完成 Service 時,可以考慮利用 mcord.yaml 來自動建立 Instance,這樣便不需要每次重新 Build M-CORD 後,都需要再次手動建立 Instance。

以下內容可以直接參考到 aweimeow/MCORD-OAIService 原始碼的內容。

node_type & node_templates

在 yaml 中定義可以參考到 TOSCA Simple Profile in YAML.,TOSCA 全名為 Topology and Orchestration Specification for Cloud Applications,是一種定義網路服務的格式。

node_type 會定義出我們擁有的 Node,例如在 OAI Component 便代表著我定義 Open Air Interface EPC 這個角色的節點。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
tosca.nodes.OAIComponent:
derived_from: tosca.nodes.Root
description: >
CORD: OAI Component of MCORD Service.
properties:
kind:
type: string
default: EPC
description: Kind of Component
display_message:
type: string
required: false
default: New OAI Component
description: Just a message
image_name:
type: string
required: true
default: default
description: Image Name of OAIComponent

裡面定義了這個 Node 有三個屬性:kind, display_message, image_name,還有他們的型態、預設值、是否再建立時為必須屬性,以及對於此屬性的簡單描述。

node_template 則定義了這個 Service,包含他的類型是 RANvEPC,以及 Service 的 Key Location。

這邊的 Key Location 對應到我們在 MakeFile 當中複製 id_rsaid_rsa.pub 的動作。

1
2
3
4
5
6
7
8
9
10
11
oai:
type: tosca.nodes.MCORDService
requirements:
properties:
kind: vEPC
icon_url: /static/mCordServices/service_server.png
view_url: /admin/oai/oaicomponent
public_key: { get_artifact: [ SELF, pubkey, LOCAL_FILE] }
private_key_fn: /opt/xos/services/oai/keys/oai_rsa
artifacts:
pubkey: /opt/xos/services/oai/keys/oai_rsa.pub

定義完以上兩者之後,我們還需要建立 Slice 作為 Tenant 的容器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysite_oai_slice1:
description: OAI Service Slice 1
type: tosca.nodes.Slice
requirements:
- oai:
node: oai
relationship: tosca.relationships.MemberOfService
- site:
node: mysite
relationship: tosca.relationships.MemberOfSite
- default_image:
node: nginx-web-server
relationship: tosca.relationships.DefaultImage
- default_flavor:
node: m1.large
relationship: tosca.relationships.DefaultFlavor
- connection_to_management:
node: management
relationship: tosca.relationships.ConnectsToNetwork
- connection_to_management_host:
node: management_host
relationship: tosca.relationships.ConnectsToNetwork
- connection_to_wan_network:
node: wan_network
relationship: tosca.relationships.ConnectsToNetwork

在 Slice 定義了使用的 Service放置 Slice 的地點 - site預設的 Image預設的 Flavor[1]連線到的網路

在這邊連到三個 Network:

  • management
  • management_host
  • wan_network

前面兩者能夠讓我們從外界連進這個 Slice 底下的 Tenant 進行操作,而 wan_network 則代表這個 Tenant 的對外網路能力。

最後是自動建立 Tenant:

1
2
3
4
5
6
7
8
9
10
11
tenant#oaitenant1:
type: tosca.nodes.OAIComponent
properties:
image_name: nginx-web-server
requirements:
- tenant:
node: oai
relationship: tosca.relationships.MemberOfService
- dependency:
node: mysite_oai_slice1
relationship: tosca.relationships.DependsOn

寫在最後

若想要對於 TOSCA Template Engine 更瞭解,可以參閱先前我撰寫的 CORD TOSCA Yaml Engine

文章當中的 TOSCA configuration file 都是把縮排去掉的版本,為了觀看方便,原始可執行的版本請見 aweimeow/MCORD-OAIService - mcord.yaml

若出現以下訊息時,請不要緊張:

1
2
3
4
5
6
ParserError: while parsing a block mapping
in "<unicode string>", line 238, column 7
did not find expected key
in "<unicode string>", line 246, column 8

make: *** [mcord] Error 255

它代表你的 YAML 寫錯了,你需要檢查在他說的那一行當中,是不是多一格空格或少一格空格。

而且,你不孤單,看看 這個連結 就知道多少人深受 YAML Format 所苦了 XD

References

[1] Openstack 對於 Virtual Machine 的資源定義,包含使用的 CPU 資源、使用的 Memory、Disk …,文件可參考到 OpenStack Docs: Flavors