dataproc-gen.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. // Package dataproc provides access to the Google Cloud Dataproc API.
  2. //
  3. // See https://cloud.google.com/dataproc/
  4. //
  5. // Usage example:
  6. //
  7. // import "google.golang.org/api/dataproc/v1"
  8. // ...
  9. // dataprocService, err := dataproc.New(oauthHttpClient)
  10. package dataproc // import "google.golang.org/api/dataproc/v1"
  11. import (
  12. "bytes"
  13. "encoding/json"
  14. "errors"
  15. "fmt"
  16. context "golang.org/x/net/context"
  17. ctxhttp "golang.org/x/net/context/ctxhttp"
  18. gensupport "google.golang.org/api/gensupport"
  19. googleapi "google.golang.org/api/googleapi"
  20. "io"
  21. "net/http"
  22. "net/url"
  23. "strconv"
  24. "strings"
  25. )
  26. // Always reference these packages, just in case the auto-generated code
  27. // below doesn't.
  28. var _ = bytes.NewBuffer
  29. var _ = strconv.Itoa
  30. var _ = fmt.Sprintf
  31. var _ = json.NewDecoder
  32. var _ = io.Copy
  33. var _ = url.Parse
  34. var _ = gensupport.MarshalJSON
  35. var _ = googleapi.Version
  36. var _ = errors.New
  37. var _ = strings.Replace
  38. var _ = context.Canceled
  39. var _ = ctxhttp.Do
  40. const apiId = "dataproc:v1"
  41. const apiName = "dataproc"
  42. const apiVersion = "v1"
  43. const basePath = "https://dataproc.googleapis.com/"
  44. // OAuth2 scopes used by this API.
  45. const (
  46. // View and manage your data across Google Cloud Platform services
  47. CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform"
  48. // Administrate log data for your projects
  49. LoggingAdminScope = "https://www.googleapis.com/auth/logging.admin"
  50. // View log data for your projects
  51. LoggingReadScope = "https://www.googleapis.com/auth/logging.read"
  52. // Submit log data for your projects
  53. LoggingWriteScope = "https://www.googleapis.com/auth/logging.write"
  54. )
  55. func New(client *http.Client) (*Service, error) {
  56. if client == nil {
  57. return nil, errors.New("client is nil")
  58. }
  59. s := &Service{client: client, BasePath: basePath}
  60. s.Media = NewMediaService(s)
  61. return s, nil
  62. }
  63. type Service struct {
  64. client *http.Client
  65. BasePath string // API endpoint base URL
  66. UserAgent string // optional additional User-Agent fragment
  67. Media *MediaService
  68. }
  69. func (s *Service) userAgent() string {
  70. if s.UserAgent == "" {
  71. return googleapi.UserAgent
  72. }
  73. return googleapi.UserAgent + " " + s.UserAgent
  74. }
  75. func NewMediaService(s *Service) *MediaService {
  76. rs := &MediaService{s: s}
  77. return rs
  78. }
  79. type MediaService struct {
  80. s *Service
  81. }
  82. // DiagnoseClusterOutputLocation: The location where output from
  83. // diagnostic command can be found.
  84. type DiagnoseClusterOutputLocation struct {
  85. // OutputUri: [Output-only] The Google Cloud Storage URI of the
  86. // diagnostic output. This will be a plain text file with summary of
  87. // collected diagnostics.
  88. OutputUri string `json:"outputUri,omitempty"`
  89. // ForceSendFields is a list of field names (e.g. "OutputUri") to
  90. // unconditionally include in API requests. By default, fields with
  91. // empty values are omitted from API requests. However, any non-pointer,
  92. // non-interface field appearing in ForceSendFields will be sent to the
  93. // server regardless of whether the field is empty or not. This may be
  94. // used to include empty fields in Patch requests.
  95. ForceSendFields []string `json:"-"`
  96. }
  97. func (s *DiagnoseClusterOutputLocation) MarshalJSON() ([]byte, error) {
  98. type noMethod DiagnoseClusterOutputLocation
  99. raw := noMethod(*s)
  100. return gensupport.MarshalJSON(raw, s.ForceSendFields)
  101. }
  102. // Media: Media resource.
  103. type Media struct {
  104. // ResourceName: Name of the media resource.
  105. ResourceName string `json:"resourceName,omitempty"`
  106. // ServerResponse contains the HTTP response code and headers from the
  107. // server.
  108. googleapi.ServerResponse `json:"-"`
  109. // ForceSendFields is a list of field names (e.g. "ResourceName") to
  110. // unconditionally include in API requests. By default, fields with
  111. // empty values are omitted from API requests. However, any non-pointer,
  112. // non-interface field appearing in ForceSendFields will be sent to the
  113. // server regardless of whether the field is empty or not. This may be
  114. // used to include empty fields in Patch requests.
  115. ForceSendFields []string `json:"-"`
  116. }
  117. func (s *Media) MarshalJSON() ([]byte, error) {
  118. type noMethod Media
  119. raw := noMethod(*s)
  120. return gensupport.MarshalJSON(raw, s.ForceSendFields)
  121. }
  122. // OperationMetadata: Metadata describing the operation.
  123. type OperationMetadata struct {
  124. // ClusterName: Name of the cluster for the operation.
  125. ClusterName string `json:"clusterName,omitempty"`
  126. // ClusterUuid: Cluster UUId for the operation.
  127. ClusterUuid string `json:"clusterUuid,omitempty"`
  128. // Details: A message containing any operation metadata details.
  129. Details string `json:"details,omitempty"`
  130. // EndTime: The time that the operation completed.
  131. EndTime string `json:"endTime,omitempty"`
  132. // InnerState: A message containing the detailed operation state.
  133. InnerState string `json:"innerState,omitempty"`
  134. // InsertTime: The time that the operation was requested.
  135. InsertTime string `json:"insertTime,omitempty"`
  136. // StartTime: The time that the operation was started by the server.
  137. StartTime string `json:"startTime,omitempty"`
  138. // State: A message containing the operation state.
  139. //
  140. // Possible values:
  141. // "UNKNOWN"
  142. // "PENDING"
  143. // "RUNNING"
  144. // "DONE"
  145. State string `json:"state,omitempty"`
  146. // Status: [Output-only] Current operation status.
  147. Status *OperationStatus `json:"status,omitempty"`
  148. // StatusHistory: [Output-only] Previous operation status.
  149. StatusHistory []*OperationStatus `json:"statusHistory,omitempty"`
  150. // ForceSendFields is a list of field names (e.g. "ClusterName") to
  151. // unconditionally include in API requests. By default, fields with
  152. // empty values are omitted from API requests. However, any non-pointer,
  153. // non-interface field appearing in ForceSendFields will be sent to the
  154. // server regardless of whether the field is empty or not. This may be
  155. // used to include empty fields in Patch requests.
  156. ForceSendFields []string `json:"-"`
  157. }
  158. func (s *OperationMetadata) MarshalJSON() ([]byte, error) {
  159. type noMethod OperationMetadata
  160. raw := noMethod(*s)
  161. return gensupport.MarshalJSON(raw, s.ForceSendFields)
  162. }
  163. // OperationStatus: The status of the operation.
  164. type OperationStatus struct {
  165. // Details: A message containing any operation metadata details.
  166. Details string `json:"details,omitempty"`
  167. // InnerState: A message containing the detailed operation state.
  168. InnerState string `json:"innerState,omitempty"`
  169. // State: A message containing the operation state.
  170. //
  171. // Possible values:
  172. // "UNKNOWN"
  173. // "PENDING"
  174. // "RUNNING"
  175. // "DONE"
  176. State string `json:"state,omitempty"`
  177. // StateStartTime: The time this state was entered.
  178. StateStartTime string `json:"stateStartTime,omitempty"`
  179. // ForceSendFields is a list of field names (e.g. "Details") to
  180. // unconditionally include in API requests. By default, fields with
  181. // empty values are omitted from API requests. However, any non-pointer,
  182. // non-interface field appearing in ForceSendFields will be sent to the
  183. // server regardless of whether the field is empty or not. This may be
  184. // used to include empty fields in Patch requests.
  185. ForceSendFields []string `json:"-"`
  186. }
  187. func (s *OperationStatus) MarshalJSON() ([]byte, error) {
  188. type noMethod OperationStatus
  189. raw := noMethod(*s)
  190. return gensupport.MarshalJSON(raw, s.ForceSendFields)
  191. }
  192. // method id "dataproc.media.download":
  193. type MediaDownloadCall struct {
  194. s *Service
  195. resourceName string
  196. urlParams_ gensupport.URLParams
  197. ifNoneMatch_ string
  198. ctx_ context.Context
  199. }
  200. // Download: Method for media download. Download is supported on the URI
  201. // `/v1/media/{+name}?alt=media`.
  202. func (r *MediaService) Download(resourceName string) *MediaDownloadCall {
  203. c := &MediaDownloadCall{s: r.s, urlParams_: make(gensupport.URLParams)}
  204. c.resourceName = resourceName
  205. return c
  206. }
  207. // Fields allows partial responses to be retrieved. See
  208. // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
  209. // for more information.
  210. func (c *MediaDownloadCall) Fields(s ...googleapi.Field) *MediaDownloadCall {
  211. c.urlParams_.Set("fields", googleapi.CombineFields(s))
  212. return c
  213. }
  214. // IfNoneMatch sets the optional parameter which makes the operation
  215. // fail if the object's ETag matches the given value. This is useful for
  216. // getting updates only after the object has changed since the last
  217. // request. Use googleapi.IsNotModified to check whether the response
  218. // error from Do is the result of In-None-Match.
  219. func (c *MediaDownloadCall) IfNoneMatch(entityTag string) *MediaDownloadCall {
  220. c.ifNoneMatch_ = entityTag
  221. return c
  222. }
  223. // Context sets the context to be used in this call's Do and Download
  224. // methods. Any pending HTTP request will be aborted if the provided
  225. // context is canceled.
  226. func (c *MediaDownloadCall) Context(ctx context.Context) *MediaDownloadCall {
  227. c.ctx_ = ctx
  228. return c
  229. }
  230. func (c *MediaDownloadCall) doRequest(alt string) (*http.Response, error) {
  231. var body io.Reader = nil
  232. c.urlParams_.Set("alt", alt)
  233. urls := googleapi.ResolveRelative(c.s.BasePath, "v1/media/{+resourceName}")
  234. urls += "?" + c.urlParams_.Encode()
  235. req, _ := http.NewRequest("GET", urls, body)
  236. googleapi.Expand(req.URL, map[string]string{
  237. "resourceName": c.resourceName,
  238. })
  239. req.Header.Set("User-Agent", c.s.userAgent())
  240. if c.ifNoneMatch_ != "" {
  241. req.Header.Set("If-None-Match", c.ifNoneMatch_)
  242. }
  243. if c.ctx_ != nil {
  244. return ctxhttp.Do(c.ctx_, c.s.client, req)
  245. }
  246. return c.s.client.Do(req)
  247. }
  248. // Download fetches the API endpoint's "media" value, instead of the normal
  249. // API response value. If the returned error is nil, the Response is guaranteed to
  250. // have a 2xx status code. Callers must close the Response.Body as usual.
  251. func (c *MediaDownloadCall) Download(opts ...googleapi.CallOption) (*http.Response, error) {
  252. gensupport.SetOptions(c.urlParams_, opts...)
  253. res, err := c.doRequest("media")
  254. if err != nil {
  255. return nil, err
  256. }
  257. if err := googleapi.CheckMediaResponse(res); err != nil {
  258. res.Body.Close()
  259. return nil, err
  260. }
  261. return res, nil
  262. }
  263. // Do executes the "dataproc.media.download" call.
  264. // Exactly one of *Media or error will be non-nil. Any non-2xx status
  265. // code is an error. Response headers are in either
  266. // *Media.ServerResponse.Header or (if a response was returned at all)
  267. // in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
  268. // check whether the returned error was because http.StatusNotModified
  269. // was returned.
  270. func (c *MediaDownloadCall) Do(opts ...googleapi.CallOption) (*Media, error) {
  271. gensupport.SetOptions(c.urlParams_, opts...)
  272. res, err := c.doRequest("json")
  273. if res != nil && res.StatusCode == http.StatusNotModified {
  274. if res.Body != nil {
  275. res.Body.Close()
  276. }
  277. return nil, &googleapi.Error{
  278. Code: res.StatusCode,
  279. Header: res.Header,
  280. }
  281. }
  282. if err != nil {
  283. return nil, err
  284. }
  285. defer googleapi.CloseBody(res)
  286. if err := googleapi.CheckResponse(res); err != nil {
  287. return nil, err
  288. }
  289. ret := &Media{
  290. ServerResponse: googleapi.ServerResponse{
  291. Header: res.Header,
  292. HTTPStatusCode: res.StatusCode,
  293. },
  294. }
  295. if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
  296. return nil, err
  297. }
  298. return ret, nil
  299. // {
  300. // "description": "Method for media download. Download is supported on the URI `/v1/media/{+name}?alt=media`.",
  301. // "httpMethod": "GET",
  302. // "id": "dataproc.media.download",
  303. // "parameterOrder": [
  304. // "resourceName"
  305. // ],
  306. // "parameters": {
  307. // "resourceName": {
  308. // "description": "Name of the media that is being downloaded. See [][ByteStream.ReadRequest.resource_name].",
  309. // "location": "path",
  310. // "pattern": "^.*$",
  311. // "required": true,
  312. // "type": "string"
  313. // }
  314. // },
  315. // "path": "v1/media/{+resourceName}",
  316. // "response": {
  317. // "$ref": "Media"
  318. // },
  319. // "scopes": [
  320. // "https://www.googleapis.com/auth/cloud-platform",
  321. // "https://www.googleapis.com/auth/logging.admin",
  322. // "https://www.googleapis.com/auth/logging.read",
  323. // "https://www.googleapis.com/auth/logging.write"
  324. // ],
  325. // "supportsMediaDownload": true
  326. // }
  327. }
  328. // method id "dataproc.media.upload":
  329. type MediaUploadCall struct {
  330. s *Service
  331. resourceName string
  332. media *Media
  333. urlParams_ gensupport.URLParams
  334. media_ io.Reader
  335. resumableBuffer_ *gensupport.ResumableBuffer
  336. mediaType_ string
  337. mediaSize_ int64 // mediaSize, if known. Used only for calls to progressUpdater_.
  338. progressUpdater_ googleapi.ProgressUpdater
  339. ctx_ context.Context
  340. }
  341. // Upload: Method for media upload. Upload is supported on the URI
  342. // `/upload/v1/media/{+name}`.
  343. func (r *MediaService) Upload(resourceName string, media *Media) *MediaUploadCall {
  344. c := &MediaUploadCall{s: r.s, urlParams_: make(gensupport.URLParams)}
  345. c.resourceName = resourceName
  346. c.media = media
  347. return c
  348. }
  349. // Media specifies the media to upload in one or more chunks. The chunk
  350. // size may be controlled by supplying a MediaOption generated by
  351. // googleapi.ChunkSize. The chunk size defaults to
  352. // googleapi.DefaultUploadChunkSize.
  353. // At most one of Media and ResumableMedia may be set.
  354. func (c *MediaUploadCall) Media(r io.Reader, options ...googleapi.MediaOption) *MediaUploadCall {
  355. opts := googleapi.ProcessMediaOptions(options)
  356. chunkSize := opts.ChunkSize
  357. r, c.mediaType_ = gensupport.DetermineContentType(r, opts.ContentType)
  358. c.media_, c.resumableBuffer_ = gensupport.PrepareUpload(r, chunkSize)
  359. return c
  360. }
  361. // ResumableMedia specifies the media to upload in chunks and can be
  362. // canceled with ctx.
  363. //
  364. // Deprecated: use Media instead.
  365. //
  366. // At most one of Media and ResumableMedia may be set. mediaType
  367. // identifies the MIME media type of the upload, such as "image/png". If
  368. // mediaType is "", it will be auto-detected. The provided ctx will
  369. // supersede any context previously provided to the Context method.
  370. func (c *MediaUploadCall) ResumableMedia(ctx context.Context, r io.ReaderAt, size int64, mediaType string) *MediaUploadCall {
  371. c.ctx_ = ctx
  372. rdr := gensupport.ReaderAtToReader(r, size)
  373. rdr, c.mediaType_ = gensupport.DetermineContentType(rdr, mediaType)
  374. c.resumableBuffer_ = gensupport.NewResumableBuffer(rdr, googleapi.DefaultUploadChunkSize)
  375. c.media_ = nil
  376. c.mediaSize_ = size
  377. return c
  378. }
  379. // ProgressUpdater provides a callback function that will be called
  380. // after every chunk. It should be a low-latency function in order to
  381. // not slow down the upload operation. This should only be called when
  382. // using ResumableMedia (as opposed to Media).
  383. func (c *MediaUploadCall) ProgressUpdater(pu googleapi.ProgressUpdater) *MediaUploadCall {
  384. c.progressUpdater_ = pu
  385. return c
  386. }
  387. // Fields allows partial responses to be retrieved. See
  388. // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
  389. // for more information.
  390. func (c *MediaUploadCall) Fields(s ...googleapi.Field) *MediaUploadCall {
  391. c.urlParams_.Set("fields", googleapi.CombineFields(s))
  392. return c
  393. }
  394. // Context sets the context to be used in this call's Do method. Any
  395. // pending HTTP request will be aborted if the provided context is
  396. // canceled.
  397. // This context will supersede any context previously provided to the
  398. // ResumableMedia method.
  399. func (c *MediaUploadCall) Context(ctx context.Context) *MediaUploadCall {
  400. c.ctx_ = ctx
  401. return c
  402. }
  403. func (c *MediaUploadCall) doRequest(alt string) (*http.Response, error) {
  404. var body io.Reader = nil
  405. body, err := googleapi.WithoutDataWrapper.JSONReader(c.media)
  406. if err != nil {
  407. return nil, err
  408. }
  409. ctype := "application/json"
  410. c.urlParams_.Set("alt", alt)
  411. urls := googleapi.ResolveRelative(c.s.BasePath, "v1/media/{+resourceName}")
  412. if c.media_ != nil || c.resumableBuffer_ != nil {
  413. urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
  414. protocol := "multipart"
  415. if c.resumableBuffer_ != nil {
  416. protocol = "resumable"
  417. }
  418. c.urlParams_.Set("uploadType", protocol)
  419. }
  420. urls += "?" + c.urlParams_.Encode()
  421. if c.media_ != nil {
  422. var combined io.ReadCloser
  423. combined, ctype = gensupport.CombineBodyMedia(body, ctype, c.media_, c.mediaType_)
  424. defer combined.Close()
  425. body = combined
  426. }
  427. req, _ := http.NewRequest("POST", urls, body)
  428. googleapi.Expand(req.URL, map[string]string{
  429. "resourceName": c.resourceName,
  430. })
  431. if c.resumableBuffer_ != nil {
  432. req.Header.Set("X-Upload-Content-Type", c.mediaType_)
  433. }
  434. req.Header.Set("Content-Type", ctype)
  435. req.Header.Set("User-Agent", c.s.userAgent())
  436. if c.ctx_ != nil {
  437. return ctxhttp.Do(c.ctx_, c.s.client, req)
  438. }
  439. return c.s.client.Do(req)
  440. }
  441. // Do executes the "dataproc.media.upload" call.
  442. // Exactly one of *Media or error will be non-nil. Any non-2xx status
  443. // code is an error. Response headers are in either
  444. // *Media.ServerResponse.Header or (if a response was returned at all)
  445. // in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
  446. // check whether the returned error was because http.StatusNotModified
  447. // was returned.
  448. func (c *MediaUploadCall) Do(opts ...googleapi.CallOption) (*Media, error) {
  449. gensupport.SetOptions(c.urlParams_, opts...)
  450. res, err := gensupport.Retry(c.ctx_, func() (*http.Response, error) {
  451. return c.doRequest("json")
  452. }, gensupport.DefaultBackoffStrategy())
  453. if res != nil && res.StatusCode == http.StatusNotModified {
  454. if res.Body != nil {
  455. res.Body.Close()
  456. }
  457. return nil, &googleapi.Error{
  458. Code: res.StatusCode,
  459. Header: res.Header,
  460. }
  461. }
  462. if err != nil {
  463. return nil, err
  464. }
  465. defer googleapi.CloseBody(res)
  466. if err := googleapi.CheckResponse(res); err != nil {
  467. return nil, err
  468. }
  469. if c.resumableBuffer_ != nil {
  470. loc := res.Header.Get("Location")
  471. rx := &gensupport.ResumableUpload{
  472. Client: c.s.client,
  473. UserAgent: c.s.userAgent(),
  474. URI: loc,
  475. Media: c.resumableBuffer_,
  476. MediaType: c.mediaType_,
  477. Callback: func(curr int64) {
  478. if c.progressUpdater_ != nil {
  479. c.progressUpdater_(curr, c.mediaSize_)
  480. }
  481. },
  482. }
  483. ctx := c.ctx_
  484. if ctx == nil {
  485. ctx = context.TODO()
  486. }
  487. res, err = rx.Upload(ctx)
  488. if err != nil {
  489. return nil, err
  490. }
  491. defer res.Body.Close()
  492. if err := googleapi.CheckResponse(res); err != nil {
  493. return nil, err
  494. }
  495. }
  496. ret := &Media{
  497. ServerResponse: googleapi.ServerResponse{
  498. Header: res.Header,
  499. HTTPStatusCode: res.StatusCode,
  500. },
  501. }
  502. if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
  503. return nil, err
  504. }
  505. return ret, nil
  506. // {
  507. // "description": "Method for media upload. Upload is supported on the URI `/upload/v1/media/{+name}`.",
  508. // "httpMethod": "POST",
  509. // "id": "dataproc.media.upload",
  510. // "mediaUpload": {
  511. // "accept": [
  512. // "*/*"
  513. // ],
  514. // "protocols": {
  515. // "resumable": {
  516. // "multipart": true,
  517. // "path": "/resumable/upload/v1/media/{+resourceName}"
  518. // },
  519. // "simple": {
  520. // "multipart": true,
  521. // "path": "/upload/v1/media/{+resourceName}"
  522. // }
  523. // }
  524. // },
  525. // "parameterOrder": [
  526. // "resourceName"
  527. // ],
  528. // "parameters": {
  529. // "resourceName": {
  530. // "description": "Name of the media that is being downloaded. See [][ByteStream.ReadRequest.resource_name].",
  531. // "location": "path",
  532. // "pattern": "^.*$",
  533. // "required": true,
  534. // "type": "string"
  535. // }
  536. // },
  537. // "path": "v1/media/{+resourceName}",
  538. // "request": {
  539. // "$ref": "Media"
  540. // },
  541. // "response": {
  542. // "$ref": "Media"
  543. // },
  544. // "scopes": [
  545. // "https://www.googleapis.com/auth/cloud-platform",
  546. // "https://www.googleapis.com/auth/logging.admin",
  547. // "https://www.googleapis.com/auth/logging.read",
  548. // "https://www.googleapis.com/auth/logging.write"
  549. // ],
  550. // "supportsMediaUpload": true
  551. // }
  552. }