cloud_tasks_client.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. // Copyright 2019 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // Code generated by gapic-generator. DO NOT EDIT.
  15. package cloudtasks
  16. import (
  17. "context"
  18. "fmt"
  19. "math"
  20. "time"
  21. "github.com/golang/protobuf/proto"
  22. gax "github.com/googleapis/gax-go/v2"
  23. "google.golang.org/api/iterator"
  24. "google.golang.org/api/option"
  25. "google.golang.org/api/transport"
  26. taskspb "google.golang.org/genproto/googleapis/cloud/tasks/v2beta2"
  27. iampb "google.golang.org/genproto/googleapis/iam/v1"
  28. "google.golang.org/grpc"
  29. "google.golang.org/grpc/codes"
  30. "google.golang.org/grpc/metadata"
  31. )
  32. // CallOptions contains the retry settings for each method of Client.
  33. type CallOptions struct {
  34. ListQueues []gax.CallOption
  35. GetQueue []gax.CallOption
  36. CreateQueue []gax.CallOption
  37. UpdateQueue []gax.CallOption
  38. DeleteQueue []gax.CallOption
  39. PurgeQueue []gax.CallOption
  40. PauseQueue []gax.CallOption
  41. ResumeQueue []gax.CallOption
  42. GetIamPolicy []gax.CallOption
  43. SetIamPolicy []gax.CallOption
  44. TestIamPermissions []gax.CallOption
  45. ListTasks []gax.CallOption
  46. GetTask []gax.CallOption
  47. CreateTask []gax.CallOption
  48. DeleteTask []gax.CallOption
  49. LeaseTasks []gax.CallOption
  50. AcknowledgeTask []gax.CallOption
  51. RenewLease []gax.CallOption
  52. CancelLease []gax.CallOption
  53. RunTask []gax.CallOption
  54. }
  55. func defaultClientOptions() []option.ClientOption {
  56. return []option.ClientOption{
  57. option.WithEndpoint("cloudtasks.googleapis.com:443"),
  58. option.WithScopes(DefaultAuthScopes()...),
  59. }
  60. }
  61. func defaultCallOptions() *CallOptions {
  62. retry := map[[2]string][]gax.CallOption{
  63. {"default", "idempotent"}: {
  64. gax.WithRetry(func() gax.Retryer {
  65. return gax.OnCodes([]codes.Code{
  66. codes.DeadlineExceeded,
  67. codes.Unavailable,
  68. }, gax.Backoff{
  69. Initial: 100 * time.Millisecond,
  70. Max: 60000 * time.Millisecond,
  71. Multiplier: 1.3,
  72. })
  73. }),
  74. },
  75. }
  76. return &CallOptions{
  77. ListQueues: retry[[2]string{"default", "idempotent"}],
  78. GetQueue: retry[[2]string{"default", "idempotent"}],
  79. CreateQueue: retry[[2]string{"default", "non_idempotent"}],
  80. UpdateQueue: retry[[2]string{"default", "non_idempotent"}],
  81. DeleteQueue: retry[[2]string{"default", "idempotent"}],
  82. PurgeQueue: retry[[2]string{"default", "non_idempotent"}],
  83. PauseQueue: retry[[2]string{"default", "non_idempotent"}],
  84. ResumeQueue: retry[[2]string{"default", "non_idempotent"}],
  85. GetIamPolicy: retry[[2]string{"default", "idempotent"}],
  86. SetIamPolicy: retry[[2]string{"default", "non_idempotent"}],
  87. TestIamPermissions: retry[[2]string{"default", "idempotent"}],
  88. ListTasks: retry[[2]string{"default", "idempotent"}],
  89. GetTask: retry[[2]string{"default", "idempotent"}],
  90. CreateTask: retry[[2]string{"default", "non_idempotent"}],
  91. DeleteTask: retry[[2]string{"default", "idempotent"}],
  92. LeaseTasks: retry[[2]string{"default", "non_idempotent"}],
  93. AcknowledgeTask: retry[[2]string{"default", "non_idempotent"}],
  94. RenewLease: retry[[2]string{"default", "non_idempotent"}],
  95. CancelLease: retry[[2]string{"default", "non_idempotent"}],
  96. RunTask: retry[[2]string{"default", "non_idempotent"}],
  97. }
  98. }
  99. // Client is a client for interacting with Cloud Tasks API.
  100. //
  101. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.
  102. type Client struct {
  103. // The connection to the service.
  104. conn *grpc.ClientConn
  105. // The gRPC API client.
  106. client taskspb.CloudTasksClient
  107. // The call options for this service.
  108. CallOptions *CallOptions
  109. // The x-goog-* metadata to be sent with each request.
  110. xGoogMetadata metadata.MD
  111. }
  112. // NewClient creates a new cloud tasks client.
  113. //
  114. // Cloud Tasks allows developers to manage the execution of background
  115. // work in their applications.
  116. func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
  117. conn, err := transport.DialGRPC(ctx, append(defaultClientOptions(), opts...)...)
  118. if err != nil {
  119. return nil, err
  120. }
  121. c := &Client{
  122. conn: conn,
  123. CallOptions: defaultCallOptions(),
  124. client: taskspb.NewCloudTasksClient(conn),
  125. }
  126. c.setGoogleClientInfo()
  127. return c, nil
  128. }
  129. // Connection returns the client's connection to the API service.
  130. func (c *Client) Connection() *grpc.ClientConn {
  131. return c.conn
  132. }
  133. // Close closes the connection to the API service. The user should invoke this when
  134. // the client is no longer required.
  135. func (c *Client) Close() error {
  136. return c.conn.Close()
  137. }
  138. // setGoogleClientInfo sets the name and version of the application in
  139. // the `x-goog-api-client` header passed on each request. Intended for
  140. // use by Google-written clients.
  141. func (c *Client) setGoogleClientInfo(keyval ...string) {
  142. kv := append([]string{"gl-go", versionGo()}, keyval...)
  143. kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version)
  144. c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...))
  145. }
  146. // ListQueues lists queues.
  147. //
  148. // Queues are returned in lexicographical order.
  149. func (c *Client) ListQueues(ctx context.Context, req *taskspb.ListQueuesRequest, opts ...gax.CallOption) *QueueIterator {
  150. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent()))
  151. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  152. opts = append(c.CallOptions.ListQueues[0:len(c.CallOptions.ListQueues):len(c.CallOptions.ListQueues)], opts...)
  153. it := &QueueIterator{}
  154. req = proto.Clone(req).(*taskspb.ListQueuesRequest)
  155. it.InternalFetch = func(pageSize int, pageToken string) ([]*taskspb.Queue, string, error) {
  156. var resp *taskspb.ListQueuesResponse
  157. req.PageToken = pageToken
  158. if pageSize > math.MaxInt32 {
  159. req.PageSize = math.MaxInt32
  160. } else {
  161. req.PageSize = int32(pageSize)
  162. }
  163. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  164. var err error
  165. resp, err = c.client.ListQueues(ctx, req, settings.GRPC...)
  166. return err
  167. }, opts...)
  168. if err != nil {
  169. return nil, "", err
  170. }
  171. return resp.Queues, resp.NextPageToken, nil
  172. }
  173. fetch := func(pageSize int, pageToken string) (string, error) {
  174. items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
  175. if err != nil {
  176. return "", err
  177. }
  178. it.items = append(it.items, items...)
  179. return nextPageToken, nil
  180. }
  181. it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
  182. it.pageInfo.MaxSize = int(req.PageSize)
  183. return it
  184. }
  185. // GetQueue gets a queue.
  186. func (c *Client) GetQueue(ctx context.Context, req *taskspb.GetQueueRequest, opts ...gax.CallOption) (*taskspb.Queue, error) {
  187. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  188. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  189. opts = append(c.CallOptions.GetQueue[0:len(c.CallOptions.GetQueue):len(c.CallOptions.GetQueue)], opts...)
  190. var resp *taskspb.Queue
  191. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  192. var err error
  193. resp, err = c.client.GetQueue(ctx, req, settings.GRPC...)
  194. return err
  195. }, opts...)
  196. if err != nil {
  197. return nil, err
  198. }
  199. return resp, nil
  200. }
  201. // CreateQueue creates a queue.
  202. //
  203. // Queues created with this method allow tasks to live for a maximum of 31
  204. // days. After a task is 31 days old, the task will be deleted regardless of whether
  205. // it was dispatched or not.
  206. //
  207. // WARNING: Using this method may have unintended side effects if you are
  208. // using an App Engine queue.yaml or queue.xml file to manage your queues.
  209. // Read
  210. // Overview of Queue Management and queue.yaml (at https://cloud.google.com/tasks/docs/queue-yaml)
  211. // before using this method.
  212. func (c *Client) CreateQueue(ctx context.Context, req *taskspb.CreateQueueRequest, opts ...gax.CallOption) (*taskspb.Queue, error) {
  213. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent()))
  214. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  215. opts = append(c.CallOptions.CreateQueue[0:len(c.CallOptions.CreateQueue):len(c.CallOptions.CreateQueue)], opts...)
  216. var resp *taskspb.Queue
  217. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  218. var err error
  219. resp, err = c.client.CreateQueue(ctx, req, settings.GRPC...)
  220. return err
  221. }, opts...)
  222. if err != nil {
  223. return nil, err
  224. }
  225. return resp, nil
  226. }
  227. // UpdateQueue updates a queue.
  228. //
  229. // This method creates the queue if it does not exist and updates
  230. // the queue if it does exist.
  231. //
  232. // Queues created with this method allow tasks to live for a maximum of 31
  233. // days. After a task is 31 days old, the task will be deleted regardless of whether
  234. // it was dispatched or not.
  235. //
  236. // WARNING: Using this method may have unintended side effects if you are
  237. // using an App Engine queue.yaml or queue.xml file to manage your queues.
  238. // Read
  239. // Overview of Queue Management and queue.yaml (at https://cloud.google.com/tasks/docs/queue-yaml)
  240. // before using this method.
  241. func (c *Client) UpdateQueue(ctx context.Context, req *taskspb.UpdateQueueRequest, opts ...gax.CallOption) (*taskspb.Queue, error) {
  242. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "queue.name", req.GetQueue().GetName()))
  243. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  244. opts = append(c.CallOptions.UpdateQueue[0:len(c.CallOptions.UpdateQueue):len(c.CallOptions.UpdateQueue)], opts...)
  245. var resp *taskspb.Queue
  246. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  247. var err error
  248. resp, err = c.client.UpdateQueue(ctx, req, settings.GRPC...)
  249. return err
  250. }, opts...)
  251. if err != nil {
  252. return nil, err
  253. }
  254. return resp, nil
  255. }
  256. // DeleteQueue deletes a queue.
  257. //
  258. // This command will delete the queue even if it has tasks in it.
  259. //
  260. // Note: If you delete a queue, a queue with the same name can't be created
  261. // for 7 days.
  262. //
  263. // WARNING: Using this method may have unintended side effects if you are
  264. // using an App Engine queue.yaml or queue.xml file to manage your queues.
  265. // Read
  266. // Overview of Queue Management and queue.yaml (at https://cloud.google.com/tasks/docs/queue-yaml)
  267. // before using this method.
  268. func (c *Client) DeleteQueue(ctx context.Context, req *taskspb.DeleteQueueRequest, opts ...gax.CallOption) error {
  269. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  270. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  271. opts = append(c.CallOptions.DeleteQueue[0:len(c.CallOptions.DeleteQueue):len(c.CallOptions.DeleteQueue)], opts...)
  272. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  273. var err error
  274. _, err = c.client.DeleteQueue(ctx, req, settings.GRPC...)
  275. return err
  276. }, opts...)
  277. return err
  278. }
  279. // PurgeQueue purges a queue by deleting all of its tasks.
  280. //
  281. // All tasks created before this method is called are permanently deleted.
  282. //
  283. // Purge operations can take up to one minute to take effect. Tasks
  284. // might be dispatched before the purge takes effect. A purge is irreversible.
  285. func (c *Client) PurgeQueue(ctx context.Context, req *taskspb.PurgeQueueRequest, opts ...gax.CallOption) (*taskspb.Queue, error) {
  286. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  287. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  288. opts = append(c.CallOptions.PurgeQueue[0:len(c.CallOptions.PurgeQueue):len(c.CallOptions.PurgeQueue)], opts...)
  289. var resp *taskspb.Queue
  290. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  291. var err error
  292. resp, err = c.client.PurgeQueue(ctx, req, settings.GRPC...)
  293. return err
  294. }, opts...)
  295. if err != nil {
  296. return nil, err
  297. }
  298. return resp, nil
  299. }
  300. // PauseQueue pauses the queue.
  301. //
  302. // If a queue is paused then the system will stop dispatching tasks
  303. // until the queue is resumed via
  304. // [ResumeQueue][google.cloud.tasks.v2beta2.CloudTasks.ResumeQueue]. Tasks can still be added
  305. // when the queue is paused. A queue is paused if its
  306. // [state][google.cloud.tasks.v2beta2.Queue.state] is [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED].
  307. func (c *Client) PauseQueue(ctx context.Context, req *taskspb.PauseQueueRequest, opts ...gax.CallOption) (*taskspb.Queue, error) {
  308. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  309. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  310. opts = append(c.CallOptions.PauseQueue[0:len(c.CallOptions.PauseQueue):len(c.CallOptions.PauseQueue)], opts...)
  311. var resp *taskspb.Queue
  312. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  313. var err error
  314. resp, err = c.client.PauseQueue(ctx, req, settings.GRPC...)
  315. return err
  316. }, opts...)
  317. if err != nil {
  318. return nil, err
  319. }
  320. return resp, nil
  321. }
  322. // ResumeQueue resume a queue.
  323. //
  324. // This method resumes a queue after it has been
  325. // [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED] or
  326. // [DISABLED][google.cloud.tasks.v2beta2.Queue.State.DISABLED]. The state of a queue is stored
  327. // in the queue's [state][google.cloud.tasks.v2beta2.Queue.state]; after calling this method it
  328. // will be set to [RUNNING][google.cloud.tasks.v2beta2.Queue.State.RUNNING].
  329. //
  330. // WARNING: Resuming many high-QPS queues at the same time can
  331. // lead to target overloading. If you are resuming high-QPS
  332. // queues, follow the 500/50/5 pattern described in
  333. // Managing Cloud Tasks Scaling Risks (at https://cloud.google.com/tasks/docs/manage-cloud-task-scaling).
  334. func (c *Client) ResumeQueue(ctx context.Context, req *taskspb.ResumeQueueRequest, opts ...gax.CallOption) (*taskspb.Queue, error) {
  335. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  336. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  337. opts = append(c.CallOptions.ResumeQueue[0:len(c.CallOptions.ResumeQueue):len(c.CallOptions.ResumeQueue)], opts...)
  338. var resp *taskspb.Queue
  339. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  340. var err error
  341. resp, err = c.client.ResumeQueue(ctx, req, settings.GRPC...)
  342. return err
  343. }, opts...)
  344. if err != nil {
  345. return nil, err
  346. }
  347. return resp, nil
  348. }
  349. // GetIamPolicy gets the access control policy for a [Queue][google.cloud.tasks.v2beta2.Queue].
  350. // Returns an empty policy if the resource exists and does not have a policy
  351. // set.
  352. //
  353. // Authorization requires the following
  354. // Google IAM (at https://cloud.google.com/iam) permission on the specified
  355. // resource parent:
  356. //
  357. // cloudtasks.queues.getIamPolicy
  358. func (c *Client) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {
  359. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "resource", req.GetResource()))
  360. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  361. opts = append(c.CallOptions.GetIamPolicy[0:len(c.CallOptions.GetIamPolicy):len(c.CallOptions.GetIamPolicy)], opts...)
  362. var resp *iampb.Policy
  363. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  364. var err error
  365. resp, err = c.client.GetIamPolicy(ctx, req, settings.GRPC...)
  366. return err
  367. }, opts...)
  368. if err != nil {
  369. return nil, err
  370. }
  371. return resp, nil
  372. }
  373. // SetIamPolicy sets the access control policy for a [Queue][google.cloud.tasks.v2beta2.Queue]. Replaces any existing
  374. // policy.
  375. //
  376. // Note: The Cloud Console does not check queue-level IAM permissions yet.
  377. // Project-level permissions are required to use the Cloud Console.
  378. //
  379. // Authorization requires the following
  380. // Google IAM (at https://cloud.google.com/iam) permission on the specified
  381. // resource parent:
  382. //
  383. // cloudtasks.queues.setIamPolicy
  384. func (c *Client) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {
  385. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "resource", req.GetResource()))
  386. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  387. opts = append(c.CallOptions.SetIamPolicy[0:len(c.CallOptions.SetIamPolicy):len(c.CallOptions.SetIamPolicy)], opts...)
  388. var resp *iampb.Policy
  389. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  390. var err error
  391. resp, err = c.client.SetIamPolicy(ctx, req, settings.GRPC...)
  392. return err
  393. }, opts...)
  394. if err != nil {
  395. return nil, err
  396. }
  397. return resp, nil
  398. }
  399. // TestIamPermissions returns permissions that a caller has on a [Queue][google.cloud.tasks.v2beta2.Queue].
  400. // If the resource does not exist, this will return an empty set of
  401. // permissions, not a [NOT_FOUND][google.rpc.Code.NOT_FOUND] error.
  402. //
  403. // Note: This operation is designed to be used for building permission-aware
  404. // UIs and command-line tools, not for authorization checking. This operation
  405. // may "fail open" without warning.
  406. func (c *Client) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) {
  407. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "resource", req.GetResource()))
  408. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  409. opts = append(c.CallOptions.TestIamPermissions[0:len(c.CallOptions.TestIamPermissions):len(c.CallOptions.TestIamPermissions)], opts...)
  410. var resp *iampb.TestIamPermissionsResponse
  411. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  412. var err error
  413. resp, err = c.client.TestIamPermissions(ctx, req, settings.GRPC...)
  414. return err
  415. }, opts...)
  416. if err != nil {
  417. return nil, err
  418. }
  419. return resp, nil
  420. }
  421. // ListTasks lists the tasks in a queue.
  422. //
  423. // By default, only the [BASIC][google.cloud.tasks.v2beta2.Task.View.BASIC] view is retrieved
  424. // due to performance considerations;
  425. // [response_view][google.cloud.tasks.v2beta2.ListTasksRequest.response_view] controls the
  426. // subset of information which is returned.
  427. //
  428. // The tasks may be returned in any order. The ordering may change at any
  429. // time.
  430. func (c *Client) ListTasks(ctx context.Context, req *taskspb.ListTasksRequest, opts ...gax.CallOption) *TaskIterator {
  431. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent()))
  432. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  433. opts = append(c.CallOptions.ListTasks[0:len(c.CallOptions.ListTasks):len(c.CallOptions.ListTasks)], opts...)
  434. it := &TaskIterator{}
  435. req = proto.Clone(req).(*taskspb.ListTasksRequest)
  436. it.InternalFetch = func(pageSize int, pageToken string) ([]*taskspb.Task, string, error) {
  437. var resp *taskspb.ListTasksResponse
  438. req.PageToken = pageToken
  439. if pageSize > math.MaxInt32 {
  440. req.PageSize = math.MaxInt32
  441. } else {
  442. req.PageSize = int32(pageSize)
  443. }
  444. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  445. var err error
  446. resp, err = c.client.ListTasks(ctx, req, settings.GRPC...)
  447. return err
  448. }, opts...)
  449. if err != nil {
  450. return nil, "", err
  451. }
  452. return resp.Tasks, resp.NextPageToken, nil
  453. }
  454. fetch := func(pageSize int, pageToken string) (string, error) {
  455. items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
  456. if err != nil {
  457. return "", err
  458. }
  459. it.items = append(it.items, items...)
  460. return nextPageToken, nil
  461. }
  462. it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
  463. it.pageInfo.MaxSize = int(req.PageSize)
  464. return it
  465. }
  466. // GetTask gets a task.
  467. func (c *Client) GetTask(ctx context.Context, req *taskspb.GetTaskRequest, opts ...gax.CallOption) (*taskspb.Task, error) {
  468. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  469. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  470. opts = append(c.CallOptions.GetTask[0:len(c.CallOptions.GetTask):len(c.CallOptions.GetTask)], opts...)
  471. var resp *taskspb.Task
  472. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  473. var err error
  474. resp, err = c.client.GetTask(ctx, req, settings.GRPC...)
  475. return err
  476. }, opts...)
  477. if err != nil {
  478. return nil, err
  479. }
  480. return resp, nil
  481. }
  482. // CreateTask creates a task and adds it to a queue.
  483. //
  484. // Tasks cannot be updated after creation; there is no UpdateTask command.
  485. //
  486. // For [App Engine queues][google.cloud.tasks.v2beta2.AppEngineHttpTarget], the maximum task size is
  487. // 100KB.
  488. //
  489. // For [pull queues][google.cloud.tasks.v2beta2.PullTarget], the maximum task size is 1MB.
  490. func (c *Client) CreateTask(ctx context.Context, req *taskspb.CreateTaskRequest, opts ...gax.CallOption) (*taskspb.Task, error) {
  491. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent()))
  492. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  493. opts = append(c.CallOptions.CreateTask[0:len(c.CallOptions.CreateTask):len(c.CallOptions.CreateTask)], opts...)
  494. var resp *taskspb.Task
  495. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  496. var err error
  497. resp, err = c.client.CreateTask(ctx, req, settings.GRPC...)
  498. return err
  499. }, opts...)
  500. if err != nil {
  501. return nil, err
  502. }
  503. return resp, nil
  504. }
  505. // DeleteTask deletes a task.
  506. //
  507. // A task can be deleted if it is scheduled or dispatched. A task
  508. // cannot be deleted if it has completed successfully or permanently
  509. // failed.
  510. func (c *Client) DeleteTask(ctx context.Context, req *taskspb.DeleteTaskRequest, opts ...gax.CallOption) error {
  511. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  512. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  513. opts = append(c.CallOptions.DeleteTask[0:len(c.CallOptions.DeleteTask):len(c.CallOptions.DeleteTask)], opts...)
  514. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  515. var err error
  516. _, err = c.client.DeleteTask(ctx, req, settings.GRPC...)
  517. return err
  518. }, opts...)
  519. return err
  520. }
  521. // LeaseTasks leases tasks from a pull queue for
  522. // [lease_duration][google.cloud.tasks.v2beta2.LeaseTasksRequest.lease_duration].
  523. //
  524. // This method is invoked by the worker to obtain a lease. The
  525. // worker must acknowledge the task via
  526. // [AcknowledgeTask][google.cloud.tasks.v2beta2.CloudTasks.AcknowledgeTask] after they have
  527. // performed the work associated with the task.
  528. //
  529. // The [payload][google.cloud.tasks.v2beta2.PullMessage.payload] is intended to store data that
  530. // the worker needs to perform the work associated with the task. To
  531. // return the payloads in the [response][google.cloud.tasks.v2beta2.LeaseTasksResponse], set
  532. // [response_view][google.cloud.tasks.v2beta2.LeaseTasksRequest.response_view] to
  533. // [FULL][google.cloud.tasks.v2beta2.Task.View.FULL].
  534. //
  535. // A maximum of 10 qps of [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks]
  536. // requests are allowed per
  537. // queue. [RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED]
  538. // is returned when this limit is
  539. // exceeded. [RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED]
  540. // is also returned when
  541. // [max_tasks_dispatched_per_second][google.cloud.tasks.v2beta2.RateLimits.max_tasks_dispatched_per_second]
  542. // is exceeded.
  543. func (c *Client) LeaseTasks(ctx context.Context, req *taskspb.LeaseTasksRequest, opts ...gax.CallOption) (*taskspb.LeaseTasksResponse, error) {
  544. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent()))
  545. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  546. opts = append(c.CallOptions.LeaseTasks[0:len(c.CallOptions.LeaseTasks):len(c.CallOptions.LeaseTasks)], opts...)
  547. var resp *taskspb.LeaseTasksResponse
  548. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  549. var err error
  550. resp, err = c.client.LeaseTasks(ctx, req, settings.GRPC...)
  551. return err
  552. }, opts...)
  553. if err != nil {
  554. return nil, err
  555. }
  556. return resp, nil
  557. }
  558. // AcknowledgeTask acknowledges a pull task.
  559. //
  560. // The worker, that is, the entity that
  561. // [leased][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks] this task must call this method
  562. // to indicate that the work associated with the task has finished.
  563. //
  564. // The worker must acknowledge a task within the
  565. // [lease_duration][google.cloud.tasks.v2beta2.LeaseTasksRequest.lease_duration] or the lease
  566. // will expire and the task will become available to be leased
  567. // again. After the task is acknowledged, it will not be returned
  568. // by a later [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks],
  569. // [GetTask][google.cloud.tasks.v2beta2.CloudTasks.GetTask], or
  570. // [ListTasks][google.cloud.tasks.v2beta2.CloudTasks.ListTasks].
  571. func (c *Client) AcknowledgeTask(ctx context.Context, req *taskspb.AcknowledgeTaskRequest, opts ...gax.CallOption) error {
  572. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  573. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  574. opts = append(c.CallOptions.AcknowledgeTask[0:len(c.CallOptions.AcknowledgeTask):len(c.CallOptions.AcknowledgeTask)], opts...)
  575. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  576. var err error
  577. _, err = c.client.AcknowledgeTask(ctx, req, settings.GRPC...)
  578. return err
  579. }, opts...)
  580. return err
  581. }
  582. // RenewLease renew the current lease of a pull task.
  583. //
  584. // The worker can use this method to extend the lease by a new
  585. // duration, starting from now. The new task lease will be
  586. // returned in the task's [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time].
  587. func (c *Client) RenewLease(ctx context.Context, req *taskspb.RenewLeaseRequest, opts ...gax.CallOption) (*taskspb.Task, error) {
  588. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  589. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  590. opts = append(c.CallOptions.RenewLease[0:len(c.CallOptions.RenewLease):len(c.CallOptions.RenewLease)], opts...)
  591. var resp *taskspb.Task
  592. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  593. var err error
  594. resp, err = c.client.RenewLease(ctx, req, settings.GRPC...)
  595. return err
  596. }, opts...)
  597. if err != nil {
  598. return nil, err
  599. }
  600. return resp, nil
  601. }
  602. // CancelLease cancel a pull task's lease.
  603. //
  604. // The worker can use this method to cancel a task's lease by
  605. // setting its [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] to now. This will
  606. // make the task available to be leased to the next caller of
  607. // [LeaseTasks][google.cloud.tasks.v2beta2.CloudTasks.LeaseTasks].
  608. func (c *Client) CancelLease(ctx context.Context, req *taskspb.CancelLeaseRequest, opts ...gax.CallOption) (*taskspb.Task, error) {
  609. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  610. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  611. opts = append(c.CallOptions.CancelLease[0:len(c.CallOptions.CancelLease):len(c.CallOptions.CancelLease)], opts...)
  612. var resp *taskspb.Task
  613. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  614. var err error
  615. resp, err = c.client.CancelLease(ctx, req, settings.GRPC...)
  616. return err
  617. }, opts...)
  618. if err != nil {
  619. return nil, err
  620. }
  621. return resp, nil
  622. }
  623. // RunTask forces a task to run now.
  624. //
  625. // When this method is called, Cloud Tasks will dispatch the task, even if
  626. // the task is already running, the queue has reached its [RateLimits][google.cloud.tasks.v2beta2.RateLimits] or
  627. // is [PAUSED][google.cloud.tasks.v2beta2.Queue.State.PAUSED].
  628. //
  629. // This command is meant to be used for manual debugging. For
  630. // example, [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] can be used to retry a failed
  631. // task after a fix has been made or to manually force a task to be
  632. // dispatched now.
  633. //
  634. // The dispatched task is returned. That is, the task that is returned
  635. // contains the [status][google.cloud.tasks.v2beta2.Task.status] after the task is dispatched but
  636. // before the task is received by its target.
  637. //
  638. // If Cloud Tasks receives a successful response from the task's
  639. // target, then the task will be deleted; otherwise the task's
  640. // [schedule_time][google.cloud.tasks.v2beta2.Task.schedule_time] will be reset to the time that
  641. // [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] was called plus the retry delay specified
  642. // in the queue's [RetryConfig][google.cloud.tasks.v2beta2.RetryConfig].
  643. //
  644. // [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] returns
  645. // [NOT_FOUND][google.rpc.Code.NOT_FOUND] when it is called on a
  646. // task that has already succeeded or permanently failed.
  647. //
  648. // [RunTask][google.cloud.tasks.v2beta2.CloudTasks.RunTask] cannot be called on a
  649. // [pull task][google.cloud.tasks.v2beta2.PullMessage].
  650. func (c *Client) RunTask(ctx context.Context, req *taskspb.RunTaskRequest, opts ...gax.CallOption) (*taskspb.Task, error) {
  651. md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName()))
  652. ctx = insertMetadata(ctx, c.xGoogMetadata, md)
  653. opts = append(c.CallOptions.RunTask[0:len(c.CallOptions.RunTask):len(c.CallOptions.RunTask)], opts...)
  654. var resp *taskspb.Task
  655. err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
  656. var err error
  657. resp, err = c.client.RunTask(ctx, req, settings.GRPC...)
  658. return err
  659. }, opts...)
  660. if err != nil {
  661. return nil, err
  662. }
  663. return resp, nil
  664. }
  665. // QueueIterator manages a stream of *taskspb.Queue.
  666. type QueueIterator struct {
  667. items []*taskspb.Queue
  668. pageInfo *iterator.PageInfo
  669. nextFunc func() error
  670. // InternalFetch is for use by the Google Cloud Libraries only.
  671. // It is not part of the stable interface of this package.
  672. //
  673. // InternalFetch returns results from a single call to the underlying RPC.
  674. // The number of results is no greater than pageSize.
  675. // If there are no more results, nextPageToken is empty and err is nil.
  676. InternalFetch func(pageSize int, pageToken string) (results []*taskspb.Queue, nextPageToken string, err error)
  677. }
  678. // PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
  679. func (it *QueueIterator) PageInfo() *iterator.PageInfo {
  680. return it.pageInfo
  681. }
  682. // Next returns the next result. Its second return value is iterator.Done if there are no more
  683. // results. Once Next returns Done, all subsequent calls will return Done.
  684. func (it *QueueIterator) Next() (*taskspb.Queue, error) {
  685. var item *taskspb.Queue
  686. if err := it.nextFunc(); err != nil {
  687. return item, err
  688. }
  689. item = it.items[0]
  690. it.items = it.items[1:]
  691. return item, nil
  692. }
  693. func (it *QueueIterator) bufLen() int {
  694. return len(it.items)
  695. }
  696. func (it *QueueIterator) takeBuf() interface{} {
  697. b := it.items
  698. it.items = nil
  699. return b
  700. }
  701. // TaskIterator manages a stream of *taskspb.Task.
  702. type TaskIterator struct {
  703. items []*taskspb.Task
  704. pageInfo *iterator.PageInfo
  705. nextFunc func() error
  706. // InternalFetch is for use by the Google Cloud Libraries only.
  707. // It is not part of the stable interface of this package.
  708. //
  709. // InternalFetch returns results from a single call to the underlying RPC.
  710. // The number of results is no greater than pageSize.
  711. // If there are no more results, nextPageToken is empty and err is nil.
  712. InternalFetch func(pageSize int, pageToken string) (results []*taskspb.Task, nextPageToken string, err error)
  713. }
  714. // PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
  715. func (it *TaskIterator) PageInfo() *iterator.PageInfo {
  716. return it.pageInfo
  717. }
  718. // Next returns the next result. Its second return value is iterator.Done if there are no more
  719. // results. Once Next returns Done, all subsequent calls will return Done.
  720. func (it *TaskIterator) Next() (*taskspb.Task, error) {
  721. var item *taskspb.Task
  722. if err := it.nextFunc(); err != nil {
  723. return item, err
  724. }
  725. item = it.items[0]
  726. it.items = it.items[1:]
  727. return item, nil
  728. }
  729. func (it *TaskIterator) bufLen() int {
  730. return len(it.items)
  731. }
  732. func (it *TaskIterator) takeBuf() interface{} {
  733. b := it.items
  734. it.items = nil
  735. return b
  736. }