如要選取 Kubernetes 提供的功能
命名空間
、a
元件會為每個元件指定 use
宣告
功能。不過,自
功能轉送涉及單一元件鏈結
但元件 use
的能力並不代表無論如何
廣告。無法使用的可能原因如下:
鏈結中的元件未將能力轉送到這些功能
無法解析元件。
如果元件 use
或轉送能力,其具有各種預期
並控制是否該能力可供使用在某些情況下,能力是
是元件作業不可或缺的一環
無法將能力轉送至元件
及早失敗以避免錯誤不過在其他情況下
可能容忍此能力是否不存在
未用於某些設定的字詞為配合這些
不同的情境,cml 會提供 availability
選項
use
、offer
和 expose
元件,可以宣告自身對於能力可用性的預期。
選項
這個架構支援下列 availability
選項:
必要
最常用的 availability
選項是 required
,表示
元件一律會預期可用的能力,
就可以正常運作。這是預設選項
如未指定可用性,則會自動設定。
選用
optional
表示某些能力可能不會出現在
儲存空間設定如果元件 use
是選用能力,而結果變成
無法使用,則此元件仍要能正常運作,例如
停用任何需要該能力的功能。
然而,如果某些設定無法使用 optional
能力,
架構預期拓撲仍會包含
在 void
中終止的能力。如此一來
必須讓擁有者明確選擇
可用 (其路徑終止在某些提供者元件中) 或者不是 (其路徑為
路線會在 void
終止)。如果路線不完整,
工具與診斷會將這種情況回報為
錯誤。
不透明
transitional
與 optional
的較弱版本類似。像 optional
,如果
元件使用 transitional
能力,應可容許
您能力?不過,與 optional
不同的是,transitional
路線無法
必須在 void
內終止。
在下列情況下,工具與診斷工具不會回報錯誤
transitional
路線不完整或無效。
「transitional」這個名稱表示這個做法對
轉場效果舉例來說,假設您有一個 Echo
通訊協定,而您想要
取代為 EchoV2
。在這項轉換作業的初期,您可以變更
用戶端至 use
新通訊協定,可用性為 transitional
。之後再一次
您可以將可用性升級至
required
或 optional
。如果您曾嘗試使用 optional
,
工具和診斷
用戶端元件的父項缺少 Echo2
的能力路徑,
transitional
將會略過這類警告。
與指定目標相同
same_as_target
的作用是直通式,也就是說,系統會提供
沿用自路徑目標元件設定的任何可用性。
這對傳遞許多功能的中間元件來說很實用。
因此當路徑的 availability
變更時,
則必須變更來源。
use
能力的元件是其最終目的地
「same_as_target
」不是「use
」的有效選項。
供應情形比較
「強度」的相對排序方式可用性選項。
由高至低排列:required > optional > transient
。
但 same_as_target
不包含在內,因為這是直通式,其強度
same_as_target
能力路徑有效等於
並沿用自目標的資源
這項指標有效,在很多情況下相當實用,目的是將可用性從
與目標原始碼相同舉例來說,如果元件 X
公開 required
Y
、Y
可能會選擇將能力 use
設為 optional
,或
透過 offer
將能力以 optional
的形式傳送給另一個子項。不過,轉送到
「升級」來源中的供應情形。發生這種情況時
嘗試使用或轉送能力會失敗,同樣地,功能也會失敗
則會傳回 true。這個錯誤表示:
試著為可用性設定比資料來源更強的保證
保證會放送舉例來說,對元件use
能力為 required
,前提是其父項offer
將能力設為 optional
。
因為表示父項已宣告這些能力可能無法使用。
工具與診斷
設定可用性的主要效果是控制主機工具和
並回報轉送錯誤簡單來說,這代表
availability
,廣告會較不嚴格。詳細規格如下:
- 如果
required
能力路徑不完整、無效,或以void
結束:- Scrutiny 會將這項錯誤回報為轉送錯誤。這將 如果建構設定通過此檢查,會導致建構錯誤。
component_manager
會使用WARNING
這個元件的範圍會說明轉送錯誤
- 如果
optional
能力路徑不完整或無效:- Scrutiny 會將這項錯誤回報為轉送錯誤。這將 如果建構設定通過此檢查,會導致建構錯誤。
component_manager
會在使用元件的INFO
說明轉送錯誤的範圍
- 如果
optional
能力路徑以void
結尾:- Scrutiny 不會回報錯誤。
component_manager
可能會記錄INFO
訊息,但不會記錄任何錯誤。
- 如果
transitional
能力路徑不完整、無效,或結尾為void
:- 不會記錄錯誤或其他資訊。
如果是一般的執行階段行為,availability
不會有任何作用。舉例來說,假設
某個元件嘗試 use
命名空間中的通訊協定,如果路徑中斷。
如果通訊協定是轉送為 required
或
optional
:
- 通訊協定會顯示在元件的命名空間中。
- 系統會成功連線至該能力的初始呼叫 (假設 標準單向 API 的使用方式 connect_to_protocol)。
component_manager
會嘗試轉送能力。最後 轉送作業將會失敗,而且管道將以NOT_FOUND
關閉 「epitaph」。
source_availability:不明
cml 還提供另一項功能,可用來自動產生
required
或 optional void
offer
,取決於
cml 資料分割,且其中包含
來源。如要進一步瞭解這項功能,請參閱
建構說明文件。
範例
以下範例說明本文件所述的概念。
這個範例中有三個元件:
echo_client
,以便嘗試使用echo_server
echo_server
,可提供部分通訊協定echo_realm
,echo_client
和echo_server
的父項,可連結兩者 全部在一起
讓我們來檢查 cml 檔案:
// echo_client.cml
{
...
use: [
{ protocol: "fuchsia.example.Echo" },
{
protocol: "fuchsia.example.EchoV2",
availability: "transitional",
},
{
protocol: "fuchsia.example.Stats",
availability: "optional",
},
],
}
// echo_server.cml
{
...
capabilities: [
{ protocol: "fuchsia.example.Echo" },
],
expose: [
{
protocol: "fuchsia.example.Echo",
from: "self",
},
],
}
// echo_realm.cml
{
offer: [
{
protocol: "fuchsia.example.Echo",
from: "#echo_server",
to: "#echo_client",
availability: "required",
},
{
protocol: "fuchsia.example.Stats",
from: "void",
to: "#echo_client",
availability: "optional",
},
],
children: [
{
name: "echo_server",
url: "echo_server#meta/echo_server.cm",
},
{
name: "echo_client",
url: "echo_client#meta/echo_client.cm",
},
],
}
請注意,省略 availability
時,預設為 required
。使用這項
拓撲時的行為如下:
- 「
echo_client
」將可成功連線至fuchsia.example.Echo
。 echo_client
無法連線至fuchsia.example.EchoV2
,或fuchsia.example.Stats
。- 工具和診斷不會記錄錯誤。
- 沒有發生
fuchsia.example.Stats
錯誤,因為這是optional
和路徑 至void
。 - 沒有發生
fuchsia.example.Stats
錯誤,因為這是transient
。
- 沒有發生
現在來看看不同版本會發生什麼情況:
// echo_client.cml
{
...
use: [
{ protocol: "fuchsia.example.Echo" },
{
protocol: "fuchsia.example.EchoV2",
availability: "transitional",
},
{
protocol: "fuchsia.example.Stats",
availability: "optional",
},
],
}
// echo_server.cml
{
...
capabilities: [
{
protocol: [
"fuchsia.example.Echo",
"fuchsia.example.EchoV2",
"fuchsia.example.Stats",
],
},
],
expose: [
{
protocol: [
"fuchsia.example.Echo",
"fuchsia.example.EchoV2",
],
from: "self",
},
{
protocol: "fuchsia.example.Stats",
from: "self",
availability: "optional",
},
],
}
// echo_realm.cml
{
offer: [
{
protocol: [
"fuchsia.example.Echo",
"fuchsia.example.EchoV2",
],
from: "#echo_server",
to: "#echo_client",
availability: "same_as_target",
},
{
protocol: "fuchsia.example.Stats",
from: "#echo_server",
to: "#echo_client",
availability: "optional",
},
],
children: [
{
name: "echo_server",
url: "echo_server#meta/echo_server.cm",
},
{
name: "echo_client",
url: "echo_client#meta/echo_client.cm",
},
],
}
現在:
- 「
echo_client
」將可成功連線至fuchsia.example.Echo
、fuchsia.example.EchoV2
和fuchsia.example.Stats
。- 每條路線都有不同的
availability
,且已完成 以實際元件終止而成 - 針對每個路線,來源和目標之間的供應情形會通過 比較檢查
- 每條路線都有不同的
- 由於所有路線都已完成,因此工具和診斷不會記錄錯誤。