Hi Alberto,
Sorry for the delay. Please see inline …
On Apr 13, 2015, at 3:14 AM, <[email protected]> <[email protected]> wrote:
> Hi,
>
> I got the following code modifying the test suite available in the Sandesh
> C++ library folder:
>
> int port = 8086;
> ASSERT_LT(0, port);
> std::cout << "Initializing Generator" << std::endl;
> Sandesh::InitGenerator("SandeshUVEAlarmTest-Client", "192.168.100.1",
> "Test", "0", evm_.get(), 0, NULL);
> std::cout << "Connecting to collector" << std::endl;
> Sandesh::ConnectToCollector("192.168.100.10", port);
> std::cout << "Handshake done" << std::endl;
> TASK_UTIL_EXPECT_TRUE(Sandesh::client()->state() ==
> SandeshClientSM::ESTABLISHED);
[Megh]: This should make sure that the client status is ESTABLISHED before
sending the message below.
> std::cout << "Connection to collector should be established" << std::endl;
> // add uve
> // case 0
> SandeshUVEData uve_data1;
> uve_data1.set_name("uve1");
> SandeshUVETest::Send(uve_data1);
>
> Here I disabled the sever initialization step as I want to use a real
> collector node (192.168.100.10). The execution is sent from IP 192.168.100.1.
>
> However, when evaluating the client status it's not
> SandeshClientSM::ESTABLISHED, it's in fact status 2, which is CONNECT. So it
> seems to be a step missing.
>
> On the connector log I get the following output for the execution:
> 2015-04-13 Mon 10:05:02:264.921 UTC contrail [Thread 140679780972416, Pid
> 1975]: Session 192.168.100.10:8086::192.168.100.1:54945(15)< Accepted session
> from 192.168.100.1:54945
>
> 2015-04-13 Mon 10:05:21:736.472 UTC contrail [Thread 140679780972416, Pid
> 1975]: Session 192.168.100.10:8086::192.168.100.1:54945(15)< Read failed due
> to error 2 : End of file
>
> On the application I get the following:
> 2015-04-13 Mon 12:11:17:354.925 CEST Mahalanobis [Thread 140662758741952,
> Pid 5233]: primary 192.168.100.10:8086
> 2015-04-13 Mon 12:11:17:354.945 CEST Mahalanobis [Thread 140662758741952,
> Pid 5233]: secondary 0.0.0.0:0
> Handshake done
> 2015-04-13 Mon 12:11:17:355.309 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Processing scm::EvStart in state Idle
> 2015-04-13 Mon 12:11:17:355.415 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Disconnect
> 2015-04-13 Mon 12:11:17:355.566 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Processing scm::EvDiscUpdate in state Disconnect
> 2015-04-13 Mon 12:11:17:355.850 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Connect : Start Connect timer 192.168.100.10:8086
[Megh]: From the logs it does not seem that the state machine has moved to
ESTABLISHED. Your code should have failed when checking for the state above.
> 2015-04-13 Mon 12:11:17:355.984 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Processing scm::EvSandeshSend in state Connect
> 2015-04-13 Mon 12:11:17:356.012 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Wrong state: Connect for event: EvSandeshSend
> 2015-04-13 Mon 12:11:17:356.043 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Processing scm::EvSandeshSend in state Connect
> 2015-04-13 Mon 12:11:17:356.065 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Wrong state: Connect for event: EvSandeshSend
> 2015-04-13 Mon 12:11:17:356.093 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Processing scm::EvSandeshSend in state Connect
> 2015-04-13 Mon 12:11:17:356.116 CEST Mahalanobis [Thread 140662631671552,
> Pid 5233]: Wrong state: Connect for event: EvSandeshSend
>
>
>
> So, it seems to connects correctly but fails sending the UVE.
>
>
>
> Could anyone help me with this? Pointers to documentation would be really
> valuable.
My guess is that the TASK_UTIL_EXPECT_TRUE code is not waiting enough. Can you
please check?
The client state machine after connecting to the collector, sends a control
message to move to ClientInit state, and after that on receipt of the reply
from the collector moves to established. You can look at the code in
sandesh_client_sm.cc for details.
https://github.com/Juniper/contrail-sandesh/blob/master/library/cpp/sandesh_client_sm.cc
Thanks
Megh
>
> Best regards,
> Alberto.
>
> Quoting [email protected]:
>
>> Hi Megh,
>>
>> Thanks for your help. With that I think I got the compilation at hand.
>>
>> Now I'm trying to do a small application to send one message and die.
>>
>> I defined the following toy sandesh for testing:
>> struct UveVirtualNetworkAgent {
>> 1: string name(key="ObjectVNTable")
>> 2: optional i32 cpu
>> }
>>
>> uve sandesh UveVirtualNetworkAgentTrace {
>> 1: UveVirtualNetworkAgent data;
>> }
>>
>> Then I did the following code:
>> int main() {
>> Sandesh::InitGenerator()
>>
>> UveVirtualNetworkAgent a;
>> a.set_name("TestUnit");
>> a.set_cpu(100);
>> UveVirtualNetworkAgentTrace::Send(a);
>> }
>>
>> However I don't know which of the 2 InitGenerator functions from the Sandesh
>> module should I use and what is the meaning of each parameter.
>>
>> static bool InitGenerator(const std::string &module,
>> const std::string &source,
>> const std::string &node_type,
>> const std::string &instance_id,
>> EventManager *evm,
>> unsigned short http_port,
>> CollectorSubFn csf,
>> const std::vector<std::string> &collectors,
>> SandeshContext *client_context = NULL);
>>
>> static void InitGenerator(const std::string &module,
>> const std::string &source,
>> const std::string &node_type,
>> const std::string &instance_id,
>> EventManager *evm,
>> unsigned short http_port,
>> SandeshContext *client_context = NULL);
>>
>> Is there any source where it explains this part? I haven't found it yet.
>>
>> And one more question: Does setting name(key="ObjectVNTable") to "TestUnit"
>> create a new table in the database that I could query using de API of the
>> analytics module?
>>
>> Thank you for the support.
>>
>> Best regards,
>> Alberto.
>>
>> Quoting Megh Bhatt <[email protected]>:
>>
>>> Hi Alberto,
>>> Please see inline ....
>>>
>>> On Apr 8, 2015, at 1:54 AM, [email protected]<mailto:[email protected]>
>>> wrote:
>>>
>>> Dear all,
>>>
>>> I'm trying to create a new message to send with Sandesh protocol, however I
>>> don't know how to compile the generated code.
>>>
>>> Just a high level overview which you might already know. The sandesh
>>> compiler/code generator will be present in build/bin/sandesh after you
>>> execute scons at the top level. The source code for same is at This is used
>>> to generate the python/C++ code based on the .sandesh file. The generated
>>> code - .py files for python and .cpp files for C++ need to be used with the
>>> pysandesh package for python and libsandesh for C++ in client applications
>>> to send Sandesh messages to the contrail collector.
>>>
>>> Are you using C++ or python?
>>>
>>> We intend to use this messaging for testing purposes (at the moment) by
>>> means of an extra application which will send Sandesh messages each second.
>>>
>>>
>>> I have found the following explaination for the compilation with Scons:
>>> --------
>>> To use Sandesh, the following needs to be added to the module SConscript:
>>> /
>>> # Generate the source files
>>> SandeshGenFiles = env.SandeshGenCpp('VNS.sandesh')
>>> SandeshGenFiles += env.SandeshGenCpp('VNSwitch.sandesh')
>>>
>>> # The above returns VNS_types.h, VNS_types.cpp, VNS_constants.h
>>> # VNS_constants.cpp, VNSwitch_types.h, VNSwitch_types.cpp,
>>> # VNSwitch_constants.h, VNSwitch_constants.cpp
>>>
>>> # To include the header files above from your module's sources
>>> env.Append(CPPPATH = env['TOP'])
>>>
>>> # Extract the .cpp files to be used as sources
>>> SandeshGenSrcs = env.ExtractCpp(SandeshGenFiles)
>>>
>>> Add SandeshGenSrcs to the module source files
>>>
>>> Add libsandesh, and libbase to the module libraries.
>>> --------
>>>
>>> However I don't really get what's going on (I'm new to Scons).
>>>
>>> The SandeshGenCpp function/ scons builder is defined in
>>> tools/build/rules.py - https://github.com/Juniper/contrail-build
>>>
>>> Below is a relevant snippet ...
>>>
>>>
>>> # SandeshGenCpp Methods
>>> def SandeshCppBuilder(target, source, env):
>>> opath = target[0].dir.path
>>> sname = os.path.join(opath, os.path.splitext(source[0].name)[0])
>>>
>>> code = subprocess.call(env['SANDESH'] + ' --gen cpp --gen html -I
>>> controller/src/ -I tools -out '
>>> + opath + " " + source[0].path, shell=True)
>>> if code != 0:
>>> raise SCons.Errors.StopError(SandeshCodeGeneratorError,
>>> 'SandeshCpp code generation failed')
>>> tname = sname + "_html_template.cpp"
>>> hname = os.path.basename(sname + ".xml")
>>> cname = sname + "_html.cpp"
>>> if not env.Detect('xxd'):
>>> raise SCons.Errors.StopError(SandeshCodeGeneratorError,
>>> 'xxd not detected on system')
>>> os.system("echo \"namespace {\"" + " >> " + cname)
>>> os.system("(cd " + opath + " ; xxd -i " + hname + " >> " +
>>> os.path.basename(cname) + " )")
>>> os.system("echo \"}\"" + " >> " + cname)
>>> os.system("cat " + tname + " >> " + cname)
>>>
>>>
>>>
>>> As you can see, it runs build/bin/sandesh --gen cpp --gen html <other
>>> options> <.sandesh file> to produce the .cpp, .h files which then need to
>>> be compiled in the client application.
>>>
>>>
>>> I tried to copy the SConscript of the control module and adapt it but
>>> without results.
>>>
>>> Can anyone help me?
>>>
>>> Hope the above helps and please let me know if any more information is
>>> needed.
>>>
>>> Thanks
>>>
>>> Megh
>>>
>>>
>>> Best Regards,
>>> Alberto.
>>>
>>>
>>>
>>> _______________________________________________
>>> Dev mailing list
>>> [email protected]<mailto:[email protected]>
>>> http://lists.opencontrail.org/mailman/listinfo/dev_lists.opencontrail.org
>>>
>>>
>>
>>
>>
>
>
_______________________________________________
Dev mailing list
[email protected]
http://lists.opencontrail.org/mailman/listinfo/dev_lists.opencontrail.org