说明:翻译自Network Configuration Subsystem
网络配置子系统允许应用程序将各种网络组件的属性和配置信息注入用于网络表示的模型中。示例包括(但不限于):
- 设备和设备端口的类型和名称
- 设备位置,所有者,硬件和软件版本
- 网络模型中是否允许包含组件
该配置可以指代在网络表示中可能存在或可能不存在的组件(即,系统可能/可能尚未在网络中发现它)。这意味着应用程序可以提供有关尚未发现的组件的提示,以及修改已知组件的属性。
该子系统同样充当系统的网络表示和配置它的方式之间的垫片。当前,JSON是描述组件配置的首选方法。
术语
Subject是对要通过此子系统配置的对象的引用或占位符。例如:用于网络设备的
DeviceId
或用于设备端口的ConnectPoint
。Config是给定对象的一组公开的可调项。示例:
BasicDeviceConfig
允许设置/更改设备的类型和南向驱动程序。Key或Subject key是主题的字符串名称。它用作包含配置值的JSON字段的键。示例:可以在带有键“devices”的字段中找到设备配置。
Config key是配置类的字符串名称。它也用作JSON字段密钥。示例:键“基本”是指设备允许的常规配置。与之关联的值可以是配置值的JSON表示形式。
Config operator可协调给定对象的不同网络配置信息源。来源包括描述(来自提供者),配置(来自此子系统)和意图(来自应用程序)。
组件
-
Subject是用作网络对象的唯一标识符的Java对象。它的字符串化形式用作与网络对象关联的配置相关联的JSON字段密钥。
示例:一个
Link
可以由一个LinkKey
(一对端点)唯一标识,因此我们将LinkKey
用作主题。LinkKey
可以用“ deviceId/port-deviceId/port”格式的字符串表示,反之,这样的字符串可用于生成LinkKey
。 -
Config
子类将subject的可调参数实现为JSON对象构造(ObjectNode
)的一组getter和setter(属性访问器)。示例:
OpticalPortConfig
定义为:public class OpticalPortConfig extends Config<ConnectPoint>
这意味着它将操纵与
ConnectPoint
主题(设备端口)相关的配置。其某些属性访问器包括端口的字符串和数字名称,以及端口支持的通道数。 -
SubjectFactory
将一个主题与其主题键相关联,并生成代表该主题的对象。示例:生成
ConnectPoints
的factory实例化为:public static final SubjectFactory<ConnectPoint> CONNECT_POINT_SUBJECT_FACTORY = new SubjectFactory<ConnectPoint>(ConnectPoint.class, "ports") { @Override public ConnectPoint createSubject(String key) { return ConnectPoint.deviceConnectPoint(key); } };
表示包含端口信息的JSON字段的密钥是在字符串“ports”上键入的,并且factory可以从“deviceId:port”字符串(
createSubject
的参数)创建ConnectPoints
。 -
ConfigFactory
将subject与其配置和配置键绑定,并生成Config
。示例:
OpticalPortConfig
的ConfigFactory定义为:// ConfigFactory<S, C extends Config<S>> new ConfigFactory<ConnectPoint, OpticalPortConfig> (CONNECT_POINT_SUBJECT_FACTORY, OpticalPortConfig.class, "optical") { @Override public OpticalPortConfig createConfig() { return new OpticalPortConfig(); } }
表示此
ConfigFactory
可以生成OpticalPortConfig
,并且可以使用子系统的相关主题(在这种情况下为ConnectPoint
)从子系统的管理器中获取给定光学端口的配置信息。在JSON结构中,键“basic”可用于提取由OpticalPortConfig
设置的值。 -
ConfigOperator
实现是类,用于实现合并来自不同来源的信息以及这些来源之间的转换的策略。示例:
BasicLinkOperator
定义了用于合并BasicLinkConfigs
和LinkDescriptions
的内容,以及将Link
对象和BasicLinkConfigs
转换为内核可以理解的LinkDescriptions
的方法。
配置语法
以下JSON树总结了subject,config,subject key,和config key之间的关系:
{
subject key 1 : {
subject 1 : {
config key 1 : {
attr1 : value1,
attr2 : value2,
...
},
config key 2 : {
...
}
},
subject 2 : {
...
},
subject key 2 {
...
}
例如,of:0000ffffffffff0a的ID(subject)标识的设备的配置可能如下所示:
{
"devices" : {
"of:0000ffffffffff0a" : {
"basic": {
"driver": "linc-oe",
"type": "ROADM",
"latitude": 33.8,
"name": "ATL-S10",
"longitude": -84.1
}
}
}
}
的确,如果您要看一看BasicDeviceConfig
及其超类,您会发现在以上两个类中定义的"basic"子句中的所有字段。
使用网络配置服务
使object可配置
网络配置子系统可用于配置任意网络对象。为了使对象可以通过此子系统进行配置,必须实现Components中描述的组件。需要注意的一些事情是:
-
SubjectFactory
实现属于SubjectFactories
。虽然您可能希望使用现有factory作为您选择的主题,但是如果subject需要其他键/创建技术,则除了现有factory之外,您可能还想实现一个新的SubjectFactory
。
-
必须向
NetworkConfigManager
注册ConfigFactory
。在BasicNetworkConfigs
中添加一个ConfigFactory
将导致子系统启动时对其进行注册。或者,您可以从应用程序手动调用NetworkConfigManager.registerConfigFactory()
:// in the application: @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected NetworkConfigRegistry registry; private ConfigFactory configFactory = new ConfigFactory(SubjectFactories.FOO_SUBJECT_FACTORY, FooConfig.class, "foo") { @Override public FooConfig createConfig() { return new FooConfig(); } }; public void register() { registry.registerConfigFactory(configFactory); }
ConfigOperator
根据其来源对信息强制执行优先顺序。通常,此子系统提供的配置会覆盖提供程序提供的信息。
使用应用程序中的服务
与其他服务一样,应用程序可以使用网络配置子系统的两种主要方式是:
注册为
NetworkConfigListener
:这使侦听器可以在添加,删除或修改配置时接收NetworkConfigEvent
。-
使用
getConfig()
请求配置:应用程序可以根据给定的主题和Config
类来获取绑定到某个网络元素的配置:public void doConfigThings(Device dev) { // a Device's subject is its ID DeviceId devId = dev.id(); BasicDeviceConfig bdc = configService.getConfig(devId, BasicDeviceConfig.class); // a attribute of a device is if it's allowed in the network model if (!bdc.isAllowed()) { log.warn("This device isn't allowed here!"); removeDevice(devId); } }