doushen9863 2018-10-01 17:15
浏览 52

使用Golang客户端库批量向GCP Compute发送请求

Is it possible to perform batch requests using the Google API Client Library for Go?

More precisely, I'd like to delete some disks; it would be great if I could avoid a request for each disk.

The batch request feature I'm referring to: https://cloud.google.com/compute/docs/api/how-tos/batch

The client library I'm using: https://github.com/googleapis/google-api-go-client

It seems there's also another client library, but without support for the Compute Engine, only metadata (?): https://github.com/GoogleCloudPlatform/google-cloud-go

  • 写回答

1条回答 默认 最新

  • doubian0284 2018-10-09 23:55
    关注

    I'm not sure but i think it can be done since we can dlete a disk using API call. A batch request consists of multiple API calls combined into one HTTP request, which can be sent to the batchPath specified in the API discovery document. The default path is /batch/api_name/api_version.

    Example take a look on the Format of a batch request Here

    // method id "compute.disks.delete":
    
    type DisksDeleteCall struct {
        s          *Service
        project    string
        zone       string
        disk       string
        urlParams_ gensupport.URLParams
        ctx_       context.Context
        header_    http.Header
    }
    
    // Delete: Deletes the specified persistent disk. Deleting a disk
    // removes its data permanently and is irreversible. However, deleting a
    // disk does not delete any snapshots previously made from the disk. You
    // must separately delete snapshots.
    // For details, see https://cloud.google.com/compute/docs/reference/latest/disks/delete
    func (r *DisksService) Delete(project string, zone string, disk string) *DisksDeleteCall {
        c := &DisksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
        c.project = project
        c.zone = zone
        c.disk = disk
        return c
    }
    
    // RequestId sets the optional parameter "requestId": An optional
    // request ID to identify requests. Specify a unique request ID so that
    // if you must retry your request, the server will know to ignore the
    // request if it has already been completed.
    //
    // For example, consider a situation where you make an initial request
    // and the request times out. If you make the request again with the
    // same request ID, the server can check if original operation with the
    // same request ID was received, and if so, will ignore the second
    // request. This prevents clients from accidentally creating duplicate
    // commitments.
    //
    // The request ID must be a valid UUID with the exception that zero UUID
    // is not supported (00000000-0000-0000-0000-000000000000).
    func (c *DisksDeleteCall) RequestId(requestId string) *DisksDeleteCall {
        c.urlParams_.Set("requestId", requestId)
        return c
    }
    
    // Fields allows partial responses to be retrieved. See
    // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
    // for more information.
    func (c *DisksDeleteCall) Fields(s ...googleapi.Field) *DisksDeleteCall {
        c.urlParams_.Set("fields", googleapi.CombineFields(s))
        return c
    }
    
    // Context sets the context to be used in this call's Do method. Any
    // pending HTTP request will be aborted if the provided context is
    // canceled.
    func (c *DisksDeleteCall) Context(ctx context.Context) *DisksDeleteCall {
        c.ctx_ = ctx
        return c
    }
    
    // Header returns an http.Header that can be modified by the caller to
    // add HTTP headers to the request.
    func (c *DisksDeleteCall) Header() http.Header {
        if c.header_ == nil {
            c.header_ = make(http.Header)
        }
        return c.header_
    }
    
    func (c *DisksDeleteCall) doRequest(alt string) (*http.Response, error) {
        reqHeaders := make(http.Header)
        for k, v := range c.header_ {
            reqHeaders[k] = v
        }
        reqHeaders.Set("User-Agent", c.s.userAgent())
        var body io.Reader = nil
        c.urlParams_.Set("alt", alt)
        c.urlParams_.Set("prettyPrint", "false")
        urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}")
        urls += "?" + c.urlParams_.Encode()
        req, _ := http.NewRequest("DELETE", urls, body)
        req.Header = reqHeaders
        googleapi.Expand(req.URL, map[string]string{
            "project": c.project,
            "zone":    c.zone,
            "disk":    c.disk,
        })
        return gensupport.SendRequest(c.ctx_, c.s.client, req)
    }
    
    // Do executes the "compute.disks.delete" call.
    // Exactly one of *Operation or error will be non-nil. Any non-2xx
    // status code is an error. Response headers are in either
    // *Operation.ServerResponse.Header or (if a response was returned at
    // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
    // to check whether the returned error was because
    // http.StatusNotModified was returned.
    func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
        gensupport.SetOptions(c.urlParams_, opts...)
        res, err := c.doRequest("json")
        if res != nil && res.StatusCode == http.StatusNotModified {
            if res.Body != nil {
                res.Body.Close()
            }
            return nil, &googleapi.Error{
                Code:   res.StatusCode,
                Header: res.Header,
            }
        }
        if err != nil {
            return nil, err
        }
        defer googleapi.CloseBody(res)
        if err := googleapi.CheckResponse(res); err != nil {
            return nil, err
        }
        ret := &Operation{
            ServerResponse: googleapi.ServerResponse{
                Header:         res.Header,
                HTTPStatusCode: res.StatusCode,
            },
        }
        target := &ret
        if err := gensupport.DecodeResponse(target, res); err != nil {
            return nil, err
        }
        return ret, nil
        // {
        //   "description": "Deletes the specified persistent disk. Deleting a disk removes its data permanently and is irreversible. However, deleting a disk does not delete any snapshots previously made from the disk. You must separately delete snapshots.",
        //   "httpMethod": "DELETE",
        //   "id": "compute.disks.delete",
        //   "parameterOrder": [
        //     "project",
        //     "zone",
        //     "disk"
        //   ],
        //   "parameters": {
        //     "disk": {
        //       "description": "Name of the persistent disk to delete.",
        //       "location": "path",
        //       "required": true,
        //       "type": "string"
        //     },
        //     "project": {
        //       "description": "Project ID for this request.",
        //       "location": "path",
        //       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
        //       "required": true,
        //       "type": "string"
        //     },
        //     "requestId": {
        //       "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.
    
    For example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.
    
    The request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).",
        //       "location": "query",
        //       "type": "string"
        //     },
        //     "zone": {
        //       "description": "The name of the zone for this request.",
        //       "location": "path",
        //       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        //       "required": true,
        //       "type": "string"
        //     }
        //   },
        //   "path": "{project}/zones/{zone}/disks/{disk}",
        //   "response": {
        //     "$ref": "Operation"
        //   },
        //   "scopes": [
        //     "https://www.googleapis.com/auth/cloud-platform",
        //     "https://www.googleapis.com/auth/compute"
        //   ]
        // }
    
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用