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]> 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]> 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]> >> 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]> 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]> >>>> 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]> >>>>> 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]> >>>>>> 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]> >>>>>>> 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] >>>>>>>> > 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] >>>>>>>>> > 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]> 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]> 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]> 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]> 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]> 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]> 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ναν >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >
