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