Commit c5f672a0 authored by Nick Sardo's avatar Nick Sardo

Update GCP API package

parent 89cd583e
This source diff could not be displayed because it is too large. You can view the blob instead.
{ {
"kind": "discovery#restDescription", "kind": "discovery#restDescription",
"etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/mLggzdz9EvP0lVEQoxoRvdSJShg\"", "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/NOsFjtPY9zRzc3K9F8mQGuDeSj0\"",
"discoveryVersion": "v1", "discoveryVersion": "v1",
"id": "cloudmonitoring:v2beta2", "id": "cloudmonitoring:v2beta2",
"name": "cloudmonitoring", "name": "cloudmonitoring",
"canonicalName": "Cloud Monitoring", "canonicalName": "Cloud Monitoring",
"version": "v2beta2", "version": "v2beta2",
"revision": "20161031", "revision": "20170501",
"title": "Cloud Monitoring API", "title": "Cloud Monitoring API",
"description": "Accesses Google Cloud Monitoring data.", "description": "Accesses Google Cloud Monitoring data.",
"ownerDomain": "google.com", "ownerDomain": "google.com",
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{ {
"kind": "discovery#restDescription", "kind": "discovery#restDescription",
"etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/RqBsQyB2YZT-ZAkK7pcLByI9SZs\"", "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/gwrprolZcJUNBq_AKpcBKtz0xIE\"",
"discoveryVersion": "v1", "discoveryVersion": "v1",
"id": "dns:v1", "id": "dns:v1",
"name": "dns", "name": "dns",
"version": "v1", "version": "v1",
"revision": "20161110", "revision": "20170602",
"title": "Google Cloud DNS API", "title": "Google Cloud DNS API",
"description": "Configures and serves authoritative DNS records.", "description": "Configures and serves authoritative DNS records.",
"ownerDomain": "google.com", "ownerDomain": "google.com",
......
...@@ -22,23 +22,33 @@ func MarshalJSON(schema interface{}, forceSendFields, nullFields []string) ([]by ...@@ -22,23 +22,33 @@ func MarshalJSON(schema interface{}, forceSendFields, nullFields []string) ([]by
return json.Marshal(schema) return json.Marshal(schema)
} }
mustInclude := make(map[string]struct{}) mustInclude := make(map[string]bool)
for _, f := range forceSendFields { for _, f := range forceSendFields {
mustInclude[f] = struct{}{} mustInclude[f] = true
} }
useNull := make(map[string]struct{}) useNull := make(map[string]bool)
for _, f := range nullFields { useNullMaps := make(map[string]map[string]bool)
useNull[f] = struct{}{} for _, nf := range nullFields {
parts := strings.SplitN(nf, ".", 2)
field := parts[0]
if len(parts) == 1 {
useNull[field] = true
} else {
if useNullMaps[field] == nil {
useNullMaps[field] = map[string]bool{}
}
useNullMaps[field][parts[1]] = true
}
} }
dataMap, err := schemaToMap(schema, mustInclude, useNull) dataMap, err := schemaToMap(schema, mustInclude, useNull, useNullMaps)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return json.Marshal(dataMap) return json.Marshal(dataMap)
} }
func schemaToMap(schema interface{}, mustInclude, useNull map[string]struct{}) (map[string]interface{}, error) { func schemaToMap(schema interface{}, mustInclude, useNull map[string]bool, useNullMaps map[string]map[string]bool) (map[string]interface{}, error) {
m := make(map[string]interface{}) m := make(map[string]interface{})
s := reflect.ValueOf(schema) s := reflect.ValueOf(schema)
st := s.Type() st := s.Type()
...@@ -59,17 +69,35 @@ func schemaToMap(schema interface{}, mustInclude, useNull map[string]struct{}) ( ...@@ -59,17 +69,35 @@ func schemaToMap(schema interface{}, mustInclude, useNull map[string]struct{}) (
v := s.Field(i) v := s.Field(i)
f := st.Field(i) f := st.Field(i)
if _, ok := useNull[f.Name]; ok { if useNull[f.Name] {
if !isEmptyValue(v) { if !isEmptyValue(v) {
return nil, fmt.Errorf("field %q in NullFields has non-empty value", f.Name) return nil, fmt.Errorf("field %q in NullFields has non-empty value", f.Name)
} }
m[tag.apiName] = nil m[tag.apiName] = nil
continue continue
} }
if !includeField(v, f, mustInclude) { if !includeField(v, f, mustInclude) {
continue continue
} }
// If map fields are explicitly set to null, use a map[string]interface{}.
if f.Type.Kind() == reflect.Map && useNullMaps[f.Name] != nil {
ms, ok := v.Interface().(map[string]string)
if !ok {
return nil, fmt.Errorf("field %q has keys in NullFields but is not a map[string]string", f.Name)
}
mi := map[string]interface{}{}
for k, v := range ms {
mi[k] = v
}
for k := range useNullMaps[f.Name] {
mi[k] = nil
}
m[tag.apiName] = mi
continue
}
// nil maps are treated as empty maps. // nil maps are treated as empty maps.
if f.Type.Kind() == reflect.Map && v.IsNil() { if f.Type.Kind() == reflect.Map && v.IsNil() {
m[tag.apiName] = map[string]string{} m[tag.apiName] = map[string]string{}
...@@ -139,7 +167,7 @@ func parseJSONTag(val string) (jsonTag, error) { ...@@ -139,7 +167,7 @@ func parseJSONTag(val string) (jsonTag, error) {
} }
// Reports whether the struct field "f" with value "v" should be included in JSON output. // Reports whether the struct field "f" with value "v" should be included in JSON output.
func includeField(v reflect.Value, f reflect.StructField, mustInclude map[string]struct{}) bool { func includeField(v reflect.Value, f reflect.StructField, mustInclude map[string]bool) bool {
// The regular JSON encoding of a nil pointer is "null", which means "delete this field". // The regular JSON encoding of a nil pointer is "null", which means "delete this field".
// Therefore, we could enable field deletion by honoring pointer fields' presence in the mustInclude set. // Therefore, we could enable field deletion by honoring pointer fields' presence in the mustInclude set.
// However, many fields are not pointers, so there would be no way to delete these fields. // However, many fields are not pointers, so there would be no way to delete these fields.
...@@ -156,8 +184,7 @@ func includeField(v reflect.Value, f reflect.StructField, mustInclude map[string ...@@ -156,8 +184,7 @@ func includeField(v reflect.Value, f reflect.StructField, mustInclude map[string
return false return false
} }
_, ok := mustInclude[f.Name] return mustInclude[f.Name] || !isEmptyValue(v)
return ok || !isEmptyValue(v)
} }
// isEmptyValue reports whether v is the empty value for its type. This // isEmptyValue reports whether v is the empty value for its type. This
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package gensupport package gensupport
import ( import (
"errors"
"net/http" "net/http"
"golang.org/x/net/context" "golang.org/x/net/context"
...@@ -32,6 +33,11 @@ func RegisterHook(h Hook) { ...@@ -32,6 +33,11 @@ func RegisterHook(h Hook) {
// If ctx is non-nil, it calls all hooks, then sends the request with // If ctx is non-nil, it calls all hooks, then sends the request with
// ctxhttp.Do, then calls any functions returned by the hooks in reverse order. // ctxhttp.Do, then calls any functions returned by the hooks in reverse order.
func SendRequest(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { func SendRequest(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
// Disallow Accept-Encoding because it interferes with the automatic gzip handling
// done by the default http.Transport. See https://github.com/google/google-api-go-client/issues/219.
if _, ok := req.Header["Accept-Encoding"]; ok {
return nil, errors.New("google api: custom Accept-Encoding headers not allowed")
}
if ctx == nil { if ctx == nil {
return client.Do(req) return client.Do(req)
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -670,6 +670,10 @@ type LogEntry struct { ...@@ -670,6 +670,10 @@ type LogEntry struct {
// log entry payloads. // log entry payloads.
ProtoPayload googleapi.RawMessage `json:"protoPayload,omitempty"` ProtoPayload googleapi.RawMessage `json:"protoPayload,omitempty"`
// ReceiveTimestamp: Output only. The time the log entry was received by
// Stackdriver Logging.
ReceiveTimestamp string `json:"receiveTimestamp,omitempty"`
// Resource: Required. The monitored resource associated with this log // Resource: Required. The monitored resource associated with this log
// entry. Example: a log entry that reports a database error would be // entry. Example: a log entry that reports a database error would be
// associated with the monitored resource designating the particular // associated with the monitored resource designating the particular
...@@ -973,13 +977,22 @@ type LogSink struct { ...@@ -973,13 +977,22 @@ type LogSink struct {
// //
Filter string `json:"filter,omitempty"` Filter string `json:"filter,omitempty"`
// IncludeChildren: Optional. This field presently applies only to sinks // IncludeChildren: Optional. This field applies only to sinks owned by
// in organizations and folders. If true, then logs from children of // organizations and folders. If the field is false, the default, only
// this entity will also be available to this sink for export. Whether // the logs owned by the sink's parent resource are available for
// particular log entries from the children are exported depends on the // export. If the field is true, then logs from all the projects,
// sink's filter expression. For example, if this sink is associated // folders, and billing accounts contained in the sink's parent resource
// with an organization, then logs from all projects in the organization // are also available for export. Whether a particular log entry from
// as well as from the organization itself will be available for export. // the children is exported depends on the sink's filter expression. For
// example, if this field is true, then the filter
// resource.type=gce_instance would export all Compute Engine VM
// instance log entries from all projects in the sink's parent. To only
// export entries from certain child projects, filter on the project
// part of the log name:
// logName:("projects/test-project1/" OR "projects/test-project2/")
// AND
// resource.type=gce_instance
//
IncludeChildren bool `json:"includeChildren,omitempty"` IncludeChildren bool `json:"includeChildren,omitempty"`
// Name: Required. The client-assigned sink identifier, unique within // Name: Required. The client-assigned sink identifier, unique within
...@@ -989,10 +1002,9 @@ type LogSink struct { ...@@ -989,10 +1002,9 @@ type LogSink struct {
// underscores, hyphens, and periods. // underscores, hyphens, and periods.
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
// OutputVersionFormat: Optional. The log entry format to use for this // OutputVersionFormat: Deprecated. The log entry format to use for this
// sink's exported log entries. The v2 format is used by default. The v1 // sink's exported log entries. The v2 format is used by default and
// format is deprecated and should be used only as part of a migration // cannot be changed.
// effort to v2. See Migration to the v2 API.
// //
// Possible values: // Possible values:
// "VERSION_FORMAT_UNSPECIFIED" - An unspecified format version that // "VERSION_FORMAT_UNSPECIFIED" - An unspecified format version that
...@@ -1061,13 +1073,13 @@ func (s *LogSink) MarshalJSON() ([]byte, error) { ...@@ -1061,13 +1073,13 @@ func (s *LogSink) MarshalJSON() ([]byte, error) {
// //
type MonitoredResource struct { type MonitoredResource struct {
// Labels: Required. Values for all of the labels listed in the // Labels: Required. Values for all of the labels listed in the
// associated monitored resource descriptor. For example, Cloud SQL // associated monitored resource descriptor. For example, Compute Engine
// databases use the labels "database_id" and "zone". // VM instances use the labels "project_id", "instance_id", and "zone".
Labels map[string]string `json:"labels,omitempty"` Labels map[string]string `json:"labels,omitempty"`
// Type: Required. The monitored resource type. This field must match // Type: Required. The monitored resource type. This field must match
// the type field of a MonitoredResourceDescriptor object. For example, // the type field of a MonitoredResourceDescriptor object. For example,
// the type of a Cloud SQL database is "cloudsql_database". // the type of a Compute Engine VM instance is gce_instance.
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
// ForceSendFields is a list of field names (e.g. "Labels") to // ForceSendFields is a list of field names (e.g. "Labels") to
...@@ -4285,7 +4297,8 @@ func (r *ProjectsSinksService) Update(sinkNameid string, logsink *LogSink) *Proj ...@@ -4285,7 +4297,8 @@ func (r *ProjectsSinksService) Update(sinkNameid string, logsink *LogSink) *Proj
// then there is no change to the sink's writer_identity. // then there is no change to the sink's writer_identity.
// If the old value is false and the new value is true, then // If the old value is false and the new value is true, then
// writer_identity is changed to a unique service account. // writer_identity is changed to a unique service account.
// It is an error if the old value is true and the new value is false. // It is an error if the old value is true and the new value is set to
// false or defaulted to false.
func (c *ProjectsSinksUpdateCall) UniqueWriterIdentity(uniqueWriterIdentity bool) *ProjectsSinksUpdateCall { func (c *ProjectsSinksUpdateCall) UniqueWriterIdentity(uniqueWriterIdentity bool) *ProjectsSinksUpdateCall {
c.urlParams_.Set("uniqueWriterIdentity", fmt.Sprint(uniqueWriterIdentity)) c.urlParams_.Set("uniqueWriterIdentity", fmt.Sprint(uniqueWriterIdentity))
return c return c
...@@ -4393,7 +4406,7 @@ func (c *ProjectsSinksUpdateCall) Do(opts ...googleapi.CallOption) (*LogSink, er ...@@ -4393,7 +4406,7 @@ func (c *ProjectsSinksUpdateCall) Do(opts ...googleapi.CallOption) (*LogSink, er
// "type": "string" // "type": "string"
// }, // },
// "uniqueWriterIdentity": { // "uniqueWriterIdentity": {
// "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value is false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value is true and the new value is false.", // "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value is false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value is true and the new value is set to false or defaulted to false.",
// "location": "query", // "location": "query",
// "type": "boolean" // "type": "boolean"
// } // }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -4166,103 +4166,6 @@ func (c *ProjectsTimeSeriesListCall) PageToken(pageToken string) *ProjectsTimeSe ...@@ -4166,103 +4166,6 @@ func (c *ProjectsTimeSeriesListCall) PageToken(pageToken string) *ProjectsTimeSe
return c return c
} }
// SecondaryAggregationAlignmentPeriod sets the optional parameter
// "secondaryAggregation.alignmentPeriod": The alignment period for
// per-time series alignment. If present, alignmentPeriod must be at
// least 60 seconds. After per-time series alignment, each time series
// will contain data points only on the period boundaries. If
// perSeriesAligner is not specified or equals ALIGN_NONE, then this
// field is ignored. If perSeriesAligner is specified and does not equal
// ALIGN_NONE, then this field must be defined; otherwise an error is
// returned.
func (c *ProjectsTimeSeriesListCall) SecondaryAggregationAlignmentPeriod(secondaryAggregationAlignmentPeriod string) *ProjectsTimeSeriesListCall {
c.urlParams_.Set("secondaryAggregation.alignmentPeriod", secondaryAggregationAlignmentPeriod)
return c
}
// SecondaryAggregationCrossSeriesReducer sets the optional parameter
// "secondaryAggregation.crossSeriesReducer": The approach to be used to
// combine time series. Not all reducer functions may be applied to all
// time series, depending on the metric type and the value type of the
// original time series. Reduction may change the metric type of value
// type of the time series.Time series data must be aligned in order to
// perform cross-time series reduction. If crossSeriesReducer is
// specified, then perSeriesAligner must be specified and not equal
// ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error
// is returned.
//
// Possible values:
// "REDUCE_NONE"
// "REDUCE_MEAN"
// "REDUCE_MIN"
// "REDUCE_MAX"
// "REDUCE_SUM"
// "REDUCE_STDDEV"
// "REDUCE_COUNT"
// "REDUCE_COUNT_TRUE"
// "REDUCE_FRACTION_TRUE"
// "REDUCE_PERCENTILE_99"
// "REDUCE_PERCENTILE_95"
// "REDUCE_PERCENTILE_50"
// "REDUCE_PERCENTILE_05"
func (c *ProjectsTimeSeriesListCall) SecondaryAggregationCrossSeriesReducer(secondaryAggregationCrossSeriesReducer string) *ProjectsTimeSeriesListCall {
c.urlParams_.Set("secondaryAggregation.crossSeriesReducer", secondaryAggregationCrossSeriesReducer)
return c
}
// SecondaryAggregationGroupByFields sets the optional parameter
// "secondaryAggregation.groupByFields": The set of fields to preserve
// when crossSeriesReducer is specified. The groupByFields determine how
// the time series are partitioned into subsets prior to applying the
// aggregation function. Each subset contains time series that have the
// same value for each of the grouping fields. Each individual time
// series is a member of exactly one subset. The crossSeriesReducer is
// applied to each subset of time series. It is not possible to reduce
// across different resource types, so this field implicitly contains
// resource.type. Fields not specified in groupByFields are aggregated
// away. If groupByFields is not specified and all the time series have
// the same resource type, then the time series are aggregated into a
// single output time series. If crossSeriesReducer is not defined, this
// field is ignored.
func (c *ProjectsTimeSeriesListCall) SecondaryAggregationGroupByFields(secondaryAggregationGroupByFields ...string) *ProjectsTimeSeriesListCall {
c.urlParams_.SetMulti("secondaryAggregation.groupByFields", append([]string{}, secondaryAggregationGroupByFields...))
return c
}
// SecondaryAggregationPerSeriesAligner sets the optional parameter
// "secondaryAggregation.perSeriesAligner": The approach to be used to
// align individual time series. Not all alignment functions may be
// applied to all time series, depending on the metric type and value
// type of the original time series. Alignment may change the metric
// type or the value type of the time series.Time series data must be
// aligned in order to perform cross-time series reduction. If
// crossSeriesReducer is specified, then perSeriesAligner must be
// specified and not equal ALIGN_NONE and alignmentPeriod must be
// specified; otherwise, an error is returned.
//
// Possible values:
// "ALIGN_NONE"
// "ALIGN_DELTA"
// "ALIGN_RATE"
// "ALIGN_INTERPOLATE"
// "ALIGN_NEXT_OLDER"
// "ALIGN_MIN"
// "ALIGN_MAX"
// "ALIGN_MEAN"
// "ALIGN_COUNT"
// "ALIGN_SUM"
// "ALIGN_STDDEV"
// "ALIGN_COUNT_TRUE"
// "ALIGN_FRACTION_TRUE"
// "ALIGN_PERCENTILE_99"
// "ALIGN_PERCENTILE_95"
// "ALIGN_PERCENTILE_50"
// "ALIGN_PERCENTILE_05"
func (c *ProjectsTimeSeriesListCall) SecondaryAggregationPerSeriesAligner(secondaryAggregationPerSeriesAligner string) *ProjectsTimeSeriesListCall {
c.urlParams_.Set("secondaryAggregation.perSeriesAligner", secondaryAggregationPerSeriesAligner)
return c
}
// View sets the optional parameter "view": Specifies which information // View sets the optional parameter "view": Specifies which information
// is returned about the time series. // is returned about the time series.
// //
...@@ -4472,62 +4375,6 @@ func (c *ProjectsTimeSeriesListCall) Do(opts ...googleapi.CallOption) (*ListTime ...@@ -4472,62 +4375,6 @@ func (c *ProjectsTimeSeriesListCall) Do(opts ...googleapi.CallOption) (*ListTime
// "location": "query", // "location": "query",
// "type": "string" // "type": "string"
// }, // },
// "secondaryAggregation.alignmentPeriod": {
// "description": "The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.",
// "format": "google-duration",
// "location": "query",
// "type": "string"
// },
// "secondaryAggregation.crossSeriesReducer": {
// "description": "The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.",
// "enum": [
// "REDUCE_NONE",
// "REDUCE_MEAN",
// "REDUCE_MIN",
// "REDUCE_MAX",
// "REDUCE_SUM",
// "REDUCE_STDDEV",
// "REDUCE_COUNT",
// "REDUCE_COUNT_TRUE",
// "REDUCE_FRACTION_TRUE",
// "REDUCE_PERCENTILE_99",
// "REDUCE_PERCENTILE_95",
// "REDUCE_PERCENTILE_50",
// "REDUCE_PERCENTILE_05"
// ],
// "location": "query",
// "type": "string"
// },
// "secondaryAggregation.groupByFields": {
// "description": "The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.",
// "location": "query",
// "repeated": true,
// "type": "string"
// },
// "secondaryAggregation.perSeriesAligner": {
// "description": "The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.",
// "enum": [
// "ALIGN_NONE",
// "ALIGN_DELTA",
// "ALIGN_RATE",
// "ALIGN_INTERPOLATE",
// "ALIGN_NEXT_OLDER",
// "ALIGN_MIN",
// "ALIGN_MAX",
// "ALIGN_MEAN",
// "ALIGN_COUNT",
// "ALIGN_SUM",
// "ALIGN_STDDEV",
// "ALIGN_COUNT_TRUE",
// "ALIGN_FRACTION_TRUE",
// "ALIGN_PERCENTILE_99",
// "ALIGN_PERCENTILE_95",
// "ALIGN_PERCENTILE_50",
// "ALIGN_PERCENTILE_05"
// ],
// "location": "query",
// "type": "string"
// },
// "view": { // "view": {
// "description": "Specifies which information is returned about the time series.", // "description": "Specifies which information is returned about the time series.",
// "enum": [ // "enum": [
......
...@@ -193,6 +193,7 @@ type Binding struct { ...@@ -193,6 +193,7 @@ type Binding struct {
// group. // group.
// For example, `admins@example.com`. // For example, `admins@example.com`.
// //
//
// * `domain:{domain}`: A Google Apps domain name that represents all // * `domain:{domain}`: A Google Apps domain name that represents all
// the // the
// users of that domain. For example, `google.com` or // users of that domain. For example, `google.com` or
...@@ -477,8 +478,6 @@ func (s *ModifyPushConfigRequest) MarshalJSON() ([]byte, error) { ...@@ -477,8 +478,6 @@ func (s *ModifyPushConfigRequest) MarshalJSON() ([]byte, error) {
// [IAM developer's guide](https://cloud.google.com/iam). // [IAM developer's guide](https://cloud.google.com/iam).
type Policy struct { type Policy struct {
// Bindings: Associates a list of `members` to a `role`. // Bindings: Associates a list of `members` to a `role`.
// Multiple `bindings` must not be specified for the same
// `role`.
// `bindings` with no members will result in an error. // `bindings` with no members will result in an error.
Bindings []*Binding `json:"bindings,omitempty"` Bindings []*Binding `json:"bindings,omitempty"`
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment