Great to hear, onwards!

On Wednesday, March 23, 2016, Krish <[email protected]> wrote:

> Thanks Bill/wfarner, Jake/jfarrell, Steve/t3hSteve, Joshua/jcohen, Maxim &
> all the others (forgive me if I miss your name here), who took time out to
> guide me over mail & on IRC over the past few days.
>
> The last hurdle, till now that is, was this:
> The java source has a lot of parameters annotated with @Nullable, which
> means we can set this param to null. Accordingly, I was setting them to
> `nil` in the golang structs, which made the client break while accessing
> nil fields.
> I had to modify the generated code a bit (trivial changes), to make it
> write only the fields that were present.
>
> There is still a long way to go to actually call this 'done', however, it
> looks good so far; just implemented the addInstances & getPendingReason
> APIs in my thrift client, and it works flawlessly. Getting a hang of how
> things work.
>
> For all the folks who might be interested in playing with the thrift API,
> please have a look @https://github.com/krish7919/aurora_thrift_api/.
> It doesn't have great documentation, but some comments to go with source
> code.
> I am also going to put up a short writeup on aurora, and how to use the
> APIs in the coming few days.
>
>
>
> --
> κρισhναν
>
> On Tue, Mar 22, 2016 at 3:53 PM, Krish <[email protected]
> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>
>> Thanks, Bill! Program counter is moving forward! :)
>>
>> Since, golang net/http does not support redirects, I hacked my code to
>> query all aurora cluster members if the request is redirected. The proper
>> fix, as Jake Farrell rightly pointed out on IRC, would be to make the go
>> code handle redirects by using a properly configured http client. But I can
>> delay that for now for some time.
>>
>> I got the proper getJobs list. I parse the resultant response as:
>> //parse the response
>> y := resp.Result_.GetJobsResult_.Configs
>> fmt.Println("Configs: ", y)
>>
>> I am sure there is a better way to parse the response in golang, instead
>> of getting a map.
>> I killed all the mesos slaves & query for the pending reason for a job
>> (which was already scheduled), and have a few doubts about it.
>>
>> Firstly, I thought passing an empty TaskQuery structure is supposed to
>> give me all the pending reasons.
>>
>> Secondly, I see (at least in golang) the Owner field is mandatory. The
>> client fails with a null pointer reference if it's not present.
>>
>> Thirdly, once I add the Owner field, aurora client receives an error from
>> the server as below, even though I have not set the Statuses and SlaveHosts
>> field:
>>
>> > ./aurora_client_service --api "http://54.209.127.224:8081/api";
>> ResponseCode: 'INVALID_REQUEST'
>> ServerInfo: 'ServerInfo({ClusterName:aurora-cluster StatsUrlPrefix:})'
>> Details: '[ResponseDetail({Message:Statuses or slaveHosts are not
>> supported in TaskQuery(owner:Identity(role:, user:), role:, environment:,
>> jobName:my_job, taskIds:[], statuses:[], instanceIds:[], slaveHosts:[],
>> jobKeys:[], offset:0, limit:0)})]'
>> Result: '<nil>'
>>
>>
>> My task query struct is as follows:
>>
>>     taskQuery := api.NewTaskQuery()
>>     //taskQuery.JobName = "my_job"
>>     //taskQuery.TaskIds = nil
>>     //taskQuery.Statuses = nil
>>     //taskQuery.InstanceIds = nil
>>     //taskQuery.SlaveHosts = nil
>>     //taskQuery.Environment = ""
>>     //taskQuery.JobKeys = nil
>>     //taskQuery.Offset = 0
>>     //taskQuery.Limit = 0
>>     //taskQuery.Role = ""
>>     taskQuery.Owner = &api.Identity {
>>         Role: "",
>>         User: "",
>>     }
>>     resp, err := client.GetPendingReason(taskQuery)
>>
>>
>>
>>
>> --
>> κρισhναν
>>
>> On Tue, Mar 22, 2016 at 6:26 AM, Bill Farner <[email protected]
>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>
>>> Figured it out.  I was first tipped off that the request being made is a
>>> GET, while i've normally seen HTTP thrift clients making POST requests.  I
>>> haven't yet drilled into the rationale behind the alternative client in the
>>> thrift library, but this fixed up your code on my trials:
>>>
>>> -   transport, err = thrift.NewTHttpClient(endpoint)
>>> + transport, err = thrift.NewTHttpPostClient(endpoint)
>>>
>>> On Sun, Mar 20, 2016 at 10:58 PM, Krish <[email protected]
>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>
>>>> Thanks Bill.
>>>> I checked the HTTP request. The sent packet data is:
>>>> GET /api HTTP/1.1
>>>> Host: 54.209.127.223:8081
>>>> User-Agent: Go-http-client/1.1
>>>> Accept-Encoding: gzip
>>>>
>>>> I can attach the complete capture if that is needed.
>>>>
>>>> Link to my code on github:
>>>> https://github.com/krish7919/aurora_thrift_api
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> κρισhναν
>>>>
>>>> On Sun, Mar 20, 2016 at 2:29 AM, Bill Farner <[email protected]
>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>
>>>>> Looks to me like it's failing before the request is even deserialized
>>>>> - in the thrift layer (the exception is thrown here
>>>>> <https://github.com/apache/thrift/blob/0.9.1/lib/java/src/org/apache/thrift/transport/TIOStreamTransport.java#L132>
>>>>> - EOF).  Can you capture the HTTP request that was sent by the client?
>>>>> That might provide more clues.
>>>>>
>>>>> Also, if you're able to put up a git repo with your client code, i can
>>>>> poke at it.
>>>>>
>>>>> On Sat, Mar 19, 2016 at 11:26 AM, Krish <[email protected]
>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>
>>>>>> Hi Bill,
>>>>>> Tried digging more about aurora thrift API this weekend.
>>>>>> The thrift generated code is a good reference point.
>>>>>>
>>>>>> You are right; the '/' path just gives me the list of URLs that one
>>>>>> gets on the browser when I query it using my thrift client.
>>>>>> Any pointers based on the data below will be very helpful to find out
>>>>>> why is aurora bailing out when processing the thrift request, or is it 
>>>>>> some
>>>>>> client side error that is causing it.
>>>>>>
>>>>>>
>>>>>> My thrift client trying to query for getJobs:
>>>>>>
>>>>>>     ....
>>>>>>     var protocolFactory thrift.TProtocolFactory
>>>>>>     var transport thrift.TTransport
>>>>>>     var client *api.ReadOnlySchedulerClient
>>>>>>     var err error
>>>>>>     transport, err = thrift.NewTHttpClient("
>>>>>> http://54.209.17.221:8081/api";)
>>>>>>     defer transport.Close()
>>>>>>     protocolFactory = thrift.NewTJSONProtocolFactory()
>>>>>>     client = api.NewReadOnlySchedulerClientFactory(transport,
>>>>>> protocolFactory)
>>>>>>     err = transport.Open()
>>>>>>     if err != nil {
>>>>>>         fmt.Println("Error opening socket: ", err)
>>>>>>         os.Exit(1)
>>>>>>     }
>>>>>>     defer transport.Close()
>>>>>>     fmt.Println(client.GetJobs(""))
>>>>>>     ....
>>>>>>
>>>>>>
>>>>>> I did a wireshark analysis of outgoing packets to aurora, & I do get
>>>>>> a response packet from aurora, and my thrift client bails out with an 
>>>>>> error
>>>>>> (runtime error: invalid memory address or nil pointer dereference). The
>>>>>> data in the packet sent by server is:
>>>>>>
>>>>>> <html>
>>>>>> <head>
>>>>>> <meta http-equiv="Content-Type"
>>>>>> content="text/html;charset=ISO-8859-1"/>
>>>>>> <title>Error 500 </title>
>>>>>> </head>
>>>>>> <body>
>>>>>> <h2>HTTP ERROR: 500</h2>
>>>>>> <p>Problem accessing /api. Reason:
>>>>>> <pre>    javax.servlet.ServletException:
>>>>>> org.apache.thrift.transport.TTransportException</pre></p>
>>>>>> <hr /><a href="http://eclipse.org/jetty";>Powered by Jetty://
>>>>>> 9.3.6.v20151106</a><hr/>
>>>>>> </body>
>>>>>> </html>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Stacktrace from the server/aurora console logs:
>>>>>>
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: W0319 18:12:23.235
>>>>>> [qtp1289158047-127, ServletHandler:623]  javax.servlet.ServletException:
>>>>>> org.apache.thrift.transport.TTransportException
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.server.TServlet.doPost(TServlet.java:86)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.server.TServlet.doGet(TServlet.java:96)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
>>>>>> ~[javax.servlet-api-3.1.0.jar:3.1.0]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
>>>>>> ~[javax.servlet-api-3.1.0.jar:3.1.0]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.aurora.scheduler.http.LeaderRedirectFilter.doFilter(LeaderRedirectFilter.java:72)
>>>>>> ~[aurora-0.12.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.aurora.scheduler.http.AbstractFilter.doFilter(AbstractFilter.java:44)
>>>>>> ~[aurora-0.12.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.aurora.scheduler.http.HttpStatsFilter.doFilter(HttpStatsFilter.java:71)
>>>>>> ~[aurora-0.12.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.aurora.scheduler.http.AbstractFilter.doFilter(AbstractFilter.java:44)
>>>>>> ~[aurora-0.12.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
>>>>>> ~[guice-servlet-3.0.jar:na]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668)
>>>>>> ~[jetty-servlet-9.3.6.v20151106.jar:9.3.6.v20151106]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
>>>>>> [jetty-servlet-9.3.6.v20151106.jar:9.3.6.v20151106]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)
>>>>>> [jetty-server-9.3.6.v20151106.jar:9.3.6.v20151106]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
>>>>>> [jetty-servlet-9.3.6.v20151106.jar:9.3.6.v20151106]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
>>>>>> [jetty-server-9.3.6.v20151106.jar:9.3.6.v20151106]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
>>>>>> [jetty-server-9.3.6.v20151106.jar:9.3.6.v20151106]
>>>>>> ...
>>>>>> ...
>>>>>> ...
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: Caused by:
>>>>>> org.apache.thrift.transport.TTransportException: null
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.protocol.TJSONProtocol$LookaheadReader.read(TJSONProtocol.java:263)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.protocol.TJSONProtocol.readJSONSyntaxChar(TJSONProtocol.java:320)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.protocol.TJSONProtocol.readJSONArrayStart(TJSONProtocol.java:784)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.protocol.TJSONProtocol.readMessageBegin(TJSONProtocol.java:795)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: at
>>>>>> org.apache.thrift.server.TServlet.doPost(TServlet.java:83)
>>>>>> ~[libthrift-0.9.1.jar:0.9.1]
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: ... 51 common frames
>>>>>> omitted
>>>>>> Mar 19 18:12:23 aurora-3 start.bash[21316]: I0319 18:12:23.235
>>>>>> [qtp1289158047-127, Slf4jRequestLog:60] 10.20.3.241 - -
>>>>>> [19/Mar/2016:18:12:23 +
>>>>>> 0000] "GET //54.209.17.221:8081/api HTTP/1.1" 500 389
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> κρισhναν
>>>>>>
>>>>>> On Fri, Mar 18, 2016 at 9:58 PM, Bill Farner <[email protected]
>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>
>>>>>>> 8081 is indeed the default thrift port.  If you can capture a raw
>>>>>>> HTTP request, we could diagnose this better.  My first hunch is that the
>>>>>>> thrift client expects the API to be mounted at /, when in fact we mount 
>>>>>>> it
>>>>>>> at /api.
>>>>>>>
>>>>>>> Jake can probably tell you exactly what's wrong based on his code,
>>>>>>> but in the meantime you might find it helpful to compare against how we 
>>>>>>> set
>>>>>>> up the JS and python clients:
>>>>>>>
>>>>>>>
>>>>>>> https://github.com/apache/aurora/blob/master/src/main/resources/scheduler/assets/js/services.js#L185-L188
>>>>>>>
>>>>>>>
>>>>>>> https://github.com/apache/aurora/blob/master/src/main/python/apache/aurora/client/api/scheduler_client.py#L106-L115
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Mar 18, 2016 at 7:50 AM, Krish <[email protected]
>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>
>>>>>>>> Apologies for multiple mails, the previous email was sent
>>>>>>>> accidentally.
>>>>>>>> I didn't add a problem description, before hitting send.
>>>>>>>>
>>>>>>>> When I query aurora for all the jobs using getJobs, I find the
>>>>>>>> aurora error as given below and the response I get using my client.
>>>>>>>>
>>>>>>>> --
>>>>>>>> κρισhναν
>>>>>>>>
>>>>>>>> On Fri, Mar 18, 2016 at 8:15 PM, Krish <[email protected]
>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>>
>>>>>>>>> Thanks Jake!
>>>>>>>>>
>>>>>>>>> That worked like a charm, & I was wondering why does install from
>>>>>>>>> source doesn't work!
>>>>>>>>>
>>>>>>>>> Aurora Log:
>>>>>>>>> Mar 18 14:34:49 adx-aurora-2 aurora-start.bash[947]: W0318
>>>>>>>>> 14:34:49.109 [qtp743672940-126, HttpParser:1286] bad HTTP parsed: 400 
>>>>>>>>> for
>>>>>>>>> HttpChannelOverHttp@11212ec3{r=0,c=false,a=IDLE,uri=null}
>>>>>>>>>
>>>>>>>>> Thrift client:
>>>>>>>>> ./mrfantastic_service.out
>>>>>>>>> Connecting to aurora....
>>>>>>>>> <nil> EOF
>>>>>>>>>
>>>>>>>>> Thrift client sourcec:
>>>>>>>>> func thriftAuroraJobs() {
>>>>>>>>>     var protocolFactory thrift.TProtocolFactory
>>>>>>>>>     var transportFactory thrift.TTransportFactory
>>>>>>>>>     var transport thrift.TTransport
>>>>>>>>>     var client *api.ReadOnlySchedulerClient
>>>>>>>>>     var err error
>>>>>>>>>
>>>>>>>>>     protocolFactory = thrift.NewTBinaryProtocolFactoryDefault()
>>>>>>>>>     //transportFactory =
>>>>>>>>> thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
>>>>>>>>>     transportFactory = thrift.NewTTransportFactory()
>>>>>>>>>     fmt.Println("Connecting to aurora....")
>>>>>>>>>     transport, err = thrift.NewTSocket("54.210.234.190:8081")
>>>>>>>>>     if err != nil {
>>>>>>>>>         fmt.Println("Error opening socket:", err)
>>>>>>>>>         os.Exit(1)
>>>>>>>>>         //return err
>>>>>>>>>     }
>>>>>>>>>     if transport == nil {
>>>>>>>>>         os.Exit(1)
>>>>>>>>>     }
>>>>>>>>>     transport = transportFactory.GetTransport(transport)
>>>>>>>>>     if transport == nil {
>>>>>>>>>         os.Exit(1)
>>>>>>>>>     }
>>>>>>>>>     err = transport.Open()
>>>>>>>>>     if err != nil {
>>>>>>>>>         os.Exit(1)
>>>>>>>>>     }
>>>>>>>>>     defer transport.Close()
>>>>>>>>>     client = api.NewReadOnlySchedulerClientFactory(transport,
>>>>>>>>> protocolFactory)
>>>>>>>>>     fmt.Println(client.GetJobs(""))
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> My hunch is that the thrift port isn't 8081, as the server/aurora
>>>>>>>>> is looking for HTTP data on the socket.
>>>>>>>>> Is there a config that needs to be set for thrift API to be
>>>>>>>>> initialized?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> κρισhναν
>>>>>>>>>
>>>>>>>>> On Thu, Mar 17, 2016 at 10:08 PM, Jake Farrell <
>>>>>>>>> [email protected]
>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>>>
>>>>>>>>>> if you just need the compiler you can install the thrift-compiler
>>>>>>>>>> package with one of the following, otherwise you can run 
>>>>>>>>>> ./bootstrap.sh &&
>>>>>>>>>> ./configure && cd compiler/cpp && make to just build the compiler.
>>>>>>>>>>
>>>>>>>>>> -Jake
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> deb packaging (tested with ubuntu trusty)
>>>>>>>>>>
>>>>>>>>>> > curl -sSL http://apache.org/dist/thrift/KEYS | gpg --import -
>>>>>>>>>> > gpg --export --armor 66B778F9 | sudo apt-key add -
>>>>>>>>>> > /etc/apt/sources.list.d/thrift.list
>>>>>>>>>>
>>>>>>>>>> deb http://www.apache.org/dist/thrift/debian 0.9.3 main
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> or for centos/rhel (tested with centos 7.2)
>>>>>>>>>>
>>>>>>>>>> > /etc/yum.repos.d/thrift.repo
>>>>>>>>>>
>>>>>>>>>> [thrift]
>>>>>>>>>> name=Apache Thrift rpm repo
>>>>>>>>>> baseurl=http://www.apache.org/dist/thrift/rpm/
>>>>>>>>>> enabled=1
>>>>>>>>>> gpgcheck=0
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Thu, Mar 17, 2016 at 12:32 PM, Krish <
>>>>>>>>>> [email protected]
>>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> Jake/Chris,
>>>>>>>>>>> Thanks for the info.
>>>>>>>>>>> When I try to install thrift v0.9.3 from source, I get an error
>>>>>>>>>>> as follows while running `make check`:
>>>>>>>>>>>     ...
>>>>>>>>>>>     ...
>>>>>>>>>>>     [junit] Running org.apache.thrift.protocol.TestTProtocolUtil
>>>>>>>>>>>     [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0,
>>>>>>>>>>> Time elapsed: 0.062 sec
>>>>>>>>>>>     [junit] Running
>>>>>>>>>>> org.apache.thrift.protocol.TestTSimpleJSONProtocol
>>>>>>>>>>>     [junit] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0,
>>>>>>>>>>> Time elapsed: 0.046 sec
>>>>>>>>>>>
>>>>>>>>>>> BUILD FAILED
>>>>>>>>>>> /tmp/thrift-0.9.3/lib/java/build.xml:202: Test
>>>>>>>>>>> org.apache.thrift.protocol.TestTSimpleJSONProtocol failed
>>>>>>>>>>>
>>>>>>>>>>> Total time: 17 seconds
>>>>>>>>>>> make[3]: *** [check-local] Error 1
>>>>>>>>>>> make[3]: Leaving directory `/tmp/thrift-0.9.3/lib/java'
>>>>>>>>>>> make[2]: *** [check-am] Error 2
>>>>>>>>>>> make[2]: Leaving directory `/tmp/thrift-0.9.3/lib/java'
>>>>>>>>>>> make[1]: *** [check-recursive] Error 1
>>>>>>>>>>> make[1]: Leaving directory `/tmp/thrift-0.9.3/lib'
>>>>>>>>>>> make: *** [check-recursive] Error 1
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> κρισhναν
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Mar 17, 2016 at 7:32 PM, Chris Bannister <
>>>>>>>>>>> [email protected]
>>>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> I've used the latest thrift to generate go code, and then
>>>>>>>>>>>> manually created executor config which works and is able to launch 
>>>>>>>>>>>> jobs.
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, 17 Mar 2016, 1:55 p.m. Jake Farrell, <
>>>>>>>>>>>> [email protected]
>>>>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi Krish
>>>>>>>>>>>>> We are using Thrift with go for all our api calls to Aurora,
>>>>>>>>>>>>> would recommend you use Thrift 0.9.3 to interact with the api.
>>>>>>>>>>>>>
>>>>>>>>>>>>> happy to help answer any questions you might have
>>>>>>>>>>>>>
>>>>>>>>>>>>> -Jake
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Thu, Mar 17, 2016 at 9:43 AM, Krish <
>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks, Bill.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Well I have started my foray into the the thrift API today.
>>>>>>>>>>>>>> And I think I am stuck with some thrift configs.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Does it matter if I use thrift v0.9.0 on the client side to
>>>>>>>>>>>>>> talk with aurora using thrift 0.9.1? Are they compatible? I 
>>>>>>>>>>>>>> couldn't find
>>>>>>>>>>>>>> any changelog or compatibility statement on the thrift project 
>>>>>>>>>>>>>> site.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Since Aurora v0.12 uses thrift version 0.9.1, and the debian
>>>>>>>>>>>>>> repos have 0.9.0, I had to compile the thrift compiler v0.9.1 
>>>>>>>>>>>>>> from source.
>>>>>>>>>>>>>> However, when I try to generate golang code, I think I hit a 
>>>>>>>>>>>>>> compiler bug:
>>>>>>>>>>>>>> krish@krish:/tmp
>>>>>>>>>>>>>> > thrift --gen go api.thrift
>>>>>>>>>>>>>> ./gen-go//api/ttypes.go:2623:6: missing ',' in composite
>>>>>>>>>>>>>> literal
>>>>>>>>>>>>>> ./gen-go//api/ttypes.go:2624:19: expected '==', found '='
>>>>>>>>>>>>>> WARNING - Running 'gofmt -w ./gen-go//api/ttypes.go' failed.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I can modify the golang code by hand, but I would like to
>>>>>>>>>>>>>> play it safe and use the working compiler from the debian repos.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Also, when I use thrift v0.9.0, and try to integrate code
>>>>>>>>>>>>>> into a test golang app, it fails to find "thriftlib/api" 
>>>>>>>>>>>>>> package. Anyone
>>>>>>>>>>>>>> faced a similar error and gone past it?
>>>>>>>>>>>>>> I have already done a `go get
>>>>>>>>>>>>>> git.apache.org/thrift.git/lib/go/thrift/...`
>>>>>>>>>>>>>> <http://git.apache.org/thrift.git/lib/go/thrift/...>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> κρισhναν
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Wed, Mar 16, 2016 at 10:30 PM, Bill Farner <
>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Regarding documentation - Maxim is correct that there isn't
>>>>>>>>>>>>>>> much in the way of independent/holistic docs for the thrift 
>>>>>>>>>>>>>>> API.  There is,
>>>>>>>>>>>>>>> however, scant javadoc-style documentation within the IDL spec 
>>>>>>>>>>>>>>> itself:
>>>>>>>>>>>>>>> https://github.com/apache/aurora/blob/master/api/src/main/thrift/org/apache/aurora/gen/api.thrift
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> If you are looking to use the thrift API directly, the most
>>>>>>>>>>>>>>> difficult API method will be defining the ExecutorConfig.data 
>>>>>>>>>>>>>>> value when
>>>>>>>>>>>>>>> calling createJob.  Please don't hesitate to ask for assistance 
>>>>>>>>>>>>>>> if you get
>>>>>>>>>>>>>>> to that point!
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Wed, Mar 16, 2016 at 9:19 AM, Maxim Khutornenko <
>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 1. All APIs require thrift inputs of the structs specified,
>>>>>>>>>>>>>>>>> and return thrift values only in Response.result field.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Correct. There is also 'details' field that may have
>>>>>>>>>>>>>>>> additional messages (of error or informational nature)
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 2. Is there a set of examples in the documentation to help
>>>>>>>>>>>>>>>>> understand Thrift API better?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> The thrift API is largely undocumented. There is an effort
>>>>>>>>>>>>>>>> to bring up a fully supported REST API that will presumably 
>>>>>>>>>>>>>>>> get documented
>>>>>>>>>>>>>>>> and become much easier to use. It's mostly in flux now.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 3. createJob(JobDescription desc, Lock lock):
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> This is the API to use when you a brand new service or
>>>>>>>>>>>>>>>> adhoc (batch) job created. The JobDescription is populated 
>>>>>>>>>>>>>>>> from the .aurora
>>>>>>>>>>>>>>>> config. You may want to trace "aurora job create" client 
>>>>>>>>>>>>>>>> command
>>>>>>>>>>>>>>>> implementation to see how it happens.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 4. What is the Lock object? I see that some APIs require
>>>>>>>>>>>>>>>>> locking and some don't. For example, createJob needs a Lock 
>>>>>>>>>>>>>>>>> object as
>>>>>>>>>>>>>>>>> parameter, & I am assuming that it is required so that one 
>>>>>>>>>>>>>>>>> does not create
>>>>>>>>>>>>>>>>> multiple jobs with the same JobKey.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Ignore this object as it's an echo of the old client
>>>>>>>>>>>>>>>> updater. It's now deprecated and will be removed soon. You can 
>>>>>>>>>>>>>>>> pass NULL
>>>>>>>>>>>>>>>> for now.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 5. addInstances(AddInstancesConfig cfg, Lock lock):
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Another echo of the client updater but this time it's got a
>>>>>>>>>>>>>>>> second life. Check out its new signature and comments in the 
>>>>>>>>>>>>>>>> api.thrift.
>>>>>>>>>>>>>>>> It's essentially a "scale-out" API that can add instances to 
>>>>>>>>>>>>>>>> the existing
>>>>>>>>>>>>>>>> job without changing the underlying task assumptions.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 6. getPendingResult(TaskQuery taskquery):
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> It's actually 'getPendingReason' and is currently used
>>>>>>>>>>>>>>>> exclusively by the UI to get the reason for a task PENDING 
>>>>>>>>>>>>>>>> state.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 7. setQuota & getQuota for setting user level quotas.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> This is to set role-level quota. Currently only required
>>>>>>>>>>>>>>>> for tasks with 'production=True'. Search through our docs for 
>>>>>>>>>>>>>>>> more details.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 8. killTasks to kill all running instances of a job in the
>>>>>>>>>>>>>>>>> cluster.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> It's quite versatile and can be used to kill some or all
>>>>>>>>>>>>>>>> instances of the job.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> 9. startJobUpdate(JobUpdateRequest request, string
>>>>>>>>>>>>>>>>> message):
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Your observations are correct. This is the main API to
>>>>>>>>>>>>>>>> change your service job in any way (including adding, removing 
>>>>>>>>>>>>>>>> or modifying
>>>>>>>>>>>>>>>> instances).
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> An aurora scheduling question is if I start a job with 5
>>>>>>>>>>>>>>>>> instances, and there are resources available to run only 4 of 
>>>>>>>>>>>>>>>>> them, does
>>>>>>>>>>>>>>>>> the entire job block, or only the 5th instance of the job 
>>>>>>>>>>>>>>>>> blocks?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Scheduler will try to schedule as many instances as it can.
>>>>>>>>>>>>>>>> Those that will not find resources will remain in PENDING 
>>>>>>>>>>>>>>>> state until more
>>>>>>>>>>>>>>>> resources are available. In your particular example only the 
>>>>>>>>>>>>>>>> 5th will
>>>>>>>>>>>>>>>> remain PENDING.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Wed, Mar 16, 2016 at 5:54 AM, Krish <
>>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>
>>>>>>>>>>>>>>>> > wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>> I was going through the Aurora Thrift API to determine how
>>>>>>>>>>>>>>>>> to add new jobs.
>>>>>>>>>>>>>>>>> I am using aurora v0.12 released last month and have
>>>>>>>>>>>>>>>>> upgraded to mesos v0.25 accordingly.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Below is a summary of my (very limited) understanding of
>>>>>>>>>>>>>>>>> some APIs, & would help it if someone can point out flaws in 
>>>>>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>> understanding:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    1. All APIs require thrift inputs of the structs
>>>>>>>>>>>>>>>>>    specified, and return thrift values only in 
>>>>>>>>>>>>>>>>> Response.result field.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    2. Is there a set of examples in the documentation to
>>>>>>>>>>>>>>>>>    help understand Thrift API better?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    3. createJob(JobDescription desc, Lock lock):
>>>>>>>>>>>>>>>>>    This is basically the API to replace the Aurora
>>>>>>>>>>>>>>>>>    DSL/.aurora files for job configuration.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    4. What is the Lock object? I see that some APIs
>>>>>>>>>>>>>>>>>    require locking and some don't. For example, createJob 
>>>>>>>>>>>>>>>>> needs a Lock object
>>>>>>>>>>>>>>>>>    as parameter, & I am assuming that it is required so that 
>>>>>>>>>>>>>>>>> one does not
>>>>>>>>>>>>>>>>>    create multiple jobs with the same JobKey.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    5. addInstances(AddInstancesConfig cfg, Lock lock):
>>>>>>>>>>>>>>>>>    By the naming convention, it seems this is used to
>>>>>>>>>>>>>>>>>    increase the number of instances of a job. It will not 
>>>>>>>>>>>>>>>>> result in stopping
>>>>>>>>>>>>>>>>>    of current instances of the job.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    My second explanation for this API: Since it uses a
>>>>>>>>>>>>>>>>>    set of instanceIds, this is used for adding already 
>>>>>>>>>>>>>>>>> running job in slaves
>>>>>>>>>>>>>>>>>    to the internal data structures of Aurora to track the job.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    6. getPendingResult(TaskQuery taskquery):
>>>>>>>>>>>>>>>>>    Return the reason (in string) about why the job is
>>>>>>>>>>>>>>>>>    PENDING. For example: insufficient CPU.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    7. setQuota & getQuota for setting user level quotas.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    8. killTasks to kill all running instances of a job in
>>>>>>>>>>>>>>>>>    the cluster.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    9. startJobUpdate(JobUpdateRequest request, string
>>>>>>>>>>>>>>>>>    message):
>>>>>>>>>>>>>>>>>    Used for updating jobs with the new TaskConfig
>>>>>>>>>>>>>>>>>    specified. Can be used if resource requirement changes. 
>>>>>>>>>>>>>>>>> For example: If I
>>>>>>>>>>>>>>>>>    wanted aurora to update the version of container used for 
>>>>>>>>>>>>>>>>> a job using
>>>>>>>>>>>>>>>>>    TaskConfig.Container attribute.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> An aurora scheduling question is if I start a job with 5
>>>>>>>>>>>>>>>>> instances, and there are resources available to run only 4 of 
>>>>>>>>>>>>>>>>> them, does
>>>>>>>>>>>>>>>>> the entire job block, or only the 5th instance of the job 
>>>>>>>>>>>>>>>>> blocks?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thanks!
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>> κρισhναν
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to