m (→Declare your YANG/MIB model:) |
m (→Binding your object instance into YANG or MIB model with follow command:) |
||
| Line 104: | Line 104: | ||
mibModule.loadModule(); | mibModule.loadModule(); | ||
| − | == | + | ====Initialize mapping between object instance and YANG/MIB model==== |
| − | + | ||
| − | < | + | *With Yang model |
| − | object.bindNetconf("<your yang model name>", "<your xpath model>"); | + | :Create object instance: |
| − | + | yourclass objectInstance("<name of node tree object intend to create the mapping>") | |
| − | + | ||
| − | + | :*'''Example''': | |
| − | + | /* | |
| − | + | * Should be defined at your main program or header file. | |
| − | object.bindSnmp("<your mib module name>", "<oid instance>"); | + | */ |
| − | + | NetworkInterface netif_eth0("interfaces"); | |
| + | |||
| + | :Initialize the mapping for object instance: | ||
| + | objectInstance.bindNetconf("<your yang model name>", "<your xpath model>"); | ||
| + | |||
| + | :*'''Example''': | ||
| + | /* | ||
| + | * Bind the "active" network interface to | ||
| + | * a "/ethernet/interfaces" subtree within | ||
| + | * the "network" module. | ||
| + | */ | ||
| + | netif_eth0.bindNetconf("network", "/ethernet/interfaces[name='eth0']"); | ||
| + | |||
| + | =====With MIB model===== | ||
| + | :Replace initialize mapping command with below API | ||
| + | object.bindSnmp("<your mib module name>", "<oid instance>"); | ||
| + | :*'''Example''': | ||
| + | /* | ||
| + | * Bind the "active" network interface to | ||
| + | * a "/ethernet/interfaces" subtree within | ||
| + | * the "network" module. | ||
| + | */ | ||
| + | netif_eth0.bindSnmp("NETWORK", "1.3.6.1.4.1.99840.2.1.1"); | ||
==Building your model:== | ==Building your model:== | ||
Revision as of 06:55, 23 January 2013
Contents |
Download Framework via github
root@desktop:/# git clone https://github.com/OpenClovis/SAFplus-Mgt.git <path>
Building thirdparty library
root@desktop:/# cd <path>/3rdparty root@desktop:<path>/3rdparty# make
Build CPP component on SAFplus Framework
This may be done in one of the following two ways:
Rebuild SAFplus
root@desktop:/# cd <safplusdir> root@desktop:/# mkdir -p prebuild root@desktop:/# export BUILD_CPP=1 root@desktop:/# <safplusdir>/src/SAFplus/configure --with-safplus-build root@desktop:/# cd build/local root@desktop:/# make
Build your model with extra configure
root@desktop:/# cd <project root> root@desktop:<project root># export BUILD_CPP=1 root@desktop:<project root># <safplusdir>/src/SAFplus/configure --with-safplus-build --with-model-name=<your model name> root@desktop:<project root># cd <your model name>/build/local root@desktop:/# make
Development your source code
- Using OpenClovis IDE:
- File -> Import -> General -> Existing Projects into Workspace -> Next -> Locate <git checkout Framework path>/models -> Finish.
- File:Import fw model.png
Defined your YANG model
- Using vim, gedit or IDE to create your Yang model and put those models into <model>/src/extras/share/netconf/modules.
- In case you would like to convert YANG model to MIB model, follow instruction at the link: Convert YANG to MIB model and also put the MIB model at <model>/src/extras/share/snmp/mibs.
Implementation your model
- Create your C++ classes that derive from ClMgtObject base class or ClMgtObjectContainer or ClMgtList depend on your yang model.
- ClMgtObject: TODO
- ClMgtObjectContainer: TODO
- ClMgtList: TODO
Example
class NetworkInterface : public ClMgtObjectContainer {
private:
ClMgtIndex<string> name; // Interface name ex. "eth0". This is also the index into this data.
/*
* "Prov" objects are "provisioned" -- that is, they are stored in the replicated database.
* When "bind" is called, these object will be loaded from the database's "active" configuration.
* Once bound when the database is modified via an incoming provisioning request, these objects are notified.
* ClMgtProv is a template that wraps provisioning functionality around any fundamental type (by fundamental I mean
* any type that is serializable via memcpy).
*/
ClMgtProv<bool> adminStatus; // Administrative status. If you want this to be "up" set it to "true". "False" = "down"
ClMgtProv<ClIpAddress> ipAddress;
ClMgtProv<ClIpAddress> netMask;
ClMgtProv<ClIpAddress> gateway;
ClMgtStat<uint64_t> errorCount; // Cumulative count of errors
/*
* ClMgtHistoryStat is an in-ram statistic that returns cumulative count AND contains sub-nodes which are arrays of 10 values containing historical (starting now and extending into the past) data:
* 5sec: the cumulative count within second 0-5, 5-10, 10-15, ...
* 1min:
* 5min:
* 1hr:
* 1day:
* 1week:
* 4weeks:
* 1year:
*/
ClMgtHistoryStat<uint64_t> bytesSent;
ClMgtHistoryStat<uint64_t> bytesReceived;
public:
NetworkInterface(const char* objName);
virtual ~NetworkInterface();
void initialize(std::string ifName, ClMgtObject* parent);
void get(void **ppBuffer, ClUint64T *pBuffLen);
void set(void *pBuffer, ClUint64T buffLen, ClTransaction& t = NO_TRANSACTION);
string IpAddress();
};
Declare your YANG/MIB model:
- With YANG module:
/*
* Declare "<your yang model name>" module
* Should be defined at your main program or header file.
*/
ClMgtModule yangModule("<your yang model name>");
/*
* Initialize the module
*/
yangModule.loadModule();
- With MIB model:
/*
* Declare "<your mib module name>" module
* Should be defined at your main program or header file.
*/
ClMgtModule mibModule("<your mib module name>");
/*
* Initialize the module
*/
mibModule.loadModule();
Initialize mapping between object instance and YANG/MIB model
- With Yang model
- Create object instance:
yourclass objectInstance("<name of node tree object intend to create the mapping>")
- Example:
/*
* Should be defined at your main program or header file.
*/
NetworkInterface netif_eth0("interfaces");
- Initialize the mapping for object instance:
objectInstance.bindNetconf("<your yang model name>", "<your xpath model>");
- Example:
/*
* Bind the "active" network interface to
* a "/ethernet/interfaces" subtree within
* the "network" module.
*/
netif_eth0.bindNetconf("network", "/ethernet/interfaces[name='eth0']");
With MIB model
- Replace initialize mapping command with below API
object.bindSnmp("<your mib module name>", "<oid instance>");
- Example:
/*
* Bind the "active" network interface to
* a "/ethernet/interfaces" subtree within
* the "network" module.
*/
netif_eth0.bindSnmp("NETWORK", "1.3.6.1.4.1.99840.2.1.1");
Building your model:
Right click project -> Build Project
Running your model:
<model image>/etc/init.d/safplus start
FAQ:
Question: Cannot connect to NETCONF
Answer:
- If you are running your model with non-root user, port 830 cannot being listening. Your should manual running the script at <model image>/etc/init.d/customerScript.sh with root privileges and test your connect with below command:
- sudo sh <model image>/etc/init.d/customerScript.sh start --> to start sshd listening
-
or
- sudo sh <model image>/etc/init.d/customerScript.sh stop --> to stop sshd listening
Question: Make 3rdparty failed at libssh2: Need OpenSSL or Libgcrypt (such as Fedora or Centos)
Answer:
- sudo yum install libgcrypt-devel