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);
    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 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.

Best regards,
Alberto.

Quoting aguti...@ac.upc.edu:

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 <me...@juniper.net>:

Hi Alberto,
Please see inline ....

On Apr 8, 2015, at 1:54 AM, aguti...@ac.upc.edu<mailto:aguti...@ac.upc.edu> 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
Dev@lists.opencontrail.org<mailto:Dev@lists.opencontrail.org>
http://lists.opencontrail.org/mailman/listinfo/dev_lists.opencontrail.org








_______________________________________________
Dev mailing list
Dev@lists.opencontrail.org
http://lists.opencontrail.org/mailman/listinfo/dev_lists.opencontrail.org

Reply via email to