services/google/run/alpha/service_internal.go (6,148 lines of code) (raw):

// Copyright 2025 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package alpha import ( "bytes" "context" "encoding/json" "fmt" "io/ioutil" "strings" "github.com/GoogleCloudPlatform/declarative-resource-client-library/dcl" "github.com/GoogleCloudPlatform/declarative-resource-client-library/dcl/operations" ) func (r *Service) validate() error { if err := dcl.Required(r, "name"); err != nil { return err } if err := dcl.Required(r, "template"); err != nil { return err } if err := dcl.RequiredParameter(r.Project, "Project"); err != nil { return err } if err := dcl.RequiredParameter(r.Location, "Location"); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.BinaryAuthorization) { if err := r.BinaryAuthorization.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.Template) { if err := r.Template.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.TerminalCondition) { if err := r.TerminalCondition.validate(); err != nil { return err } } return nil } func (r *ServiceBinaryAuthorization) validate() error { return nil } func (r *ServiceTemplate) validate() error { if !dcl.IsEmptyValueIndirect(r.Scaling) { if err := r.Scaling.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.VPCAccess) { if err := r.VPCAccess.validate(); err != nil { return err } } return nil } func (r *ServiceTemplateScaling) validate() error { return nil } func (r *ServiceTemplateVPCAccess) validate() error { return nil } func (r *ServiceTemplateContainers) validate() error { if err := dcl.Required(r, "image"); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.Resources) { if err := r.Resources.validate(); err != nil { return err } } return nil } func (r *ServiceTemplateContainersEnv) validate() error { if err := dcl.Required(r, "name"); err != nil { return err } if err := dcl.ValidateAtMostOneOfFieldsSet([]string{"Value", "ValueSource"}, r.Value, r.ValueSource); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.ValueSource) { if err := r.ValueSource.validate(); err != nil { return err } } return nil } func (r *ServiceTemplateContainersEnvValueSource) validate() error { if !dcl.IsEmptyValueIndirect(r.SecretKeyRef) { if err := r.SecretKeyRef.validate(); err != nil { return err } } return nil } func (r *ServiceTemplateContainersEnvValueSourceSecretKeyRef) validate() error { if err := dcl.Required(r, "secret"); err != nil { return err } return nil } func (r *ServiceTemplateContainersResources) validate() error { return nil } func (r *ServiceTemplateContainersPorts) validate() error { return nil } func (r *ServiceTemplateContainersVolumeMounts) validate() error { if err := dcl.Required(r, "name"); err != nil { return err } if err := dcl.Required(r, "mountPath"); err != nil { return err } return nil } func (r *ServiceTemplateVolumes) validate() error { if err := dcl.Required(r, "name"); err != nil { return err } if err := dcl.ValidateAtMostOneOfFieldsSet([]string{"Secret", "CloudSqlInstance"}, r.Secret, r.CloudSqlInstance); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.Secret) { if err := r.Secret.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.CloudSqlInstance) { if err := r.CloudSqlInstance.validate(); err != nil { return err } } return nil } func (r *ServiceTemplateVolumesSecret) validate() error { if err := dcl.Required(r, "secret"); err != nil { return err } return nil } func (r *ServiceTemplateVolumesSecretItems) validate() error { if err := dcl.Required(r, "path"); err != nil { return err } return nil } func (r *ServiceTemplateVolumesCloudSqlInstance) validate() error { return nil } func (r *ServiceTraffic) validate() error { return nil } func (r *ServiceTerminalCondition) validate() error { if err := dcl.ValidateAtMostOneOfFieldsSet([]string{"Reason", "RevisionReason", "JobReason"}, r.Reason, r.RevisionReason, r.JobReason); err != nil { return err } return nil } func (r *ServiceTrafficStatuses) validate() error { return nil } func (r *Service) basePath() string { params := map[string]interface{}{} return dcl.Nprintf("https://run.googleapis.com/v2/", params) } func (r *Service) getURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "location": dcl.ValueOrEmptyString(nr.Location), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/locations/{{location}}/services/{{name}}", nr.basePath(), userBasePath, params), nil } func (r *Service) listURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "location": dcl.ValueOrEmptyString(nr.Location), } return dcl.URL("projects/{{project}}/locations/{{location}}/services", nr.basePath(), userBasePath, params), nil } func (r *Service) createURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "location": dcl.ValueOrEmptyString(nr.Location), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/locations/{{location}}/services?serviceId={{name}}", nr.basePath(), userBasePath, params), nil } func (r *Service) deleteURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "location": dcl.ValueOrEmptyString(nr.Location), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/locations/{{location}}/services/{{name}}", nr.basePath(), userBasePath, params), nil } func (r *Service) SetPolicyURL(userBasePath string) string { nr := r.urlNormalized() fields := map[string]interface{}{ "project": *nr.Project, "location": *nr.Location, "name": *nr.Name, } return dcl.URL("projects/{{project}}/locations/{{location}}/services/{{name}}:setIamPolicy", nr.basePath(), userBasePath, fields) } func (r *Service) SetPolicyVerb() string { return "POST" } func (r *Service) getPolicyURL(userBasePath string) string { nr := r.urlNormalized() fields := map[string]interface{}{ "project": *nr.Project, "location": *nr.Location, "name": *nr.Name, } return dcl.URL("projects/{{project}}/locations/{{location}}/services/{{name}}:getIamPolicy", nr.basePath(), userBasePath, fields) } func (r *Service) IAMPolicyVersion() int { return 3 } // serviceApiOperation represents a mutable operation in the underlying REST // API such as Create, Update, or Delete. type serviceApiOperation interface { do(context.Context, *Service, *Client) error } // newUpdateServiceUpdateServiceRequest creates a request for an // Service resource's UpdateService update type by filling in the update // fields based on the intended state of the resource. func newUpdateServiceUpdateServiceRequest(ctx context.Context, f *Service, c *Client) (map[string]interface{}, error) { req := map[string]interface{}{} res := f _ = res if v, err := dcl.DeriveField("projects/%s/locations/%s/services/%s", f.Name, dcl.SelfLinkToName(f.Project), dcl.SelfLinkToName(f.Location), dcl.SelfLinkToName(f.Name)); err != nil { return nil, fmt.Errorf("error expanding Name into name: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["name"] = v } if v := f.Description; !dcl.IsEmptyValueIndirect(v) { req["description"] = v } if v := f.Annotations; !dcl.IsEmptyValueIndirect(v) { req["annotations"] = v } if v := f.Client; !dcl.IsEmptyValueIndirect(v) { req["client"] = v } if v := f.ClientVersion; !dcl.IsEmptyValueIndirect(v) { req["clientVersion"] = v } if v := f.Ingress; !dcl.IsEmptyValueIndirect(v) { req["ingress"] = v } if v := f.LaunchStage; !dcl.IsEmptyValueIndirect(v) { req["launchStage"] = v } if v, err := expandServiceBinaryAuthorization(c, f.BinaryAuthorization, res); err != nil { return nil, fmt.Errorf("error expanding BinaryAuthorization into binaryAuthorization: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["binaryAuthorization"] = v } if v, err := expandServiceTemplate(c, f.Template, res); err != nil { return nil, fmt.Errorf("error expanding Template into template: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["template"] = v } if v, err := expandServiceTrafficSlice(c, f.Traffic, res); err != nil { return nil, fmt.Errorf("error expanding Traffic into traffic: %w", err) } else if v != nil { req["traffic"] = v } if v, err := expandServiceTerminalCondition(c, f.TerminalCondition, res); err != nil { return nil, fmt.Errorf("error expanding TerminalCondition into terminalCondition: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["terminalCondition"] = v } b, err := c.getServiceRaw(ctx, f) if err != nil { return nil, err } var m map[string]interface{} if err := json.Unmarshal(b, &m); err != nil { return nil, err } rawEtag, err := dcl.GetMapEntry( m, []string{"etag"}, ) if err != nil { c.Config.Logger.WarningWithContextf(ctx, "Failed to fetch from JSON Path: %v", err) } else { req["etag"] = rawEtag.(string) } return req, nil } // marshalUpdateServiceUpdateServiceRequest converts the update into // the final JSON request body. func marshalUpdateServiceUpdateServiceRequest(c *Client, m map[string]interface{}) ([]byte, error) { return json.Marshal(m) } type updateServiceUpdateServiceOperation struct { // If the update operation has the REQUIRES_APPLY_OPTIONS trait, this will be populated. // Usually it will be nil - this is to prevent us from accidentally depending on apply // options, which should usually be unnecessary. ApplyOptions []dcl.ApplyOption FieldDiffs []*dcl.FieldDiff } // do creates a request and sends it to the appropriate URL. In most operations, // do will transcribe a subset of the resource into a request object and send a // PUT request to a single URL. func (op *updateServiceUpdateServiceOperation) do(ctx context.Context, r *Service, c *Client) error { _, err := c.GetService(ctx, r) if err != nil { return err } u, err := r.updateURL(c.Config.BasePath, "UpdateService") if err != nil { return err } req, err := newUpdateServiceUpdateServiceRequest(ctx, r, c) if err != nil { return err } c.Config.Logger.InfoWithContextf(ctx, "Created update: %#v", req) body, err := marshalUpdateServiceUpdateServiceRequest(c, req) if err != nil { return err } resp, err := dcl.SendRequest(ctx, c.Config, "PATCH", u, bytes.NewBuffer(body), c.Config.RetryProvider) if err != nil { return err } var o operations.StandardGCPOperation if err := dcl.ParseResponse(resp.Response, &o); err != nil { return err } err = o.Wait(context.WithValue(ctx, dcl.DoNotLogRequestsKey, true), c.Config, r.basePath(), "GET") if err != nil { return err } return nil } func (c *Client) listServiceRaw(ctx context.Context, r *Service, pageToken string, pageSize int32) ([]byte, error) { u, err := r.urlNormalized().listURL(c.Config.BasePath) if err != nil { return nil, err } m := make(map[string]string) if pageToken != "" { m["pageToken"] = pageToken } if pageSize != ServiceMaxPage { m["pageSize"] = fmt.Sprintf("%v", pageSize) } u, err = dcl.AddQueryParams(u, m) if err != nil { return nil, err } resp, err := dcl.SendRequest(ctx, c.Config, "GET", u, &bytes.Buffer{}, c.Config.RetryProvider) if err != nil { return nil, err } defer resp.Response.Body.Close() return ioutil.ReadAll(resp.Response.Body) } type listServiceOperation struct { Services []map[string]interface{} `json:"services"` Token string `json:"nextPageToken"` } func (c *Client) listService(ctx context.Context, r *Service, pageToken string, pageSize int32) ([]*Service, string, error) { b, err := c.listServiceRaw(ctx, r, pageToken, pageSize) if err != nil { return nil, "", err } var m listServiceOperation if err := json.Unmarshal(b, &m); err != nil { return nil, "", err } var l []*Service for _, v := range m.Services { res, err := unmarshalMapService(v, c, r) if err != nil { return nil, m.Token, err } res.Project = r.Project res.Location = r.Location l = append(l, res) } return l, m.Token, nil } func (c *Client) deleteAllService(ctx context.Context, f func(*Service) bool, resources []*Service) error { var errors []string for _, res := range resources { if f(res) { // We do not want deleteAll to fail on a deletion or else it will stop deleting other resources. err := c.DeleteService(ctx, res) if err != nil { errors = append(errors, err.Error()) } } } if len(errors) > 0 { return fmt.Errorf("%v", strings.Join(errors, "\n")) } else { return nil } } type deleteServiceOperation struct{} func (op *deleteServiceOperation) do(ctx context.Context, r *Service, c *Client) error { r, err := c.GetService(ctx, r) if err != nil { if dcl.IsNotFound(err) { c.Config.Logger.InfoWithContextf(ctx, "Service not found, returning. Original error: %v", err) return nil } c.Config.Logger.WarningWithContextf(ctx, "GetService checking for existence. error: %v", err) return err } u, err := r.deleteURL(c.Config.BasePath) if err != nil { return err } // Delete should never have a body body := &bytes.Buffer{} _, err = dcl.SendRequest(ctx, c.Config, "DELETE", u, body, c.Config.RetryProvider) if err != nil { return fmt.Errorf("failed to delete Service: %w", err) } return nil } // Create operations are similar to Update operations, although they do not have // specific request objects. The Create request object is the json encoding of // the resource, which is modified by res.marshal to form the base request body. type createServiceOperation struct { response map[string]interface{} } func (op *createServiceOperation) FirstResponse() (map[string]interface{}, bool) { return op.response, len(op.response) > 0 } func (op *createServiceOperation) do(ctx context.Context, r *Service, c *Client) error { c.Config.Logger.InfoWithContextf(ctx, "Attempting to create %v", r) u, err := r.createURL(c.Config.BasePath) if err != nil { return err } req, err := r.marshal(c) if err != nil { return err } resp, err := dcl.SendRequest(ctx, c.Config, "POST", u, bytes.NewBuffer(req), c.Config.RetryProvider) if err != nil { return err } // wait for object to be created. var o operations.StandardGCPOperation if err := dcl.ParseResponse(resp.Response, &o); err != nil { return err } if err := o.Wait(context.WithValue(ctx, dcl.DoNotLogRequestsKey, true), c.Config, r.basePath(), "GET"); err != nil { c.Config.Logger.Warningf("Creation failed after waiting for operation: %v", err) return err } c.Config.Logger.InfoWithContextf(ctx, "Successfully waited for operation") op.response, _ = o.FirstResponse() if _, err := c.GetService(ctx, r); err != nil { c.Config.Logger.WarningWithContextf(ctx, "get returned error: %v", err) return err } return nil } func (c *Client) getServiceRaw(ctx context.Context, r *Service) ([]byte, error) { u, err := r.getURL(c.Config.BasePath) if err != nil { return nil, err } resp, err := dcl.SendRequest(ctx, c.Config, "GET", u, &bytes.Buffer{}, c.Config.RetryProvider) if err != nil { return nil, err } defer resp.Response.Body.Close() b, err := ioutil.ReadAll(resp.Response.Body) if err != nil { return nil, err } return b, nil } func (c *Client) serviceDiffsForRawDesired(ctx context.Context, rawDesired *Service, opts ...dcl.ApplyOption) (initial, desired *Service, diffs []*dcl.FieldDiff, err error) { c.Config.Logger.InfoWithContext(ctx, "Fetching initial state...") // First, let us see if the user provided a state hint. If they did, we will start fetching based on that. var fetchState *Service if sh := dcl.FetchStateHint(opts); sh != nil { if r, ok := sh.(*Service); !ok { c.Config.Logger.WarningWithContextf(ctx, "Initial state hint was of the wrong type; expected Service, got %T", sh) } else { fetchState = r } } if fetchState == nil { fetchState = rawDesired } // 1.2: Retrieval of raw initial state from API rawInitial, err := c.GetService(ctx, fetchState) if rawInitial == nil { if !dcl.IsNotFound(err) { c.Config.Logger.WarningWithContextf(ctx, "Failed to retrieve whether a Service resource already exists: %s", err) return nil, nil, nil, fmt.Errorf("failed to retrieve Service resource: %v", err) } c.Config.Logger.InfoWithContext(ctx, "Found that Service resource did not exist.") // Perform canonicalization to pick up defaults. desired, err = canonicalizeServiceDesiredState(rawDesired, rawInitial) return nil, desired, nil, err } c.Config.Logger.InfoWithContextf(ctx, "Found initial state for Service: %v", rawInitial) c.Config.Logger.InfoWithContextf(ctx, "Initial desired state for Service: %v", rawDesired) // The Get call applies postReadExtract and so the result may contain fields that are not part of API version. if err := extractServiceFields(rawInitial); err != nil { return nil, nil, nil, err } // 1.3: Canonicalize raw initial state into initial state. initial, err = canonicalizeServiceInitialState(rawInitial, rawDesired) if err != nil { return nil, nil, nil, err } c.Config.Logger.InfoWithContextf(ctx, "Canonicalized initial state for Service: %v", initial) // 1.4: Canonicalize raw desired state into desired state. desired, err = canonicalizeServiceDesiredState(rawDesired, rawInitial, opts...) if err != nil { return nil, nil, nil, err } c.Config.Logger.InfoWithContextf(ctx, "Canonicalized desired state for Service: %v", desired) // 2.1: Comparison of initial and desired state. diffs, err = diffService(c, desired, initial, opts...) return initial, desired, diffs, err } func canonicalizeServiceInitialState(rawInitial, rawDesired *Service) (*Service, error) { // TODO(magic-modules-eng): write canonicalizer once relevant traits are added. return rawInitial, nil } /* * Canonicalizers * * These are responsible for converting either a user-specified config or a * GCP API response to a standard format that can be used for difference checking. * */ func canonicalizeServiceDesiredState(rawDesired, rawInitial *Service, opts ...dcl.ApplyOption) (*Service, error) { if rawInitial == nil { // Since the initial state is empty, the desired state is all we have. // We canonicalize the remaining nested objects with nil to pick up defaults. rawDesired.BinaryAuthorization = canonicalizeServiceBinaryAuthorization(rawDesired.BinaryAuthorization, nil, opts...) rawDesired.Template = canonicalizeServiceTemplate(rawDesired.Template, nil, opts...) rawDesired.TerminalCondition = canonicalizeServiceTerminalCondition(rawDesired.TerminalCondition, nil, opts...) return rawDesired, nil } canonicalDesired := &Service{} if dcl.PartialSelfLinkToSelfLink(rawDesired.Name, rawInitial.Name) { canonicalDesired.Name = rawInitial.Name } else { canonicalDesired.Name = rawDesired.Name } if dcl.StringCanonicalize(rawDesired.Description, rawInitial.Description) { canonicalDesired.Description = rawInitial.Description } else { canonicalDesired.Description = rawDesired.Description } if dcl.IsZeroValue(rawDesired.Annotations) || (dcl.IsEmptyValueIndirect(rawDesired.Annotations) && dcl.IsEmptyValueIndirect(rawInitial.Annotations)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. canonicalDesired.Annotations = rawInitial.Annotations } else { canonicalDesired.Annotations = rawDesired.Annotations } if dcl.StringCanonicalize(rawDesired.Client, rawInitial.Client) { canonicalDesired.Client = rawInitial.Client } else { canonicalDesired.Client = rawDesired.Client } if dcl.StringCanonicalize(rawDesired.ClientVersion, rawInitial.ClientVersion) { canonicalDesired.ClientVersion = rawInitial.ClientVersion } else { canonicalDesired.ClientVersion = rawDesired.ClientVersion } if dcl.IsZeroValue(rawDesired.Ingress) || (dcl.IsEmptyValueIndirect(rawDesired.Ingress) && dcl.IsEmptyValueIndirect(rawInitial.Ingress)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. canonicalDesired.Ingress = rawInitial.Ingress } else { canonicalDesired.Ingress = rawDesired.Ingress } if dcl.IsZeroValue(rawDesired.LaunchStage) || (dcl.IsEmptyValueIndirect(rawDesired.LaunchStage) && dcl.IsEmptyValueIndirect(rawInitial.LaunchStage)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. canonicalDesired.LaunchStage = rawInitial.LaunchStage } else { canonicalDesired.LaunchStage = rawDesired.LaunchStage } canonicalDesired.BinaryAuthorization = canonicalizeServiceBinaryAuthorization(rawDesired.BinaryAuthorization, rawInitial.BinaryAuthorization, opts...) canonicalDesired.Template = canonicalizeServiceTemplate(rawDesired.Template, rawInitial.Template, opts...) canonicalDesired.Traffic = canonicalizeServiceTrafficSlice(rawDesired.Traffic, rawInitial.Traffic, opts...) if dcl.NameToSelfLink(rawDesired.Project, rawInitial.Project) { canonicalDesired.Project = rawInitial.Project } else { canonicalDesired.Project = rawDesired.Project } if dcl.NameToSelfLink(rawDesired.Location, rawInitial.Location) { canonicalDesired.Location = rawInitial.Location } else { canonicalDesired.Location = rawDesired.Location } return canonicalDesired, nil } func canonicalizeServiceNewState(c *Client, rawNew, rawDesired *Service) (*Service, error) { if dcl.IsEmptyValueIndirect(rawNew.Name) && dcl.IsEmptyValueIndirect(rawDesired.Name) { rawNew.Name = rawDesired.Name } else { if dcl.PartialSelfLinkToSelfLink(rawDesired.Name, rawNew.Name) { rawNew.Name = rawDesired.Name } } if dcl.IsEmptyValueIndirect(rawNew.Description) && dcl.IsEmptyValueIndirect(rawDesired.Description) { rawNew.Description = rawDesired.Description } else { if dcl.StringCanonicalize(rawDesired.Description, rawNew.Description) { rawNew.Description = rawDesired.Description } } if dcl.IsEmptyValueIndirect(rawNew.Uid) && dcl.IsEmptyValueIndirect(rawDesired.Uid) { rawNew.Uid = rawDesired.Uid } else { if dcl.StringCanonicalize(rawDesired.Uid, rawNew.Uid) { rawNew.Uid = rawDesired.Uid } } if dcl.IsEmptyValueIndirect(rawNew.Generation) && dcl.IsEmptyValueIndirect(rawDesired.Generation) { rawNew.Generation = rawDesired.Generation } else { } if dcl.IsEmptyValueIndirect(rawNew.Labels) && dcl.IsEmptyValueIndirect(rawDesired.Labels) { rawNew.Labels = rawDesired.Labels } else { } if dcl.IsEmptyValueIndirect(rawNew.Annotations) && dcl.IsEmptyValueIndirect(rawDesired.Annotations) { rawNew.Annotations = rawDesired.Annotations } else { } if dcl.IsEmptyValueIndirect(rawNew.CreateTime) && dcl.IsEmptyValueIndirect(rawDesired.CreateTime) { rawNew.CreateTime = rawDesired.CreateTime } else { } if dcl.IsEmptyValueIndirect(rawNew.UpdateTime) && dcl.IsEmptyValueIndirect(rawDesired.UpdateTime) { rawNew.UpdateTime = rawDesired.UpdateTime } else { } if dcl.IsEmptyValueIndirect(rawNew.DeleteTime) && dcl.IsEmptyValueIndirect(rawDesired.DeleteTime) { rawNew.DeleteTime = rawDesired.DeleteTime } else { } if dcl.IsEmptyValueIndirect(rawNew.ExpireTime) && dcl.IsEmptyValueIndirect(rawDesired.ExpireTime) { rawNew.ExpireTime = rawDesired.ExpireTime } else { } if dcl.IsEmptyValueIndirect(rawNew.Creator) && dcl.IsEmptyValueIndirect(rawDesired.Creator) { rawNew.Creator = rawDesired.Creator } else { if dcl.StringCanonicalize(rawDesired.Creator, rawNew.Creator) { rawNew.Creator = rawDesired.Creator } } if dcl.IsEmptyValueIndirect(rawNew.LastModifier) && dcl.IsEmptyValueIndirect(rawDesired.LastModifier) { rawNew.LastModifier = rawDesired.LastModifier } else { if dcl.StringCanonicalize(rawDesired.LastModifier, rawNew.LastModifier) { rawNew.LastModifier = rawDesired.LastModifier } } if dcl.IsEmptyValueIndirect(rawNew.Client) && dcl.IsEmptyValueIndirect(rawDesired.Client) { rawNew.Client = rawDesired.Client } else { if dcl.StringCanonicalize(rawDesired.Client, rawNew.Client) { rawNew.Client = rawDesired.Client } } if dcl.IsEmptyValueIndirect(rawNew.ClientVersion) && dcl.IsEmptyValueIndirect(rawDesired.ClientVersion) { rawNew.ClientVersion = rawDesired.ClientVersion } else { if dcl.StringCanonicalize(rawDesired.ClientVersion, rawNew.ClientVersion) { rawNew.ClientVersion = rawDesired.ClientVersion } } if dcl.IsEmptyValueIndirect(rawNew.Ingress) && dcl.IsEmptyValueIndirect(rawDesired.Ingress) { rawNew.Ingress = rawDesired.Ingress } else { } if dcl.IsEmptyValueIndirect(rawNew.LaunchStage) && dcl.IsEmptyValueIndirect(rawDesired.LaunchStage) { rawNew.LaunchStage = rawDesired.LaunchStage } else { } if dcl.IsEmptyValueIndirect(rawNew.BinaryAuthorization) && dcl.IsEmptyValueIndirect(rawDesired.BinaryAuthorization) { rawNew.BinaryAuthorization = rawDesired.BinaryAuthorization } else { rawNew.BinaryAuthorization = canonicalizeNewServiceBinaryAuthorization(c, rawDesired.BinaryAuthorization, rawNew.BinaryAuthorization) } if dcl.IsEmptyValueIndirect(rawNew.Template) && dcl.IsEmptyValueIndirect(rawDesired.Template) { rawNew.Template = rawDesired.Template } else { rawNew.Template = canonicalizeNewServiceTemplate(c, rawDesired.Template, rawNew.Template) } if dcl.IsEmptyValueIndirect(rawNew.Traffic) && dcl.IsEmptyValueIndirect(rawDesired.Traffic) { rawNew.Traffic = rawDesired.Traffic } else { rawNew.Traffic = canonicalizeNewServiceTrafficSlice(c, rawDesired.Traffic, rawNew.Traffic) } if dcl.IsEmptyValueIndirect(rawNew.TerminalCondition) && dcl.IsEmptyValueIndirect(rawDesired.TerminalCondition) { rawNew.TerminalCondition = rawDesired.TerminalCondition } else { rawNew.TerminalCondition = canonicalizeNewServiceTerminalCondition(c, rawDesired.TerminalCondition, rawNew.TerminalCondition) } if dcl.IsEmptyValueIndirect(rawNew.LatestReadyRevision) && dcl.IsEmptyValueIndirect(rawDesired.LatestReadyRevision) { rawNew.LatestReadyRevision = rawDesired.LatestReadyRevision } else { if dcl.StringCanonicalize(rawDesired.LatestReadyRevision, rawNew.LatestReadyRevision) { rawNew.LatestReadyRevision = rawDesired.LatestReadyRevision } } if dcl.IsEmptyValueIndirect(rawNew.LatestCreatedRevision) && dcl.IsEmptyValueIndirect(rawDesired.LatestCreatedRevision) { rawNew.LatestCreatedRevision = rawDesired.LatestCreatedRevision } else { if dcl.StringCanonicalize(rawDesired.LatestCreatedRevision, rawNew.LatestCreatedRevision) { rawNew.LatestCreatedRevision = rawDesired.LatestCreatedRevision } } if dcl.IsEmptyValueIndirect(rawNew.TrafficStatuses) && dcl.IsEmptyValueIndirect(rawDesired.TrafficStatuses) { rawNew.TrafficStatuses = rawDesired.TrafficStatuses } else { rawNew.TrafficStatuses = canonicalizeNewServiceTrafficStatusesSlice(c, rawDesired.TrafficStatuses, rawNew.TrafficStatuses) } if dcl.IsEmptyValueIndirect(rawNew.Uri) && dcl.IsEmptyValueIndirect(rawDesired.Uri) { rawNew.Uri = rawDesired.Uri } else { if dcl.StringCanonicalize(rawDesired.Uri, rawNew.Uri) { rawNew.Uri = rawDesired.Uri } } if dcl.IsEmptyValueIndirect(rawNew.Reconciling) && dcl.IsEmptyValueIndirect(rawDesired.Reconciling) { rawNew.Reconciling = rawDesired.Reconciling } else { if dcl.BoolCanonicalize(rawDesired.Reconciling, rawNew.Reconciling) { rawNew.Reconciling = rawDesired.Reconciling } } if dcl.IsEmptyValueIndirect(rawNew.Etag) && dcl.IsEmptyValueIndirect(rawDesired.Etag) { rawNew.Etag = rawDesired.Etag } else { if dcl.StringCanonicalize(rawDesired.Etag, rawNew.Etag) { rawNew.Etag = rawDesired.Etag } } rawNew.Project = rawDesired.Project rawNew.Location = rawDesired.Location return rawNew, nil } func canonicalizeServiceBinaryAuthorization(des, initial *ServiceBinaryAuthorization, opts ...dcl.ApplyOption) *ServiceBinaryAuthorization { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceBinaryAuthorization{} if dcl.BoolCanonicalize(des.UseDefault, initial.UseDefault) || dcl.IsZeroValue(des.UseDefault) { cDes.UseDefault = initial.UseDefault } else { cDes.UseDefault = des.UseDefault } if dcl.StringCanonicalize(des.BreakglassJustification, initial.BreakglassJustification) || dcl.IsZeroValue(des.BreakglassJustification) { cDes.BreakglassJustification = initial.BreakglassJustification } else { cDes.BreakglassJustification = des.BreakglassJustification } return cDes } func canonicalizeServiceBinaryAuthorizationSlice(des, initial []ServiceBinaryAuthorization, opts ...dcl.ApplyOption) []ServiceBinaryAuthorization { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceBinaryAuthorization, 0, len(des)) for _, d := range des { cd := canonicalizeServiceBinaryAuthorization(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceBinaryAuthorization, 0, len(des)) for i, d := range des { cd := canonicalizeServiceBinaryAuthorization(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceBinaryAuthorization(c *Client, des, nw *ServiceBinaryAuthorization) *ServiceBinaryAuthorization { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceBinaryAuthorization while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.BoolCanonicalize(des.UseDefault, nw.UseDefault) { nw.UseDefault = des.UseDefault } if dcl.StringCanonicalize(des.BreakglassJustification, nw.BreakglassJustification) { nw.BreakglassJustification = des.BreakglassJustification } return nw } func canonicalizeNewServiceBinaryAuthorizationSet(c *Client, des, nw []ServiceBinaryAuthorization) []ServiceBinaryAuthorization { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceBinaryAuthorization for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceBinaryAuthorizationNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceBinaryAuthorization(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceBinaryAuthorizationSlice(c *Client, des, nw []ServiceBinaryAuthorization) []ServiceBinaryAuthorization { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceBinaryAuthorization for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceBinaryAuthorization(c, &d, &n)) } return items } func canonicalizeServiceTemplate(des, initial *ServiceTemplate, opts ...dcl.ApplyOption) *ServiceTemplate { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplate{} if dcl.StringCanonicalize(des.Revision, initial.Revision) || dcl.IsZeroValue(des.Revision) { cDes.Revision = initial.Revision } else { cDes.Revision = des.Revision } if dcl.IsZeroValue(des.Labels) || (dcl.IsEmptyValueIndirect(des.Labels) && dcl.IsEmptyValueIndirect(initial.Labels)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Labels = initial.Labels } else { cDes.Labels = des.Labels } if dcl.IsZeroValue(des.Annotations) || (dcl.IsEmptyValueIndirect(des.Annotations) && dcl.IsEmptyValueIndirect(initial.Annotations)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Annotations = initial.Annotations } else { cDes.Annotations = des.Annotations } cDes.Scaling = canonicalizeServiceTemplateScaling(des.Scaling, initial.Scaling, opts...) cDes.VPCAccess = canonicalizeServiceTemplateVPCAccess(des.VPCAccess, initial.VPCAccess, opts...) if dcl.IsZeroValue(des.ContainerConcurrency) || (dcl.IsEmptyValueIndirect(des.ContainerConcurrency) && dcl.IsEmptyValueIndirect(initial.ContainerConcurrency)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.ContainerConcurrency = initial.ContainerConcurrency } else { cDes.ContainerConcurrency = des.ContainerConcurrency } if dcl.StringCanonicalize(des.Timeout, initial.Timeout) || dcl.IsZeroValue(des.Timeout) { cDes.Timeout = initial.Timeout } else { cDes.Timeout = des.Timeout } if dcl.IsZeroValue(des.ServiceAccount) || (dcl.IsEmptyValueIndirect(des.ServiceAccount) && dcl.IsEmptyValueIndirect(initial.ServiceAccount)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.ServiceAccount = initial.ServiceAccount } else { cDes.ServiceAccount = des.ServiceAccount } cDes.Containers = canonicalizeServiceTemplateContainersSlice(des.Containers, initial.Containers, opts...) cDes.Volumes = canonicalizeServiceTemplateVolumesSlice(des.Volumes, initial.Volumes, opts...) if dcl.IsZeroValue(des.ExecutionEnvironment) || (dcl.IsEmptyValueIndirect(des.ExecutionEnvironment) && dcl.IsEmptyValueIndirect(initial.ExecutionEnvironment)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.ExecutionEnvironment = initial.ExecutionEnvironment } else { cDes.ExecutionEnvironment = des.ExecutionEnvironment } return cDes } func canonicalizeServiceTemplateSlice(des, initial []ServiceTemplate, opts ...dcl.ApplyOption) []ServiceTemplate { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplate, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplate(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplate, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplate(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplate(c *Client, des, nw *ServiceTemplate) *ServiceTemplate { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplate while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Revision, nw.Revision) { nw.Revision = des.Revision } nw.Scaling = canonicalizeNewServiceTemplateScaling(c, des.Scaling, nw.Scaling) nw.VPCAccess = canonicalizeNewServiceTemplateVPCAccess(c, des.VPCAccess, nw.VPCAccess) if dcl.StringCanonicalize(des.Timeout, nw.Timeout) { nw.Timeout = des.Timeout } nw.Containers = canonicalizeNewServiceTemplateContainersSlice(c, des.Containers, nw.Containers) nw.Volumes = canonicalizeNewServiceTemplateVolumesSlice(c, des.Volumes, nw.Volumes) return nw } func canonicalizeNewServiceTemplateSet(c *Client, des, nw []ServiceTemplate) []ServiceTemplate { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplate for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplate(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateSlice(c *Client, des, nw []ServiceTemplate) []ServiceTemplate { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplate for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplate(c, &d, &n)) } return items } func canonicalizeServiceTemplateScaling(des, initial *ServiceTemplateScaling, opts ...dcl.ApplyOption) *ServiceTemplateScaling { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateScaling{} if dcl.IsZeroValue(des.MinInstanceCount) || (dcl.IsEmptyValueIndirect(des.MinInstanceCount) && dcl.IsEmptyValueIndirect(initial.MinInstanceCount)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.MinInstanceCount = initial.MinInstanceCount } else { cDes.MinInstanceCount = des.MinInstanceCount } if dcl.IsZeroValue(des.MaxInstanceCount) || (dcl.IsEmptyValueIndirect(des.MaxInstanceCount) && dcl.IsEmptyValueIndirect(initial.MaxInstanceCount)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.MaxInstanceCount = initial.MaxInstanceCount } else { cDes.MaxInstanceCount = des.MaxInstanceCount } return cDes } func canonicalizeServiceTemplateScalingSlice(des, initial []ServiceTemplateScaling, opts ...dcl.ApplyOption) []ServiceTemplateScaling { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateScaling, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateScaling(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateScaling, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateScaling(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateScaling(c *Client, des, nw *ServiceTemplateScaling) *ServiceTemplateScaling { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateScaling while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } return nw } func canonicalizeNewServiceTemplateScalingSet(c *Client, des, nw []ServiceTemplateScaling) []ServiceTemplateScaling { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateScaling for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateScalingNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateScaling(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateScalingSlice(c *Client, des, nw []ServiceTemplateScaling) []ServiceTemplateScaling { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateScaling for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateScaling(c, &d, &n)) } return items } func canonicalizeServiceTemplateVPCAccess(des, initial *ServiceTemplateVPCAccess, opts ...dcl.ApplyOption) *ServiceTemplateVPCAccess { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateVPCAccess{} if dcl.IsZeroValue(des.Connector) || (dcl.IsEmptyValueIndirect(des.Connector) && dcl.IsEmptyValueIndirect(initial.Connector)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Connector = initial.Connector } else { cDes.Connector = des.Connector } if dcl.IsZeroValue(des.Egress) || (dcl.IsEmptyValueIndirect(des.Egress) && dcl.IsEmptyValueIndirect(initial.Egress)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Egress = initial.Egress } else { cDes.Egress = des.Egress } return cDes } func canonicalizeServiceTemplateVPCAccessSlice(des, initial []ServiceTemplateVPCAccess, opts ...dcl.ApplyOption) []ServiceTemplateVPCAccess { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateVPCAccess, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateVPCAccess(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateVPCAccess, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateVPCAccess(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateVPCAccess(c *Client, des, nw *ServiceTemplateVPCAccess) *ServiceTemplateVPCAccess { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateVPCAccess while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } return nw } func canonicalizeNewServiceTemplateVPCAccessSet(c *Client, des, nw []ServiceTemplateVPCAccess) []ServiceTemplateVPCAccess { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateVPCAccess for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateVPCAccessNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateVPCAccess(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateVPCAccessSlice(c *Client, des, nw []ServiceTemplateVPCAccess) []ServiceTemplateVPCAccess { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateVPCAccess for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateVPCAccess(c, &d, &n)) } return items } func canonicalizeServiceTemplateContainers(des, initial *ServiceTemplateContainers, opts ...dcl.ApplyOption) *ServiceTemplateContainers { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateContainers{} if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Image, initial.Image) || dcl.IsZeroValue(des.Image) { cDes.Image = initial.Image } else { cDes.Image = des.Image } if dcl.StringArrayCanonicalize(des.Command, initial.Command) { cDes.Command = initial.Command } else { cDes.Command = des.Command } if dcl.StringArrayCanonicalize(des.Args, initial.Args) { cDes.Args = initial.Args } else { cDes.Args = des.Args } cDes.Env = canonicalizeServiceTemplateContainersEnvSlice(des.Env, initial.Env, opts...) cDes.Resources = canonicalizeServiceTemplateContainersResources(des.Resources, initial.Resources, opts...) cDes.Ports = canonicalizeServiceTemplateContainersPortsSlice(des.Ports, initial.Ports, opts...) cDes.VolumeMounts = canonicalizeServiceTemplateContainersVolumeMountsSlice(des.VolumeMounts, initial.VolumeMounts, opts...) return cDes } func canonicalizeServiceTemplateContainersSlice(des, initial []ServiceTemplateContainers, opts ...dcl.ApplyOption) []ServiceTemplateContainers { if des == nil { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateContainers, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateContainers(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateContainers, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateContainers(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateContainers(c *Client, des, nw *ServiceTemplateContainers) *ServiceTemplateContainers { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateContainers while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Image, nw.Image) { nw.Image = des.Image } if dcl.StringArrayCanonicalize(des.Command, nw.Command) { nw.Command = des.Command } if dcl.StringArrayCanonicalize(des.Args, nw.Args) { nw.Args = des.Args } nw.Env = canonicalizeNewServiceTemplateContainersEnvSlice(c, des.Env, nw.Env) nw.Resources = canonicalizeNewServiceTemplateContainersResources(c, des.Resources, nw.Resources) nw.Ports = canonicalizeNewServiceTemplateContainersPortsSlice(c, des.Ports, nw.Ports) nw.VolumeMounts = canonicalizeNewServiceTemplateContainersVolumeMountsSlice(c, des.VolumeMounts, nw.VolumeMounts) return nw } func canonicalizeNewServiceTemplateContainersSet(c *Client, des, nw []ServiceTemplateContainers) []ServiceTemplateContainers { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateContainers for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateContainersNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateContainers(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateContainersSlice(c *Client, des, nw []ServiceTemplateContainers) []ServiceTemplateContainers { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateContainers for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateContainers(c, &d, &n)) } return items } func canonicalizeServiceTemplateContainersEnv(des, initial *ServiceTemplateContainersEnv, opts ...dcl.ApplyOption) *ServiceTemplateContainersEnv { if des == nil { return initial } if des.empty { return des } if des.Value != nil || (initial != nil && initial.Value != nil) { // Check if anything else is set. if dcl.AnySet(des.ValueSource) { des.Value = nil if initial != nil { initial.Value = nil } } } if des.ValueSource != nil || (initial != nil && initial.ValueSource != nil) { // Check if anything else is set. if dcl.AnySet(des.Value) { des.ValueSource = nil if initial != nil { initial.ValueSource = nil } } } if initial == nil { return des } cDes := &ServiceTemplateContainersEnv{} if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Value, initial.Value) || dcl.IsZeroValue(des.Value) { cDes.Value = initial.Value } else { cDes.Value = des.Value } cDes.ValueSource = canonicalizeServiceTemplateContainersEnvValueSource(des.ValueSource, initial.ValueSource, opts...) return cDes } func canonicalizeServiceTemplateContainersEnvSlice(des, initial []ServiceTemplateContainersEnv, opts ...dcl.ApplyOption) []ServiceTemplateContainersEnv { if des == nil { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateContainersEnv, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateContainersEnv(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateContainersEnv, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateContainersEnv(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateContainersEnv(c *Client, des, nw *ServiceTemplateContainersEnv) *ServiceTemplateContainersEnv { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateContainersEnv while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Value, nw.Value) { nw.Value = des.Value } nw.ValueSource = canonicalizeNewServiceTemplateContainersEnvValueSource(c, des.ValueSource, nw.ValueSource) return nw } func canonicalizeNewServiceTemplateContainersEnvSet(c *Client, des, nw []ServiceTemplateContainersEnv) []ServiceTemplateContainersEnv { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateContainersEnv for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateContainersEnvNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateContainersEnv(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateContainersEnvSlice(c *Client, des, nw []ServiceTemplateContainersEnv) []ServiceTemplateContainersEnv { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateContainersEnv for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateContainersEnv(c, &d, &n)) } return items } func canonicalizeServiceTemplateContainersEnvValueSource(des, initial *ServiceTemplateContainersEnvValueSource, opts ...dcl.ApplyOption) *ServiceTemplateContainersEnvValueSource { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateContainersEnvValueSource{} cDes.SecretKeyRef = canonicalizeServiceTemplateContainersEnvValueSourceSecretKeyRef(des.SecretKeyRef, initial.SecretKeyRef, opts...) return cDes } func canonicalizeServiceTemplateContainersEnvValueSourceSlice(des, initial []ServiceTemplateContainersEnvValueSource, opts ...dcl.ApplyOption) []ServiceTemplateContainersEnvValueSource { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateContainersEnvValueSource, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateContainersEnvValueSource(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateContainersEnvValueSource, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateContainersEnvValueSource(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateContainersEnvValueSource(c *Client, des, nw *ServiceTemplateContainersEnvValueSource) *ServiceTemplateContainersEnvValueSource { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateContainersEnvValueSource while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } nw.SecretKeyRef = canonicalizeNewServiceTemplateContainersEnvValueSourceSecretKeyRef(c, des.SecretKeyRef, nw.SecretKeyRef) return nw } func canonicalizeNewServiceTemplateContainersEnvValueSourceSet(c *Client, des, nw []ServiceTemplateContainersEnvValueSource) []ServiceTemplateContainersEnvValueSource { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateContainersEnvValueSource for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateContainersEnvValueSourceNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateContainersEnvValueSource(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateContainersEnvValueSourceSlice(c *Client, des, nw []ServiceTemplateContainersEnvValueSource) []ServiceTemplateContainersEnvValueSource { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateContainersEnvValueSource for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateContainersEnvValueSource(c, &d, &n)) } return items } func canonicalizeServiceTemplateContainersEnvValueSourceSecretKeyRef(des, initial *ServiceTemplateContainersEnvValueSourceSecretKeyRef, opts ...dcl.ApplyOption) *ServiceTemplateContainersEnvValueSourceSecretKeyRef { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateContainersEnvValueSourceSecretKeyRef{} if dcl.IsZeroValue(des.Secret) || (dcl.IsEmptyValueIndirect(des.Secret) && dcl.IsEmptyValueIndirect(initial.Secret)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Secret = initial.Secret } else { cDes.Secret = des.Secret } if dcl.IsZeroValue(des.Version) || (dcl.IsEmptyValueIndirect(des.Version) && dcl.IsEmptyValueIndirect(initial.Version)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Version = initial.Version } else { cDes.Version = des.Version } return cDes } func canonicalizeServiceTemplateContainersEnvValueSourceSecretKeyRefSlice(des, initial []ServiceTemplateContainersEnvValueSourceSecretKeyRef, opts ...dcl.ApplyOption) []ServiceTemplateContainersEnvValueSourceSecretKeyRef { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateContainersEnvValueSourceSecretKeyRef, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateContainersEnvValueSourceSecretKeyRef(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateContainersEnvValueSourceSecretKeyRef, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateContainersEnvValueSourceSecretKeyRef(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateContainersEnvValueSourceSecretKeyRef(c *Client, des, nw *ServiceTemplateContainersEnvValueSourceSecretKeyRef) *ServiceTemplateContainersEnvValueSourceSecretKeyRef { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateContainersEnvValueSourceSecretKeyRef while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } return nw } func canonicalizeNewServiceTemplateContainersEnvValueSourceSecretKeyRefSet(c *Client, des, nw []ServiceTemplateContainersEnvValueSourceSecretKeyRef) []ServiceTemplateContainersEnvValueSourceSecretKeyRef { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateContainersEnvValueSourceSecretKeyRef for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateContainersEnvValueSourceSecretKeyRefNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateContainersEnvValueSourceSecretKeyRef(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateContainersEnvValueSourceSecretKeyRefSlice(c *Client, des, nw []ServiceTemplateContainersEnvValueSourceSecretKeyRef) []ServiceTemplateContainersEnvValueSourceSecretKeyRef { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateContainersEnvValueSourceSecretKeyRef for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateContainersEnvValueSourceSecretKeyRef(c, &d, &n)) } return items } func canonicalizeServiceTemplateContainersResources(des, initial *ServiceTemplateContainersResources, opts ...dcl.ApplyOption) *ServiceTemplateContainersResources { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateContainersResources{} if dcl.IsZeroValue(des.Limits) || (dcl.IsEmptyValueIndirect(des.Limits) && dcl.IsEmptyValueIndirect(initial.Limits)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Limits = initial.Limits } else { cDes.Limits = des.Limits } if dcl.BoolCanonicalize(des.CpuIdle, initial.CpuIdle) || dcl.IsZeroValue(des.CpuIdle) { cDes.CpuIdle = initial.CpuIdle } else { cDes.CpuIdle = des.CpuIdle } return cDes } func canonicalizeServiceTemplateContainersResourcesSlice(des, initial []ServiceTemplateContainersResources, opts ...dcl.ApplyOption) []ServiceTemplateContainersResources { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateContainersResources, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateContainersResources(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateContainersResources, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateContainersResources(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateContainersResources(c *Client, des, nw *ServiceTemplateContainersResources) *ServiceTemplateContainersResources { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateContainersResources while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.BoolCanonicalize(des.CpuIdle, nw.CpuIdle) { nw.CpuIdle = des.CpuIdle } return nw } func canonicalizeNewServiceTemplateContainersResourcesSet(c *Client, des, nw []ServiceTemplateContainersResources) []ServiceTemplateContainersResources { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateContainersResources for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateContainersResourcesNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateContainersResources(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateContainersResourcesSlice(c *Client, des, nw []ServiceTemplateContainersResources) []ServiceTemplateContainersResources { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateContainersResources for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateContainersResources(c, &d, &n)) } return items } func canonicalizeServiceTemplateContainersPorts(des, initial *ServiceTemplateContainersPorts, opts ...dcl.ApplyOption) *ServiceTemplateContainersPorts { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateContainersPorts{} if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.IsZeroValue(des.ContainerPort) || (dcl.IsEmptyValueIndirect(des.ContainerPort) && dcl.IsEmptyValueIndirect(initial.ContainerPort)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.ContainerPort = initial.ContainerPort } else { cDes.ContainerPort = des.ContainerPort } return cDes } func canonicalizeServiceTemplateContainersPortsSlice(des, initial []ServiceTemplateContainersPorts, opts ...dcl.ApplyOption) []ServiceTemplateContainersPorts { if des == nil { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateContainersPorts, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateContainersPorts(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateContainersPorts, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateContainersPorts(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateContainersPorts(c *Client, des, nw *ServiceTemplateContainersPorts) *ServiceTemplateContainersPorts { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateContainersPorts while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } return nw } func canonicalizeNewServiceTemplateContainersPortsSet(c *Client, des, nw []ServiceTemplateContainersPorts) []ServiceTemplateContainersPorts { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateContainersPorts for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateContainersPortsNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateContainersPorts(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateContainersPortsSlice(c *Client, des, nw []ServiceTemplateContainersPorts) []ServiceTemplateContainersPorts { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateContainersPorts for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateContainersPorts(c, &d, &n)) } return items } func canonicalizeServiceTemplateContainersVolumeMounts(des, initial *ServiceTemplateContainersVolumeMounts, opts ...dcl.ApplyOption) *ServiceTemplateContainersVolumeMounts { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateContainersVolumeMounts{} if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.MountPath, initial.MountPath) || dcl.IsZeroValue(des.MountPath) { cDes.MountPath = initial.MountPath } else { cDes.MountPath = des.MountPath } return cDes } func canonicalizeServiceTemplateContainersVolumeMountsSlice(des, initial []ServiceTemplateContainersVolumeMounts, opts ...dcl.ApplyOption) []ServiceTemplateContainersVolumeMounts { if des == nil { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateContainersVolumeMounts, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateContainersVolumeMounts(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateContainersVolumeMounts, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateContainersVolumeMounts(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateContainersVolumeMounts(c *Client, des, nw *ServiceTemplateContainersVolumeMounts) *ServiceTemplateContainersVolumeMounts { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateContainersVolumeMounts while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.MountPath, nw.MountPath) { nw.MountPath = des.MountPath } return nw } func canonicalizeNewServiceTemplateContainersVolumeMountsSet(c *Client, des, nw []ServiceTemplateContainersVolumeMounts) []ServiceTemplateContainersVolumeMounts { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateContainersVolumeMounts for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateContainersVolumeMountsNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateContainersVolumeMounts(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateContainersVolumeMountsSlice(c *Client, des, nw []ServiceTemplateContainersVolumeMounts) []ServiceTemplateContainersVolumeMounts { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateContainersVolumeMounts for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateContainersVolumeMounts(c, &d, &n)) } return items } func canonicalizeServiceTemplateVolumes(des, initial *ServiceTemplateVolumes, opts ...dcl.ApplyOption) *ServiceTemplateVolumes { if des == nil { return initial } if des.empty { return des } if des.Secret != nil || (initial != nil && initial.Secret != nil) { // Check if anything else is set. if dcl.AnySet(des.CloudSqlInstance) { des.Secret = nil if initial != nil { initial.Secret = nil } } } if des.CloudSqlInstance != nil || (initial != nil && initial.CloudSqlInstance != nil) { // Check if anything else is set. if dcl.AnySet(des.Secret) { des.CloudSqlInstance = nil if initial != nil { initial.CloudSqlInstance = nil } } } if initial == nil { return des } cDes := &ServiceTemplateVolumes{} if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } cDes.Secret = canonicalizeServiceTemplateVolumesSecret(des.Secret, initial.Secret, opts...) cDes.CloudSqlInstance = canonicalizeServiceTemplateVolumesCloudSqlInstance(des.CloudSqlInstance, initial.CloudSqlInstance, opts...) return cDes } func canonicalizeServiceTemplateVolumesSlice(des, initial []ServiceTemplateVolumes, opts ...dcl.ApplyOption) []ServiceTemplateVolumes { if des == nil { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateVolumes, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateVolumes(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateVolumes, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateVolumes(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateVolumes(c *Client, des, nw *ServiceTemplateVolumes) *ServiceTemplateVolumes { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateVolumes while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } nw.Secret = canonicalizeNewServiceTemplateVolumesSecret(c, des.Secret, nw.Secret) nw.CloudSqlInstance = canonicalizeNewServiceTemplateVolumesCloudSqlInstance(c, des.CloudSqlInstance, nw.CloudSqlInstance) return nw } func canonicalizeNewServiceTemplateVolumesSet(c *Client, des, nw []ServiceTemplateVolumes) []ServiceTemplateVolumes { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateVolumes for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateVolumesNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateVolumes(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateVolumesSlice(c *Client, des, nw []ServiceTemplateVolumes) []ServiceTemplateVolumes { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateVolumes for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateVolumes(c, &d, &n)) } return items } func canonicalizeServiceTemplateVolumesSecret(des, initial *ServiceTemplateVolumesSecret, opts ...dcl.ApplyOption) *ServiceTemplateVolumesSecret { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateVolumesSecret{} if dcl.IsZeroValue(des.Secret) || (dcl.IsEmptyValueIndirect(des.Secret) && dcl.IsEmptyValueIndirect(initial.Secret)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Secret = initial.Secret } else { cDes.Secret = des.Secret } cDes.Items = canonicalizeServiceTemplateVolumesSecretItemsSlice(des.Items, initial.Items, opts...) if dcl.IsZeroValue(des.DefaultMode) || (dcl.IsEmptyValueIndirect(des.DefaultMode) && dcl.IsEmptyValueIndirect(initial.DefaultMode)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.DefaultMode = initial.DefaultMode } else { cDes.DefaultMode = des.DefaultMode } return cDes } func canonicalizeServiceTemplateVolumesSecretSlice(des, initial []ServiceTemplateVolumesSecret, opts ...dcl.ApplyOption) []ServiceTemplateVolumesSecret { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateVolumesSecret, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateVolumesSecret(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateVolumesSecret, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateVolumesSecret(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateVolumesSecret(c *Client, des, nw *ServiceTemplateVolumesSecret) *ServiceTemplateVolumesSecret { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateVolumesSecret while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } nw.Items = canonicalizeNewServiceTemplateVolumesSecretItemsSlice(c, des.Items, nw.Items) return nw } func canonicalizeNewServiceTemplateVolumesSecretSet(c *Client, des, nw []ServiceTemplateVolumesSecret) []ServiceTemplateVolumesSecret { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateVolumesSecret for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateVolumesSecretNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateVolumesSecret(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateVolumesSecretSlice(c *Client, des, nw []ServiceTemplateVolumesSecret) []ServiceTemplateVolumesSecret { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateVolumesSecret for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateVolumesSecret(c, &d, &n)) } return items } func canonicalizeServiceTemplateVolumesSecretItems(des, initial *ServiceTemplateVolumesSecretItems, opts ...dcl.ApplyOption) *ServiceTemplateVolumesSecretItems { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateVolumesSecretItems{} if dcl.StringCanonicalize(des.Path, initial.Path) || dcl.IsZeroValue(des.Path) { cDes.Path = initial.Path } else { cDes.Path = des.Path } if dcl.IsZeroValue(des.Version) || (dcl.IsEmptyValueIndirect(des.Version) && dcl.IsEmptyValueIndirect(initial.Version)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Version = initial.Version } else { cDes.Version = des.Version } if dcl.IsZeroValue(des.Mode) || (dcl.IsEmptyValueIndirect(des.Mode) && dcl.IsEmptyValueIndirect(initial.Mode)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Mode = initial.Mode } else { cDes.Mode = des.Mode } return cDes } func canonicalizeServiceTemplateVolumesSecretItemsSlice(des, initial []ServiceTemplateVolumesSecretItems, opts ...dcl.ApplyOption) []ServiceTemplateVolumesSecretItems { if des == nil { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateVolumesSecretItems, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateVolumesSecretItems(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateVolumesSecretItems, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateVolumesSecretItems(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateVolumesSecretItems(c *Client, des, nw *ServiceTemplateVolumesSecretItems) *ServiceTemplateVolumesSecretItems { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateVolumesSecretItems while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Path, nw.Path) { nw.Path = des.Path } return nw } func canonicalizeNewServiceTemplateVolumesSecretItemsSet(c *Client, des, nw []ServiceTemplateVolumesSecretItems) []ServiceTemplateVolumesSecretItems { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateVolumesSecretItems for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateVolumesSecretItemsNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateVolumesSecretItems(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateVolumesSecretItemsSlice(c *Client, des, nw []ServiceTemplateVolumesSecretItems) []ServiceTemplateVolumesSecretItems { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateVolumesSecretItems for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateVolumesSecretItems(c, &d, &n)) } return items } func canonicalizeServiceTemplateVolumesCloudSqlInstance(des, initial *ServiceTemplateVolumesCloudSqlInstance, opts ...dcl.ApplyOption) *ServiceTemplateVolumesCloudSqlInstance { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTemplateVolumesCloudSqlInstance{} if dcl.StringArrayCanonicalize(des.Instances, initial.Instances) { cDes.Instances = initial.Instances } else { cDes.Instances = des.Instances } return cDes } func canonicalizeServiceTemplateVolumesCloudSqlInstanceSlice(des, initial []ServiceTemplateVolumesCloudSqlInstance, opts ...dcl.ApplyOption) []ServiceTemplateVolumesCloudSqlInstance { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTemplateVolumesCloudSqlInstance, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTemplateVolumesCloudSqlInstance(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTemplateVolumesCloudSqlInstance, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTemplateVolumesCloudSqlInstance(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTemplateVolumesCloudSqlInstance(c *Client, des, nw *ServiceTemplateVolumesCloudSqlInstance) *ServiceTemplateVolumesCloudSqlInstance { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTemplateVolumesCloudSqlInstance while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringArrayCanonicalize(des.Instances, nw.Instances) { nw.Instances = des.Instances } return nw } func canonicalizeNewServiceTemplateVolumesCloudSqlInstanceSet(c *Client, des, nw []ServiceTemplateVolumesCloudSqlInstance) []ServiceTemplateVolumesCloudSqlInstance { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTemplateVolumesCloudSqlInstance for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTemplateVolumesCloudSqlInstanceNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTemplateVolumesCloudSqlInstance(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTemplateVolumesCloudSqlInstanceSlice(c *Client, des, nw []ServiceTemplateVolumesCloudSqlInstance) []ServiceTemplateVolumesCloudSqlInstance { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTemplateVolumesCloudSqlInstance for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTemplateVolumesCloudSqlInstance(c, &d, &n)) } return items } func canonicalizeServiceTraffic(des, initial *ServiceTraffic, opts ...dcl.ApplyOption) *ServiceTraffic { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTraffic{} if dcl.IsZeroValue(des.Type) || (dcl.IsEmptyValueIndirect(des.Type) && dcl.IsEmptyValueIndirect(initial.Type)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Type = initial.Type } else { cDes.Type = des.Type } if dcl.StringCanonicalize(des.Revision, initial.Revision) || dcl.IsZeroValue(des.Revision) { cDes.Revision = initial.Revision } else { cDes.Revision = des.Revision } if dcl.IsZeroValue(des.Percent) || (dcl.IsEmptyValueIndirect(des.Percent) && dcl.IsEmptyValueIndirect(initial.Percent)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Percent = initial.Percent } else { cDes.Percent = des.Percent } if dcl.StringCanonicalize(des.Tag, initial.Tag) || dcl.IsZeroValue(des.Tag) { cDes.Tag = initial.Tag } else { cDes.Tag = des.Tag } return cDes } func canonicalizeServiceTrafficSlice(des, initial []ServiceTraffic, opts ...dcl.ApplyOption) []ServiceTraffic { if des == nil { return initial } if len(des) != len(initial) { items := make([]ServiceTraffic, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTraffic(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTraffic, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTraffic(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTraffic(c *Client, des, nw *ServiceTraffic) *ServiceTraffic { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTraffic while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Revision, nw.Revision) { nw.Revision = des.Revision } if dcl.StringCanonicalize(des.Tag, nw.Tag) { nw.Tag = des.Tag } return nw } func canonicalizeNewServiceTrafficSet(c *Client, des, nw []ServiceTraffic) []ServiceTraffic { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTraffic for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTrafficNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTraffic(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTrafficSlice(c *Client, des, nw []ServiceTraffic) []ServiceTraffic { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTraffic for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTraffic(c, &d, &n)) } return items } func canonicalizeServiceTerminalCondition(des, initial *ServiceTerminalCondition, opts ...dcl.ApplyOption) *ServiceTerminalCondition { if des == nil { return initial } if des.empty { return des } if des.Reason != nil || (initial != nil && initial.Reason != nil) { // Check if anything else is set. if dcl.AnySet(des.RevisionReason, des.JobReason) { des.Reason = nil if initial != nil { initial.Reason = nil } } } if des.RevisionReason != nil || (initial != nil && initial.RevisionReason != nil) { // Check if anything else is set. if dcl.AnySet(des.Reason, des.JobReason) { des.RevisionReason = nil if initial != nil { initial.RevisionReason = nil } } } if des.JobReason != nil || (initial != nil && initial.JobReason != nil) { // Check if anything else is set. if dcl.AnySet(des.Reason, des.RevisionReason) { des.JobReason = nil if initial != nil { initial.JobReason = nil } } } if initial == nil { return des } cDes := &ServiceTerminalCondition{} if dcl.StringCanonicalize(des.Type, initial.Type) || dcl.IsZeroValue(des.Type) { cDes.Type = initial.Type } else { cDes.Type = des.Type } if dcl.IsZeroValue(des.State) || (dcl.IsEmptyValueIndirect(des.State) && dcl.IsEmptyValueIndirect(initial.State)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.State = initial.State } else { cDes.State = des.State } if dcl.StringCanonicalize(des.Message, initial.Message) || dcl.IsZeroValue(des.Message) { cDes.Message = initial.Message } else { cDes.Message = des.Message } if dcl.IsZeroValue(des.LastTransitionTime) || (dcl.IsEmptyValueIndirect(des.LastTransitionTime) && dcl.IsEmptyValueIndirect(initial.LastTransitionTime)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.LastTransitionTime = initial.LastTransitionTime } else { cDes.LastTransitionTime = des.LastTransitionTime } if dcl.IsZeroValue(des.Severity) || (dcl.IsEmptyValueIndirect(des.Severity) && dcl.IsEmptyValueIndirect(initial.Severity)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Severity = initial.Severity } else { cDes.Severity = des.Severity } if dcl.IsZeroValue(des.Reason) || (dcl.IsEmptyValueIndirect(des.Reason) && dcl.IsEmptyValueIndirect(initial.Reason)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Reason = initial.Reason } else { cDes.Reason = des.Reason } if dcl.IsZeroValue(des.RevisionReason) || (dcl.IsEmptyValueIndirect(des.RevisionReason) && dcl.IsEmptyValueIndirect(initial.RevisionReason)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.RevisionReason = initial.RevisionReason } else { cDes.RevisionReason = des.RevisionReason } if dcl.IsZeroValue(des.JobReason) || (dcl.IsEmptyValueIndirect(des.JobReason) && dcl.IsEmptyValueIndirect(initial.JobReason)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.JobReason = initial.JobReason } else { cDes.JobReason = des.JobReason } return cDes } func canonicalizeServiceTerminalConditionSlice(des, initial []ServiceTerminalCondition, opts ...dcl.ApplyOption) []ServiceTerminalCondition { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTerminalCondition, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTerminalCondition(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTerminalCondition, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTerminalCondition(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTerminalCondition(c *Client, des, nw *ServiceTerminalCondition) *ServiceTerminalCondition { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTerminalCondition while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Type, nw.Type) { nw.Type = des.Type } if dcl.StringCanonicalize(des.Message, nw.Message) { nw.Message = des.Message } return nw } func canonicalizeNewServiceTerminalConditionSet(c *Client, des, nw []ServiceTerminalCondition) []ServiceTerminalCondition { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTerminalCondition for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTerminalConditionNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTerminalCondition(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTerminalConditionSlice(c *Client, des, nw []ServiceTerminalCondition) []ServiceTerminalCondition { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTerminalCondition for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTerminalCondition(c, &d, &n)) } return items } func canonicalizeServiceTrafficStatuses(des, initial *ServiceTrafficStatuses, opts ...dcl.ApplyOption) *ServiceTrafficStatuses { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &ServiceTrafficStatuses{} if dcl.IsZeroValue(des.Type) || (dcl.IsEmptyValueIndirect(des.Type) && dcl.IsEmptyValueIndirect(initial.Type)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Type = initial.Type } else { cDes.Type = des.Type } if dcl.StringCanonicalize(des.Revision, initial.Revision) || dcl.IsZeroValue(des.Revision) { cDes.Revision = initial.Revision } else { cDes.Revision = des.Revision } if dcl.IsZeroValue(des.Percent) || (dcl.IsEmptyValueIndirect(des.Percent) && dcl.IsEmptyValueIndirect(initial.Percent)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Percent = initial.Percent } else { cDes.Percent = des.Percent } if dcl.StringCanonicalize(des.Tag, initial.Tag) || dcl.IsZeroValue(des.Tag) { cDes.Tag = initial.Tag } else { cDes.Tag = des.Tag } if dcl.StringCanonicalize(des.Uri, initial.Uri) || dcl.IsZeroValue(des.Uri) { cDes.Uri = initial.Uri } else { cDes.Uri = des.Uri } return cDes } func canonicalizeServiceTrafficStatusesSlice(des, initial []ServiceTrafficStatuses, opts ...dcl.ApplyOption) []ServiceTrafficStatuses { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]ServiceTrafficStatuses, 0, len(des)) for _, d := range des { cd := canonicalizeServiceTrafficStatuses(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]ServiceTrafficStatuses, 0, len(des)) for i, d := range des { cd := canonicalizeServiceTrafficStatuses(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewServiceTrafficStatuses(c *Client, des, nw *ServiceTrafficStatuses) *ServiceTrafficStatuses { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for ServiceTrafficStatuses while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Revision, nw.Revision) { nw.Revision = des.Revision } if dcl.StringCanonicalize(des.Tag, nw.Tag) { nw.Tag = des.Tag } if dcl.StringCanonicalize(des.Uri, nw.Uri) { nw.Uri = des.Uri } return nw } func canonicalizeNewServiceTrafficStatusesSet(c *Client, des, nw []ServiceTrafficStatuses) []ServiceTrafficStatuses { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []ServiceTrafficStatuses for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareServiceTrafficStatusesNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewServiceTrafficStatuses(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewServiceTrafficStatusesSlice(c *Client, des, nw []ServiceTrafficStatuses) []ServiceTrafficStatuses { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []ServiceTrafficStatuses for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewServiceTrafficStatuses(c, &d, &n)) } return items } // The differ returns a list of diffs, along with a list of operations that should be taken // to remedy them. Right now, it does not attempt to consolidate operations - if several // fields can be fixed with a patch update, it will perform the patch several times. // Diffs on some fields will be ignored if the `desired` state has an empty (nil) // value. This empty value indicates that the user does not care about the state for // the field. Empty fields on the actual object will cause diffs. // TODO(magic-modules-eng): for efficiency in some resources, add batching. func diffService(c *Client, desired, actual *Service, opts ...dcl.ApplyOption) ([]*dcl.FieldDiff, error) { if desired == nil || actual == nil { return nil, fmt.Errorf("nil resource passed to diff - always a programming error: %#v, %#v", desired, actual) } c.Config.Logger.Infof("Diff function called with desired state: %v", desired) c.Config.Logger.Infof("Diff function called with actual state: %v", actual) var fn dcl.FieldName var newDiffs []*dcl.FieldDiff // New style diffs. if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Description, actual.Description, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Description")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Uid, actual.Uid, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Uid")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Generation, actual.Generation, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Generation")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Labels, actual.Labels, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Labels")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Annotations, actual.Annotations, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Annotations")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.CreateTime, actual.CreateTime, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("CreateTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.UpdateTime, actual.UpdateTime, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("UpdateTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.DeleteTime, actual.DeleteTime, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("DeleteTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.ExpireTime, actual.ExpireTime, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("ExpireTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Creator, actual.Creator, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Creator")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.LastModifier, actual.LastModifier, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("LastModifier")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Client, actual.Client, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Client")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.ClientVersion, actual.ClientVersion, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("ClientVersion")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Ingress, actual.Ingress, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Ingress")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.LaunchStage, actual.LaunchStage, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("LaunchStage")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.BinaryAuthorization, actual.BinaryAuthorization, dcl.DiffInfo{ObjectFunction: compareServiceBinaryAuthorizationNewStyle, EmptyObject: EmptyServiceBinaryAuthorization, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("BinaryAuthorization")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Template, actual.Template, dcl.DiffInfo{ObjectFunction: compareServiceTemplateNewStyle, EmptyObject: EmptyServiceTemplate, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Template")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Traffic, actual.Traffic, dcl.DiffInfo{ObjectFunction: compareServiceTrafficNewStyle, EmptyObject: EmptyServiceTraffic, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Traffic")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.TerminalCondition, actual.TerminalCondition, dcl.DiffInfo{OutputOnly: true, ObjectFunction: compareServiceTerminalConditionNewStyle, EmptyObject: EmptyServiceTerminalCondition, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("TerminalCondition")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.LatestReadyRevision, actual.LatestReadyRevision, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("LatestReadyRevision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.LatestCreatedRevision, actual.LatestCreatedRevision, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("LatestCreatedRevision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.TrafficStatuses, actual.TrafficStatuses, dcl.DiffInfo{OutputOnly: true, ObjectFunction: compareServiceTrafficStatusesNewStyle, EmptyObject: EmptyServiceTrafficStatuses, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("TrafficStatuses")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Uri, actual.Uri, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Uri")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Reconciling, actual.Reconciling, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Reconciling")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Etag, actual.Etag, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Etag")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Project, actual.Project, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Project")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Location, actual.Location, dcl.DiffInfo{OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Location")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if len(newDiffs) > 0 { c.Config.Logger.Infof("Diff function found diffs: %v", newDiffs) } return newDiffs, nil } func compareServiceBinaryAuthorizationNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceBinaryAuthorization) if !ok { desiredNotPointer, ok := d.(ServiceBinaryAuthorization) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceBinaryAuthorization or *ServiceBinaryAuthorization", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceBinaryAuthorization) if !ok { actualNotPointer, ok := a.(ServiceBinaryAuthorization) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceBinaryAuthorization", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.UseDefault, actual.UseDefault, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("UseDefault")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.BreakglassJustification, actual.BreakglassJustification, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("BreakglassJustification")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplate) if !ok { desiredNotPointer, ok := d.(ServiceTemplate) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplate or *ServiceTemplate", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplate) if !ok { actualNotPointer, ok := a.(ServiceTemplate) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplate", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Revision, actual.Revision, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Revision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Labels, actual.Labels, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Labels")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Annotations, actual.Annotations, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Annotations")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Scaling, actual.Scaling, dcl.DiffInfo{ObjectFunction: compareServiceTemplateScalingNewStyle, EmptyObject: EmptyServiceTemplateScaling, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Scaling")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.VPCAccess, actual.VPCAccess, dcl.DiffInfo{ObjectFunction: compareServiceTemplateVPCAccessNewStyle, EmptyObject: EmptyServiceTemplateVPCAccess, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("VpcAccess")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ContainerConcurrency, actual.ContainerConcurrency, dcl.DiffInfo{ServerDefault: true, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("MaxInstanceRequestConcurrency")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Timeout, actual.Timeout, dcl.DiffInfo{ServerDefault: true, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Timeout")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ServiceAccount, actual.ServiceAccount, dcl.DiffInfo{ServerDefault: true, Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("ServiceAccount")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Containers, actual.Containers, dcl.DiffInfo{ObjectFunction: compareServiceTemplateContainersNewStyle, EmptyObject: EmptyServiceTemplateContainers, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Containers")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Volumes, actual.Volumes, dcl.DiffInfo{ObjectFunction: compareServiceTemplateVolumesNewStyle, EmptyObject: EmptyServiceTemplateVolumes, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Volumes")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ExecutionEnvironment, actual.ExecutionEnvironment, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("ExecutionEnvironment")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateScalingNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateScaling) if !ok { desiredNotPointer, ok := d.(ServiceTemplateScaling) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateScaling or *ServiceTemplateScaling", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateScaling) if !ok { actualNotPointer, ok := a.(ServiceTemplateScaling) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateScaling", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.MinInstanceCount, actual.MinInstanceCount, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("MinInstanceCount")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.MaxInstanceCount, actual.MaxInstanceCount, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("MaxInstanceCount")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateVPCAccessNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateVPCAccess) if !ok { desiredNotPointer, ok := d.(ServiceTemplateVPCAccess) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVPCAccess or *ServiceTemplateVPCAccess", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateVPCAccess) if !ok { actualNotPointer, ok := a.(ServiceTemplateVPCAccess) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVPCAccess", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Connector, actual.Connector, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Connector")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Egress, actual.Egress, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Egress")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateContainersNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateContainers) if !ok { desiredNotPointer, ok := d.(ServiceTemplateContainers) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainers or *ServiceTemplateContainers", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateContainers) if !ok { actualNotPointer, ok := a.(ServiceTemplateContainers) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainers", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Image, actual.Image, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Image")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Command, actual.Command, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Command")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Args, actual.Args, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Args")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Env, actual.Env, dcl.DiffInfo{ObjectFunction: compareServiceTemplateContainersEnvNewStyle, EmptyObject: EmptyServiceTemplateContainersEnv, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Env")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Resources, actual.Resources, dcl.DiffInfo{ServerDefault: true, ObjectFunction: compareServiceTemplateContainersResourcesNewStyle, EmptyObject: EmptyServiceTemplateContainersResources, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Resources")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Ports, actual.Ports, dcl.DiffInfo{ServerDefault: true, ObjectFunction: compareServiceTemplateContainersPortsNewStyle, EmptyObject: EmptyServiceTemplateContainersPorts, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Ports")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.VolumeMounts, actual.VolumeMounts, dcl.DiffInfo{ObjectFunction: compareServiceTemplateContainersVolumeMountsNewStyle, EmptyObject: EmptyServiceTemplateContainersVolumeMounts, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("VolumeMounts")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateContainersEnvNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateContainersEnv) if !ok { desiredNotPointer, ok := d.(ServiceTemplateContainersEnv) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersEnv or *ServiceTemplateContainersEnv", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateContainersEnv) if !ok { actualNotPointer, ok := a.(ServiceTemplateContainersEnv) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersEnv", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Value, actual.Value, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Value")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ValueSource, actual.ValueSource, dcl.DiffInfo{ObjectFunction: compareServiceTemplateContainersEnvValueSourceNewStyle, EmptyObject: EmptyServiceTemplateContainersEnvValueSource, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("ValueSource")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateContainersEnvValueSourceNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateContainersEnvValueSource) if !ok { desiredNotPointer, ok := d.(ServiceTemplateContainersEnvValueSource) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersEnvValueSource or *ServiceTemplateContainersEnvValueSource", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateContainersEnvValueSource) if !ok { actualNotPointer, ok := a.(ServiceTemplateContainersEnvValueSource) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersEnvValueSource", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.SecretKeyRef, actual.SecretKeyRef, dcl.DiffInfo{ObjectFunction: compareServiceTemplateContainersEnvValueSourceSecretKeyRefNewStyle, EmptyObject: EmptyServiceTemplateContainersEnvValueSourceSecretKeyRef, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("SecretKeyRef")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateContainersEnvValueSourceSecretKeyRefNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateContainersEnvValueSourceSecretKeyRef) if !ok { desiredNotPointer, ok := d.(ServiceTemplateContainersEnvValueSourceSecretKeyRef) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersEnvValueSourceSecretKeyRef or *ServiceTemplateContainersEnvValueSourceSecretKeyRef", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateContainersEnvValueSourceSecretKeyRef) if !ok { actualNotPointer, ok := a.(ServiceTemplateContainersEnvValueSourceSecretKeyRef) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersEnvValueSourceSecretKeyRef", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Secret, actual.Secret, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Secret")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Version, actual.Version, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Version")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateContainersResourcesNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateContainersResources) if !ok { desiredNotPointer, ok := d.(ServiceTemplateContainersResources) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersResources or *ServiceTemplateContainersResources", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateContainersResources) if !ok { actualNotPointer, ok := a.(ServiceTemplateContainersResources) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersResources", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Limits, actual.Limits, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Limits")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.CpuIdle, actual.CpuIdle, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("CpuIdle")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateContainersPortsNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateContainersPorts) if !ok { desiredNotPointer, ok := d.(ServiceTemplateContainersPorts) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersPorts or *ServiceTemplateContainersPorts", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateContainersPorts) if !ok { actualNotPointer, ok := a.(ServiceTemplateContainersPorts) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersPorts", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ContainerPort, actual.ContainerPort, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("ContainerPort")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateContainersVolumeMountsNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateContainersVolumeMounts) if !ok { desiredNotPointer, ok := d.(ServiceTemplateContainersVolumeMounts) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersVolumeMounts or *ServiceTemplateContainersVolumeMounts", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateContainersVolumeMounts) if !ok { actualNotPointer, ok := a.(ServiceTemplateContainersVolumeMounts) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateContainersVolumeMounts", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.MountPath, actual.MountPath, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("MountPath")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateVolumesNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateVolumes) if !ok { desiredNotPointer, ok := d.(ServiceTemplateVolumes) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumes or *ServiceTemplateVolumes", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateVolumes) if !ok { actualNotPointer, ok := a.(ServiceTemplateVolumes) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumes", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Secret, actual.Secret, dcl.DiffInfo{ObjectFunction: compareServiceTemplateVolumesSecretNewStyle, EmptyObject: EmptyServiceTemplateVolumesSecret, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Secret")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.CloudSqlInstance, actual.CloudSqlInstance, dcl.DiffInfo{ObjectFunction: compareServiceTemplateVolumesCloudSqlInstanceNewStyle, EmptyObject: EmptyServiceTemplateVolumesCloudSqlInstance, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("CloudSqlInstance")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateVolumesSecretNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateVolumesSecret) if !ok { desiredNotPointer, ok := d.(ServiceTemplateVolumesSecret) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumesSecret or *ServiceTemplateVolumesSecret", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateVolumesSecret) if !ok { actualNotPointer, ok := a.(ServiceTemplateVolumesSecret) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumesSecret", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Secret, actual.Secret, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Secret")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Items, actual.Items, dcl.DiffInfo{ObjectFunction: compareServiceTemplateVolumesSecretItemsNewStyle, EmptyObject: EmptyServiceTemplateVolumesSecretItems, OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Items")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.DefaultMode, actual.DefaultMode, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("DefaultMode")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateVolumesSecretItemsNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateVolumesSecretItems) if !ok { desiredNotPointer, ok := d.(ServiceTemplateVolumesSecretItems) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumesSecretItems or *ServiceTemplateVolumesSecretItems", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateVolumesSecretItems) if !ok { actualNotPointer, ok := a.(ServiceTemplateVolumesSecretItems) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumesSecretItems", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Path, actual.Path, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Path")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Version, actual.Version, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Version")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Mode, actual.Mode, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Mode")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTemplateVolumesCloudSqlInstanceNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTemplateVolumesCloudSqlInstance) if !ok { desiredNotPointer, ok := d.(ServiceTemplateVolumesCloudSqlInstance) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumesCloudSqlInstance or *ServiceTemplateVolumesCloudSqlInstance", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTemplateVolumesCloudSqlInstance) if !ok { actualNotPointer, ok := a.(ServiceTemplateVolumesCloudSqlInstance) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTemplateVolumesCloudSqlInstance", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Instances, actual.Instances, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Instances")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTrafficNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTraffic) if !ok { desiredNotPointer, ok := d.(ServiceTraffic) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTraffic or *ServiceTraffic", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTraffic) if !ok { actualNotPointer, ok := a.(ServiceTraffic) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTraffic", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Type, actual.Type, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Type")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Revision, actual.Revision, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Revision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Percent, actual.Percent, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Percent")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Tag, actual.Tag, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Tag")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTerminalConditionNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTerminalCondition) if !ok { desiredNotPointer, ok := d.(ServiceTerminalCondition) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTerminalCondition or *ServiceTerminalCondition", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTerminalCondition) if !ok { actualNotPointer, ok := a.(ServiceTerminalCondition) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTerminalCondition", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Type, actual.Type, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Type")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.State, actual.State, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("State")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Message, actual.Message, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Message")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.LastTransitionTime, actual.LastTransitionTime, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("LastTransitionTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Severity, actual.Severity, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Severity")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Reason, actual.Reason, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Reason")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.RevisionReason, actual.RevisionReason, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("RevisionReason")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.JobReason, actual.JobReason, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("JobReason")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareServiceTrafficStatusesNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*ServiceTrafficStatuses) if !ok { desiredNotPointer, ok := d.(ServiceTrafficStatuses) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTrafficStatuses or *ServiceTrafficStatuses", d) } desired = &desiredNotPointer } actual, ok := a.(*ServiceTrafficStatuses) if !ok { actualNotPointer, ok := a.(ServiceTrafficStatuses) if !ok { return nil, fmt.Errorf("obj %v is not a ServiceTrafficStatuses", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Type, actual.Type, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Type")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Revision, actual.Revision, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Revision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Percent, actual.Percent, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Percent")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Tag, actual.Tag, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Tag")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Uri, actual.Uri, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateServiceUpdateServiceOperation")}, fn.AddNest("Uri")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } // urlNormalized returns a copy of the resource struct with values normalized // for URL substitutions. For instance, it converts long-form self-links to // short-form so they can be substituted in. func (r *Service) urlNormalized() *Service { normalized := dcl.Copy(*r).(Service) normalized.Name = dcl.SelfLinkToName(r.Name) normalized.Description = dcl.SelfLinkToName(r.Description) normalized.Uid = dcl.SelfLinkToName(r.Uid) normalized.Creator = dcl.SelfLinkToName(r.Creator) normalized.LastModifier = dcl.SelfLinkToName(r.LastModifier) normalized.Client = dcl.SelfLinkToName(r.Client) normalized.ClientVersion = dcl.SelfLinkToName(r.ClientVersion) normalized.LatestReadyRevision = dcl.SelfLinkToName(r.LatestReadyRevision) normalized.LatestCreatedRevision = dcl.SelfLinkToName(r.LatestCreatedRevision) normalized.Uri = dcl.SelfLinkToName(r.Uri) normalized.Etag = dcl.SelfLinkToName(r.Etag) normalized.Project = dcl.SelfLinkToName(r.Project) normalized.Location = dcl.SelfLinkToName(r.Location) return &normalized } func (r *Service) updateURL(userBasePath, updateName string) (string, error) { nr := r.urlNormalized() if updateName == "UpdateService" { fields := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "location": dcl.ValueOrEmptyString(nr.Location), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/locations/{{location}}/services/{{name}}", nr.basePath(), userBasePath, fields), nil } return "", fmt.Errorf("unknown update name: %s", updateName) } // marshal encodes the Service resource into JSON for a Create request, and // performs transformations from the resource schema to the API schema if // necessary. func (r *Service) marshal(c *Client) ([]byte, error) { m, err := expandService(c, r) if err != nil { return nil, fmt.Errorf("error marshalling Service: %w", err) } m = EncodeServiceCreateRequest(m) return json.Marshal(m) } // unmarshalService decodes JSON responses into the Service resource schema. func unmarshalService(b []byte, c *Client, res *Service) (*Service, error) { var m map[string]interface{} if err := json.Unmarshal(b, &m); err != nil { return nil, err } return unmarshalMapService(m, c, res) } func unmarshalMapService(m map[string]interface{}, c *Client, res *Service) (*Service, error) { flattened := flattenService(c, m, res) if flattened == nil { return nil, fmt.Errorf("attempted to flatten empty json object") } return flattened, nil } // expandService expands Service into a JSON request object. func expandService(c *Client, f *Service) (map[string]interface{}, error) { m := make(map[string]interface{}) res := f _ = res if v, err := dcl.DeriveField("projects/%s/locations/%s/services/%s", f.Name, dcl.SelfLinkToName(f.Project), dcl.SelfLinkToName(f.Location), dcl.SelfLinkToName(f.Name)); err != nil { return nil, fmt.Errorf("error expanding Name into name: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Description; dcl.ValueShouldBeSent(v) { m["description"] = v } if v := f.Annotations; dcl.ValueShouldBeSent(v) { m["annotations"] = v } if v := f.Client; dcl.ValueShouldBeSent(v) { m["client"] = v } if v := f.ClientVersion; dcl.ValueShouldBeSent(v) { m["clientVersion"] = v } if v := f.Ingress; dcl.ValueShouldBeSent(v) { m["ingress"] = v } if v := f.LaunchStage; dcl.ValueShouldBeSent(v) { m["launchStage"] = v } if v, err := expandServiceBinaryAuthorization(c, f.BinaryAuthorization, res); err != nil { return nil, fmt.Errorf("error expanding BinaryAuthorization into binaryAuthorization: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["binaryAuthorization"] = v } if v, err := expandServiceTemplate(c, f.Template, res); err != nil { return nil, fmt.Errorf("error expanding Template into template: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["template"] = v } if v, err := expandServiceTrafficSlice(c, f.Traffic, res); err != nil { return nil, fmt.Errorf("error expanding Traffic into traffic: %w", err) } else if v != nil { m["traffic"] = v } if v, err := dcl.EmptyValue(); err != nil { return nil, fmt.Errorf("error expanding Project into project: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["project"] = v } if v, err := dcl.EmptyValue(); err != nil { return nil, fmt.Errorf("error expanding Location into location: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["location"] = v } return m, nil } // flattenService flattens Service from a JSON request object into the // Service type. func flattenService(c *Client, i interface{}, res *Service) *Service { m, ok := i.(map[string]interface{}) if !ok { return nil } if len(m) == 0 { return nil } resultRes := &Service{} resultRes.Name = dcl.FlattenString(m["name"]) resultRes.Description = dcl.FlattenString(m["description"]) resultRes.Uid = dcl.FlattenString(m["uid"]) resultRes.Generation = dcl.FlattenInteger(m["generation"]) resultRes.Labels = dcl.FlattenKeyValuePairs(m["labels"]) resultRes.Annotations = dcl.FlattenKeyValuePairs(m["annotations"]) resultRes.CreateTime = dcl.FlattenString(m["createTime"]) resultRes.UpdateTime = dcl.FlattenString(m["updateTime"]) resultRes.DeleteTime = dcl.FlattenString(m["deleteTime"]) resultRes.ExpireTime = dcl.FlattenString(m["expireTime"]) resultRes.Creator = dcl.FlattenString(m["creator"]) resultRes.LastModifier = dcl.FlattenString(m["lastModifier"]) resultRes.Client = dcl.FlattenString(m["client"]) resultRes.ClientVersion = dcl.FlattenString(m["clientVersion"]) resultRes.Ingress = flattenServiceIngressEnum(m["ingress"]) resultRes.LaunchStage = flattenServiceLaunchStageEnum(m["launchStage"]) resultRes.BinaryAuthorization = flattenServiceBinaryAuthorization(c, m["binaryAuthorization"], res) resultRes.Template = flattenServiceTemplate(c, m["template"], res) resultRes.Traffic = flattenServiceTrafficSlice(c, m["traffic"], res) resultRes.TerminalCondition = flattenServiceTerminalCondition(c, m["terminalCondition"], res) resultRes.LatestReadyRevision = dcl.FlattenString(m["latestReadyRevision"]) resultRes.LatestCreatedRevision = dcl.FlattenString(m["latestCreatedRevision"]) resultRes.TrafficStatuses = flattenServiceTrafficStatusesSlice(c, m["trafficStatuses"], res) resultRes.Uri = dcl.FlattenString(m["uri"]) resultRes.Reconciling = dcl.FlattenBool(m["reconciling"]) resultRes.Etag = dcl.FlattenString(m["etag"]) resultRes.Project = dcl.FlattenString(m["project"]) resultRes.Location = dcl.FlattenString(m["location"]) return resultRes } // expandServiceBinaryAuthorizationMap expands the contents of ServiceBinaryAuthorization into a JSON // request object. func expandServiceBinaryAuthorizationMap(c *Client, f map[string]ServiceBinaryAuthorization, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceBinaryAuthorization(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceBinaryAuthorizationSlice expands the contents of ServiceBinaryAuthorization into a JSON // request object. func expandServiceBinaryAuthorizationSlice(c *Client, f []ServiceBinaryAuthorization, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceBinaryAuthorization(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceBinaryAuthorizationMap flattens the contents of ServiceBinaryAuthorization from a JSON // response object. func flattenServiceBinaryAuthorizationMap(c *Client, i interface{}, res *Service) map[string]ServiceBinaryAuthorization { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceBinaryAuthorization{} } if len(a) == 0 { return map[string]ServiceBinaryAuthorization{} } items := make(map[string]ServiceBinaryAuthorization) for k, item := range a { items[k] = *flattenServiceBinaryAuthorization(c, item.(map[string]interface{}), res) } return items } // flattenServiceBinaryAuthorizationSlice flattens the contents of ServiceBinaryAuthorization from a JSON // response object. func flattenServiceBinaryAuthorizationSlice(c *Client, i interface{}, res *Service) []ServiceBinaryAuthorization { a, ok := i.([]interface{}) if !ok { return []ServiceBinaryAuthorization{} } if len(a) == 0 { return []ServiceBinaryAuthorization{} } items := make([]ServiceBinaryAuthorization, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceBinaryAuthorization(c, item.(map[string]interface{}), res)) } return items } // expandServiceBinaryAuthorization expands an instance of ServiceBinaryAuthorization into a JSON // request object. func expandServiceBinaryAuthorization(c *Client, f *ServiceBinaryAuthorization, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.UseDefault; !dcl.IsEmptyValueIndirect(v) { m["useDefault"] = v } if v := f.BreakglassJustification; !dcl.IsEmptyValueIndirect(v) { m["breakglassJustification"] = v } return m, nil } // flattenServiceBinaryAuthorization flattens an instance of ServiceBinaryAuthorization from a JSON // response object. func flattenServiceBinaryAuthorization(c *Client, i interface{}, res *Service) *ServiceBinaryAuthorization { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceBinaryAuthorization{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceBinaryAuthorization } r.UseDefault = dcl.FlattenBool(m["useDefault"]) r.BreakglassJustification = dcl.FlattenString(m["breakglassJustification"]) return r } // expandServiceTemplateMap expands the contents of ServiceTemplate into a JSON // request object. func expandServiceTemplateMap(c *Client, f map[string]ServiceTemplate, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplate(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateSlice expands the contents of ServiceTemplate into a JSON // request object. func expandServiceTemplateSlice(c *Client, f []ServiceTemplate, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplate(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateMap flattens the contents of ServiceTemplate from a JSON // response object. func flattenServiceTemplateMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplate { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplate{} } if len(a) == 0 { return map[string]ServiceTemplate{} } items := make(map[string]ServiceTemplate) for k, item := range a { items[k] = *flattenServiceTemplate(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateSlice flattens the contents of ServiceTemplate from a JSON // response object. func flattenServiceTemplateSlice(c *Client, i interface{}, res *Service) []ServiceTemplate { a, ok := i.([]interface{}) if !ok { return []ServiceTemplate{} } if len(a) == 0 { return []ServiceTemplate{} } items := make([]ServiceTemplate, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplate(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplate expands an instance of ServiceTemplate into a JSON // request object. func expandServiceTemplate(c *Client, f *ServiceTemplate, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Revision; !dcl.IsEmptyValueIndirect(v) { m["revision"] = v } if v := f.Labels; !dcl.IsEmptyValueIndirect(v) { m["labels"] = v } if v := f.Annotations; !dcl.IsEmptyValueIndirect(v) { m["annotations"] = v } if v, err := expandServiceTemplateScaling(c, f.Scaling, res); err != nil { return nil, fmt.Errorf("error expanding Scaling into scaling: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["scaling"] = v } if v, err := expandServiceTemplateVPCAccess(c, f.VPCAccess, res); err != nil { return nil, fmt.Errorf("error expanding VPCAccess into vpcAccess: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["vpcAccess"] = v } if v := f.ContainerConcurrency; !dcl.IsEmptyValueIndirect(v) { m["maxInstanceRequestConcurrency"] = v } if v := f.Timeout; !dcl.IsEmptyValueIndirect(v) { m["timeout"] = v } if v := f.ServiceAccount; !dcl.IsEmptyValueIndirect(v) { m["serviceAccount"] = v } if v, err := expandServiceTemplateContainersSlice(c, f.Containers, res); err != nil { return nil, fmt.Errorf("error expanding Containers into containers: %w", err) } else if v != nil { m["containers"] = v } if v, err := expandServiceTemplateVolumesSlice(c, f.Volumes, res); err != nil { return nil, fmt.Errorf("error expanding Volumes into volumes: %w", err) } else if v != nil { m["volumes"] = v } if v := f.ExecutionEnvironment; !dcl.IsEmptyValueIndirect(v) { m["executionEnvironment"] = v } return m, nil } // flattenServiceTemplate flattens an instance of ServiceTemplate from a JSON // response object. func flattenServiceTemplate(c *Client, i interface{}, res *Service) *ServiceTemplate { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplate{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplate } r.Revision = dcl.FlattenString(m["revision"]) r.Labels = dcl.FlattenKeyValuePairs(m["labels"]) r.Annotations = dcl.FlattenKeyValuePairs(m["annotations"]) r.Scaling = flattenServiceTemplateScaling(c, m["scaling"], res) r.VPCAccess = flattenServiceTemplateVPCAccess(c, m["vpcAccess"], res) r.ContainerConcurrency = dcl.FlattenInteger(m["maxInstanceRequestConcurrency"]) r.Timeout = dcl.FlattenString(m["timeout"]) r.ServiceAccount = dcl.FlattenString(m["serviceAccount"]) r.Containers = flattenServiceTemplateContainersSlice(c, m["containers"], res) r.Volumes = flattenServiceTemplateVolumesSlice(c, m["volumes"], res) r.ExecutionEnvironment = flattenServiceTemplateExecutionEnvironmentEnum(m["executionEnvironment"]) return r } // expandServiceTemplateScalingMap expands the contents of ServiceTemplateScaling into a JSON // request object. func expandServiceTemplateScalingMap(c *Client, f map[string]ServiceTemplateScaling, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateScaling(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateScalingSlice expands the contents of ServiceTemplateScaling into a JSON // request object. func expandServiceTemplateScalingSlice(c *Client, f []ServiceTemplateScaling, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateScaling(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateScalingMap flattens the contents of ServiceTemplateScaling from a JSON // response object. func flattenServiceTemplateScalingMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateScaling { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateScaling{} } if len(a) == 0 { return map[string]ServiceTemplateScaling{} } items := make(map[string]ServiceTemplateScaling) for k, item := range a { items[k] = *flattenServiceTemplateScaling(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateScalingSlice flattens the contents of ServiceTemplateScaling from a JSON // response object. func flattenServiceTemplateScalingSlice(c *Client, i interface{}, res *Service) []ServiceTemplateScaling { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateScaling{} } if len(a) == 0 { return []ServiceTemplateScaling{} } items := make([]ServiceTemplateScaling, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateScaling(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateScaling expands an instance of ServiceTemplateScaling into a JSON // request object. func expandServiceTemplateScaling(c *Client, f *ServiceTemplateScaling, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.MinInstanceCount; !dcl.IsEmptyValueIndirect(v) { m["minInstanceCount"] = v } if v := f.MaxInstanceCount; !dcl.IsEmptyValueIndirect(v) { m["maxInstanceCount"] = v } return m, nil } // flattenServiceTemplateScaling flattens an instance of ServiceTemplateScaling from a JSON // response object. func flattenServiceTemplateScaling(c *Client, i interface{}, res *Service) *ServiceTemplateScaling { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateScaling{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateScaling } r.MinInstanceCount = dcl.FlattenInteger(m["minInstanceCount"]) r.MaxInstanceCount = dcl.FlattenInteger(m["maxInstanceCount"]) return r } // expandServiceTemplateVPCAccessMap expands the contents of ServiceTemplateVPCAccess into a JSON // request object. func expandServiceTemplateVPCAccessMap(c *Client, f map[string]ServiceTemplateVPCAccess, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateVPCAccess(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateVPCAccessSlice expands the contents of ServiceTemplateVPCAccess into a JSON // request object. func expandServiceTemplateVPCAccessSlice(c *Client, f []ServiceTemplateVPCAccess, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateVPCAccess(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateVPCAccessMap flattens the contents of ServiceTemplateVPCAccess from a JSON // response object. func flattenServiceTemplateVPCAccessMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateVPCAccess { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateVPCAccess{} } if len(a) == 0 { return map[string]ServiceTemplateVPCAccess{} } items := make(map[string]ServiceTemplateVPCAccess) for k, item := range a { items[k] = *flattenServiceTemplateVPCAccess(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateVPCAccessSlice flattens the contents of ServiceTemplateVPCAccess from a JSON // response object. func flattenServiceTemplateVPCAccessSlice(c *Client, i interface{}, res *Service) []ServiceTemplateVPCAccess { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateVPCAccess{} } if len(a) == 0 { return []ServiceTemplateVPCAccess{} } items := make([]ServiceTemplateVPCAccess, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateVPCAccess(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateVPCAccess expands an instance of ServiceTemplateVPCAccess into a JSON // request object. func expandServiceTemplateVPCAccess(c *Client, f *ServiceTemplateVPCAccess, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Connector; !dcl.IsEmptyValueIndirect(v) { m["connector"] = v } if v := f.Egress; !dcl.IsEmptyValueIndirect(v) { m["egress"] = v } return m, nil } // flattenServiceTemplateVPCAccess flattens an instance of ServiceTemplateVPCAccess from a JSON // response object. func flattenServiceTemplateVPCAccess(c *Client, i interface{}, res *Service) *ServiceTemplateVPCAccess { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateVPCAccess{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateVPCAccess } r.Connector = dcl.FlattenString(m["connector"]) r.Egress = flattenServiceTemplateVPCAccessEgressEnum(m["egress"]) return r } // expandServiceTemplateContainersMap expands the contents of ServiceTemplateContainers into a JSON // request object. func expandServiceTemplateContainersMap(c *Client, f map[string]ServiceTemplateContainers, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateContainers(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateContainersSlice expands the contents of ServiceTemplateContainers into a JSON // request object. func expandServiceTemplateContainersSlice(c *Client, f []ServiceTemplateContainers, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateContainers(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateContainersMap flattens the contents of ServiceTemplateContainers from a JSON // response object. func flattenServiceTemplateContainersMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateContainers { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateContainers{} } if len(a) == 0 { return map[string]ServiceTemplateContainers{} } items := make(map[string]ServiceTemplateContainers) for k, item := range a { items[k] = *flattenServiceTemplateContainers(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateContainersSlice flattens the contents of ServiceTemplateContainers from a JSON // response object. func flattenServiceTemplateContainersSlice(c *Client, i interface{}, res *Service) []ServiceTemplateContainers { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateContainers{} } if len(a) == 0 { return []ServiceTemplateContainers{} } items := make([]ServiceTemplateContainers, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateContainers(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateContainers expands an instance of ServiceTemplateContainers into a JSON // request object. func expandServiceTemplateContainers(c *Client, f *ServiceTemplateContainers, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Image; !dcl.IsEmptyValueIndirect(v) { m["image"] = v } if v := f.Command; v != nil { m["command"] = v } if v := f.Args; v != nil { m["args"] = v } if v, err := expandServiceTemplateContainersEnvSlice(c, f.Env, res); err != nil { return nil, fmt.Errorf("error expanding Env into env: %w", err) } else if v != nil { m["env"] = v } if v, err := expandServiceTemplateContainersResources(c, f.Resources, res); err != nil { return nil, fmt.Errorf("error expanding Resources into resources: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["resources"] = v } if v, err := expandServiceTemplateContainersPortsSlice(c, f.Ports, res); err != nil { return nil, fmt.Errorf("error expanding Ports into ports: %w", err) } else if v != nil { m["ports"] = v } if v, err := expandServiceTemplateContainersVolumeMountsSlice(c, f.VolumeMounts, res); err != nil { return nil, fmt.Errorf("error expanding VolumeMounts into volumeMounts: %w", err) } else if v != nil { m["volumeMounts"] = v } return m, nil } // flattenServiceTemplateContainers flattens an instance of ServiceTemplateContainers from a JSON // response object. func flattenServiceTemplateContainers(c *Client, i interface{}, res *Service) *ServiceTemplateContainers { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateContainers{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateContainers } r.Name = dcl.FlattenString(m["name"]) r.Image = dcl.FlattenString(m["image"]) r.Command = dcl.FlattenStringSlice(m["command"]) r.Args = dcl.FlattenStringSlice(m["args"]) r.Env = flattenServiceTemplateContainersEnvSlice(c, m["env"], res) r.Resources = flattenServiceTemplateContainersResources(c, m["resources"], res) r.Ports = flattenServiceTemplateContainersPortsSlice(c, m["ports"], res) r.VolumeMounts = flattenServiceTemplateContainersVolumeMountsSlice(c, m["volumeMounts"], res) return r } // expandServiceTemplateContainersEnvMap expands the contents of ServiceTemplateContainersEnv into a JSON // request object. func expandServiceTemplateContainersEnvMap(c *Client, f map[string]ServiceTemplateContainersEnv, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateContainersEnv(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateContainersEnvSlice expands the contents of ServiceTemplateContainersEnv into a JSON // request object. func expandServiceTemplateContainersEnvSlice(c *Client, f []ServiceTemplateContainersEnv, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateContainersEnv(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateContainersEnvMap flattens the contents of ServiceTemplateContainersEnv from a JSON // response object. func flattenServiceTemplateContainersEnvMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateContainersEnv { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateContainersEnv{} } if len(a) == 0 { return map[string]ServiceTemplateContainersEnv{} } items := make(map[string]ServiceTemplateContainersEnv) for k, item := range a { items[k] = *flattenServiceTemplateContainersEnv(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateContainersEnvSlice flattens the contents of ServiceTemplateContainersEnv from a JSON // response object. func flattenServiceTemplateContainersEnvSlice(c *Client, i interface{}, res *Service) []ServiceTemplateContainersEnv { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateContainersEnv{} } if len(a) == 0 { return []ServiceTemplateContainersEnv{} } items := make([]ServiceTemplateContainersEnv, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateContainersEnv(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateContainersEnv expands an instance of ServiceTemplateContainersEnv into a JSON // request object. func expandServiceTemplateContainersEnv(c *Client, f *ServiceTemplateContainersEnv, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Value; !dcl.IsEmptyValueIndirect(v) { m["value"] = v } if v, err := expandServiceTemplateContainersEnvValueSource(c, f.ValueSource, res); err != nil { return nil, fmt.Errorf("error expanding ValueSource into valueSource: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["valueSource"] = v } return m, nil } // flattenServiceTemplateContainersEnv flattens an instance of ServiceTemplateContainersEnv from a JSON // response object. func flattenServiceTemplateContainersEnv(c *Client, i interface{}, res *Service) *ServiceTemplateContainersEnv { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateContainersEnv{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateContainersEnv } r.Name = dcl.FlattenString(m["name"]) r.Value = dcl.FlattenString(m["value"]) r.ValueSource = flattenServiceTemplateContainersEnvValueSource(c, m["valueSource"], res) return r } // expandServiceTemplateContainersEnvValueSourceMap expands the contents of ServiceTemplateContainersEnvValueSource into a JSON // request object. func expandServiceTemplateContainersEnvValueSourceMap(c *Client, f map[string]ServiceTemplateContainersEnvValueSource, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateContainersEnvValueSource(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateContainersEnvValueSourceSlice expands the contents of ServiceTemplateContainersEnvValueSource into a JSON // request object. func expandServiceTemplateContainersEnvValueSourceSlice(c *Client, f []ServiceTemplateContainersEnvValueSource, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateContainersEnvValueSource(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateContainersEnvValueSourceMap flattens the contents of ServiceTemplateContainersEnvValueSource from a JSON // response object. func flattenServiceTemplateContainersEnvValueSourceMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateContainersEnvValueSource { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateContainersEnvValueSource{} } if len(a) == 0 { return map[string]ServiceTemplateContainersEnvValueSource{} } items := make(map[string]ServiceTemplateContainersEnvValueSource) for k, item := range a { items[k] = *flattenServiceTemplateContainersEnvValueSource(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateContainersEnvValueSourceSlice flattens the contents of ServiceTemplateContainersEnvValueSource from a JSON // response object. func flattenServiceTemplateContainersEnvValueSourceSlice(c *Client, i interface{}, res *Service) []ServiceTemplateContainersEnvValueSource { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateContainersEnvValueSource{} } if len(a) == 0 { return []ServiceTemplateContainersEnvValueSource{} } items := make([]ServiceTemplateContainersEnvValueSource, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateContainersEnvValueSource(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateContainersEnvValueSource expands an instance of ServiceTemplateContainersEnvValueSource into a JSON // request object. func expandServiceTemplateContainersEnvValueSource(c *Client, f *ServiceTemplateContainersEnvValueSource, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v, err := expandServiceTemplateContainersEnvValueSourceSecretKeyRef(c, f.SecretKeyRef, res); err != nil { return nil, fmt.Errorf("error expanding SecretKeyRef into secretKeyRef: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["secretKeyRef"] = v } return m, nil } // flattenServiceTemplateContainersEnvValueSource flattens an instance of ServiceTemplateContainersEnvValueSource from a JSON // response object. func flattenServiceTemplateContainersEnvValueSource(c *Client, i interface{}, res *Service) *ServiceTemplateContainersEnvValueSource { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateContainersEnvValueSource{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateContainersEnvValueSource } r.SecretKeyRef = flattenServiceTemplateContainersEnvValueSourceSecretKeyRef(c, m["secretKeyRef"], res) return r } // expandServiceTemplateContainersEnvValueSourceSecretKeyRefMap expands the contents of ServiceTemplateContainersEnvValueSourceSecretKeyRef into a JSON // request object. func expandServiceTemplateContainersEnvValueSourceSecretKeyRefMap(c *Client, f map[string]ServiceTemplateContainersEnvValueSourceSecretKeyRef, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateContainersEnvValueSourceSecretKeyRef(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateContainersEnvValueSourceSecretKeyRefSlice expands the contents of ServiceTemplateContainersEnvValueSourceSecretKeyRef into a JSON // request object. func expandServiceTemplateContainersEnvValueSourceSecretKeyRefSlice(c *Client, f []ServiceTemplateContainersEnvValueSourceSecretKeyRef, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateContainersEnvValueSourceSecretKeyRef(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateContainersEnvValueSourceSecretKeyRefMap flattens the contents of ServiceTemplateContainersEnvValueSourceSecretKeyRef from a JSON // response object. func flattenServiceTemplateContainersEnvValueSourceSecretKeyRefMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateContainersEnvValueSourceSecretKeyRef { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateContainersEnvValueSourceSecretKeyRef{} } if len(a) == 0 { return map[string]ServiceTemplateContainersEnvValueSourceSecretKeyRef{} } items := make(map[string]ServiceTemplateContainersEnvValueSourceSecretKeyRef) for k, item := range a { items[k] = *flattenServiceTemplateContainersEnvValueSourceSecretKeyRef(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateContainersEnvValueSourceSecretKeyRefSlice flattens the contents of ServiceTemplateContainersEnvValueSourceSecretKeyRef from a JSON // response object. func flattenServiceTemplateContainersEnvValueSourceSecretKeyRefSlice(c *Client, i interface{}, res *Service) []ServiceTemplateContainersEnvValueSourceSecretKeyRef { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateContainersEnvValueSourceSecretKeyRef{} } if len(a) == 0 { return []ServiceTemplateContainersEnvValueSourceSecretKeyRef{} } items := make([]ServiceTemplateContainersEnvValueSourceSecretKeyRef, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateContainersEnvValueSourceSecretKeyRef(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateContainersEnvValueSourceSecretKeyRef expands an instance of ServiceTemplateContainersEnvValueSourceSecretKeyRef into a JSON // request object. func expandServiceTemplateContainersEnvValueSourceSecretKeyRef(c *Client, f *ServiceTemplateContainersEnvValueSourceSecretKeyRef, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v, err := dcl.SelfLinkToNameExpander(f.Secret); err != nil { return nil, fmt.Errorf("error expanding Secret into secret: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["secret"] = v } if v, err := dcl.SelfLinkToNameExpander(f.Version); err != nil { return nil, fmt.Errorf("error expanding Version into version: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["version"] = v } return m, nil } // flattenServiceTemplateContainersEnvValueSourceSecretKeyRef flattens an instance of ServiceTemplateContainersEnvValueSourceSecretKeyRef from a JSON // response object. func flattenServiceTemplateContainersEnvValueSourceSecretKeyRef(c *Client, i interface{}, res *Service) *ServiceTemplateContainersEnvValueSourceSecretKeyRef { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateContainersEnvValueSourceSecretKeyRef{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateContainersEnvValueSourceSecretKeyRef } r.Secret = dcl.FlattenString(m["secret"]) r.Version = dcl.FlattenString(m["version"]) return r } // expandServiceTemplateContainersResourcesMap expands the contents of ServiceTemplateContainersResources into a JSON // request object. func expandServiceTemplateContainersResourcesMap(c *Client, f map[string]ServiceTemplateContainersResources, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateContainersResources(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateContainersResourcesSlice expands the contents of ServiceTemplateContainersResources into a JSON // request object. func expandServiceTemplateContainersResourcesSlice(c *Client, f []ServiceTemplateContainersResources, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateContainersResources(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateContainersResourcesMap flattens the contents of ServiceTemplateContainersResources from a JSON // response object. func flattenServiceTemplateContainersResourcesMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateContainersResources { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateContainersResources{} } if len(a) == 0 { return map[string]ServiceTemplateContainersResources{} } items := make(map[string]ServiceTemplateContainersResources) for k, item := range a { items[k] = *flattenServiceTemplateContainersResources(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateContainersResourcesSlice flattens the contents of ServiceTemplateContainersResources from a JSON // response object. func flattenServiceTemplateContainersResourcesSlice(c *Client, i interface{}, res *Service) []ServiceTemplateContainersResources { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateContainersResources{} } if len(a) == 0 { return []ServiceTemplateContainersResources{} } items := make([]ServiceTemplateContainersResources, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateContainersResources(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateContainersResources expands an instance of ServiceTemplateContainersResources into a JSON // request object. func expandServiceTemplateContainersResources(c *Client, f *ServiceTemplateContainersResources, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Limits; !dcl.IsEmptyValueIndirect(v) { m["limits"] = v } if v := f.CpuIdle; !dcl.IsEmptyValueIndirect(v) { m["cpuIdle"] = v } return m, nil } // flattenServiceTemplateContainersResources flattens an instance of ServiceTemplateContainersResources from a JSON // response object. func flattenServiceTemplateContainersResources(c *Client, i interface{}, res *Service) *ServiceTemplateContainersResources { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateContainersResources{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateContainersResources } r.Limits = dcl.FlattenKeyValuePairs(m["limits"]) r.CpuIdle = dcl.FlattenBool(m["cpuIdle"]) return r } // expandServiceTemplateContainersPortsMap expands the contents of ServiceTemplateContainersPorts into a JSON // request object. func expandServiceTemplateContainersPortsMap(c *Client, f map[string]ServiceTemplateContainersPorts, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateContainersPorts(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateContainersPortsSlice expands the contents of ServiceTemplateContainersPorts into a JSON // request object. func expandServiceTemplateContainersPortsSlice(c *Client, f []ServiceTemplateContainersPorts, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateContainersPorts(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateContainersPortsMap flattens the contents of ServiceTemplateContainersPorts from a JSON // response object. func flattenServiceTemplateContainersPortsMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateContainersPorts { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateContainersPorts{} } if len(a) == 0 { return map[string]ServiceTemplateContainersPorts{} } items := make(map[string]ServiceTemplateContainersPorts) for k, item := range a { items[k] = *flattenServiceTemplateContainersPorts(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateContainersPortsSlice flattens the contents of ServiceTemplateContainersPorts from a JSON // response object. func flattenServiceTemplateContainersPortsSlice(c *Client, i interface{}, res *Service) []ServiceTemplateContainersPorts { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateContainersPorts{} } if len(a) == 0 { return []ServiceTemplateContainersPorts{} } items := make([]ServiceTemplateContainersPorts, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateContainersPorts(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateContainersPorts expands an instance of ServiceTemplateContainersPorts into a JSON // request object. func expandServiceTemplateContainersPorts(c *Client, f *ServiceTemplateContainersPorts, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.ContainerPort; !dcl.IsEmptyValueIndirect(v) { m["containerPort"] = v } return m, nil } // flattenServiceTemplateContainersPorts flattens an instance of ServiceTemplateContainersPorts from a JSON // response object. func flattenServiceTemplateContainersPorts(c *Client, i interface{}, res *Service) *ServiceTemplateContainersPorts { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateContainersPorts{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateContainersPorts } r.Name = dcl.FlattenString(m["name"]) r.ContainerPort = dcl.FlattenInteger(m["containerPort"]) return r } // expandServiceTemplateContainersVolumeMountsMap expands the contents of ServiceTemplateContainersVolumeMounts into a JSON // request object. func expandServiceTemplateContainersVolumeMountsMap(c *Client, f map[string]ServiceTemplateContainersVolumeMounts, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateContainersVolumeMounts(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateContainersVolumeMountsSlice expands the contents of ServiceTemplateContainersVolumeMounts into a JSON // request object. func expandServiceTemplateContainersVolumeMountsSlice(c *Client, f []ServiceTemplateContainersVolumeMounts, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateContainersVolumeMounts(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateContainersVolumeMountsMap flattens the contents of ServiceTemplateContainersVolumeMounts from a JSON // response object. func flattenServiceTemplateContainersVolumeMountsMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateContainersVolumeMounts { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateContainersVolumeMounts{} } if len(a) == 0 { return map[string]ServiceTemplateContainersVolumeMounts{} } items := make(map[string]ServiceTemplateContainersVolumeMounts) for k, item := range a { items[k] = *flattenServiceTemplateContainersVolumeMounts(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateContainersVolumeMountsSlice flattens the contents of ServiceTemplateContainersVolumeMounts from a JSON // response object. func flattenServiceTemplateContainersVolumeMountsSlice(c *Client, i interface{}, res *Service) []ServiceTemplateContainersVolumeMounts { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateContainersVolumeMounts{} } if len(a) == 0 { return []ServiceTemplateContainersVolumeMounts{} } items := make([]ServiceTemplateContainersVolumeMounts, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateContainersVolumeMounts(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateContainersVolumeMounts expands an instance of ServiceTemplateContainersVolumeMounts into a JSON // request object. func expandServiceTemplateContainersVolumeMounts(c *Client, f *ServiceTemplateContainersVolumeMounts, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.MountPath; !dcl.IsEmptyValueIndirect(v) { m["mountPath"] = v } return m, nil } // flattenServiceTemplateContainersVolumeMounts flattens an instance of ServiceTemplateContainersVolumeMounts from a JSON // response object. func flattenServiceTemplateContainersVolumeMounts(c *Client, i interface{}, res *Service) *ServiceTemplateContainersVolumeMounts { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateContainersVolumeMounts{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateContainersVolumeMounts } r.Name = dcl.FlattenString(m["name"]) r.MountPath = dcl.FlattenString(m["mountPath"]) return r } // expandServiceTemplateVolumesMap expands the contents of ServiceTemplateVolumes into a JSON // request object. func expandServiceTemplateVolumesMap(c *Client, f map[string]ServiceTemplateVolumes, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateVolumes(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateVolumesSlice expands the contents of ServiceTemplateVolumes into a JSON // request object. func expandServiceTemplateVolumesSlice(c *Client, f []ServiceTemplateVolumes, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateVolumes(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateVolumesMap flattens the contents of ServiceTemplateVolumes from a JSON // response object. func flattenServiceTemplateVolumesMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateVolumes { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateVolumes{} } if len(a) == 0 { return map[string]ServiceTemplateVolumes{} } items := make(map[string]ServiceTemplateVolumes) for k, item := range a { items[k] = *flattenServiceTemplateVolumes(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateVolumesSlice flattens the contents of ServiceTemplateVolumes from a JSON // response object. func flattenServiceTemplateVolumesSlice(c *Client, i interface{}, res *Service) []ServiceTemplateVolumes { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateVolumes{} } if len(a) == 0 { return []ServiceTemplateVolumes{} } items := make([]ServiceTemplateVolumes, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateVolumes(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateVolumes expands an instance of ServiceTemplateVolumes into a JSON // request object. func expandServiceTemplateVolumes(c *Client, f *ServiceTemplateVolumes, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v, err := expandServiceTemplateVolumesSecret(c, f.Secret, res); err != nil { return nil, fmt.Errorf("error expanding Secret into secret: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["secret"] = v } if v, err := expandServiceTemplateVolumesCloudSqlInstance(c, f.CloudSqlInstance, res); err != nil { return nil, fmt.Errorf("error expanding CloudSqlInstance into cloudSqlInstance: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["cloudSqlInstance"] = v } return m, nil } // flattenServiceTemplateVolumes flattens an instance of ServiceTemplateVolumes from a JSON // response object. func flattenServiceTemplateVolumes(c *Client, i interface{}, res *Service) *ServiceTemplateVolumes { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateVolumes{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateVolumes } r.Name = dcl.FlattenString(m["name"]) r.Secret = flattenServiceTemplateVolumesSecret(c, m["secret"], res) r.CloudSqlInstance = flattenServiceTemplateVolumesCloudSqlInstance(c, m["cloudSqlInstance"], res) return r } // expandServiceTemplateVolumesSecretMap expands the contents of ServiceTemplateVolumesSecret into a JSON // request object. func expandServiceTemplateVolumesSecretMap(c *Client, f map[string]ServiceTemplateVolumesSecret, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateVolumesSecret(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateVolumesSecretSlice expands the contents of ServiceTemplateVolumesSecret into a JSON // request object. func expandServiceTemplateVolumesSecretSlice(c *Client, f []ServiceTemplateVolumesSecret, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateVolumesSecret(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateVolumesSecretMap flattens the contents of ServiceTemplateVolumesSecret from a JSON // response object. func flattenServiceTemplateVolumesSecretMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateVolumesSecret { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateVolumesSecret{} } if len(a) == 0 { return map[string]ServiceTemplateVolumesSecret{} } items := make(map[string]ServiceTemplateVolumesSecret) for k, item := range a { items[k] = *flattenServiceTemplateVolumesSecret(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateVolumesSecretSlice flattens the contents of ServiceTemplateVolumesSecret from a JSON // response object. func flattenServiceTemplateVolumesSecretSlice(c *Client, i interface{}, res *Service) []ServiceTemplateVolumesSecret { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateVolumesSecret{} } if len(a) == 0 { return []ServiceTemplateVolumesSecret{} } items := make([]ServiceTemplateVolumesSecret, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateVolumesSecret(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateVolumesSecret expands an instance of ServiceTemplateVolumesSecret into a JSON // request object. func expandServiceTemplateVolumesSecret(c *Client, f *ServiceTemplateVolumesSecret, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Secret; !dcl.IsEmptyValueIndirect(v) { m["secret"] = v } if v, err := expandServiceTemplateVolumesSecretItemsSlice(c, f.Items, res); err != nil { return nil, fmt.Errorf("error expanding Items into items: %w", err) } else if v != nil { m["items"] = v } if v := f.DefaultMode; !dcl.IsEmptyValueIndirect(v) { m["defaultMode"] = v } return m, nil } // flattenServiceTemplateVolumesSecret flattens an instance of ServiceTemplateVolumesSecret from a JSON // response object. func flattenServiceTemplateVolumesSecret(c *Client, i interface{}, res *Service) *ServiceTemplateVolumesSecret { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateVolumesSecret{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateVolumesSecret } r.Secret = dcl.FlattenString(m["secret"]) r.Items = flattenServiceTemplateVolumesSecretItemsSlice(c, m["items"], res) r.DefaultMode = dcl.FlattenInteger(m["defaultMode"]) return r } // expandServiceTemplateVolumesSecretItemsMap expands the contents of ServiceTemplateVolumesSecretItems into a JSON // request object. func expandServiceTemplateVolumesSecretItemsMap(c *Client, f map[string]ServiceTemplateVolumesSecretItems, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateVolumesSecretItems(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateVolumesSecretItemsSlice expands the contents of ServiceTemplateVolumesSecretItems into a JSON // request object. func expandServiceTemplateVolumesSecretItemsSlice(c *Client, f []ServiceTemplateVolumesSecretItems, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateVolumesSecretItems(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateVolumesSecretItemsMap flattens the contents of ServiceTemplateVolumesSecretItems from a JSON // response object. func flattenServiceTemplateVolumesSecretItemsMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateVolumesSecretItems { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateVolumesSecretItems{} } if len(a) == 0 { return map[string]ServiceTemplateVolumesSecretItems{} } items := make(map[string]ServiceTemplateVolumesSecretItems) for k, item := range a { items[k] = *flattenServiceTemplateVolumesSecretItems(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateVolumesSecretItemsSlice flattens the contents of ServiceTemplateVolumesSecretItems from a JSON // response object. func flattenServiceTemplateVolumesSecretItemsSlice(c *Client, i interface{}, res *Service) []ServiceTemplateVolumesSecretItems { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateVolumesSecretItems{} } if len(a) == 0 { return []ServiceTemplateVolumesSecretItems{} } items := make([]ServiceTemplateVolumesSecretItems, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateVolumesSecretItems(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateVolumesSecretItems expands an instance of ServiceTemplateVolumesSecretItems into a JSON // request object. func expandServiceTemplateVolumesSecretItems(c *Client, f *ServiceTemplateVolumesSecretItems, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Path; !dcl.IsEmptyValueIndirect(v) { m["path"] = v } if v, err := dcl.SelfLinkToNameExpander(f.Version); err != nil { return nil, fmt.Errorf("error expanding Version into version: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["version"] = v } if v := f.Mode; !dcl.IsEmptyValueIndirect(v) { m["mode"] = v } return m, nil } // flattenServiceTemplateVolumesSecretItems flattens an instance of ServiceTemplateVolumesSecretItems from a JSON // response object. func flattenServiceTemplateVolumesSecretItems(c *Client, i interface{}, res *Service) *ServiceTemplateVolumesSecretItems { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateVolumesSecretItems{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateVolumesSecretItems } r.Path = dcl.FlattenString(m["path"]) r.Version = dcl.FlattenString(m["version"]) r.Mode = dcl.FlattenInteger(m["mode"]) return r } // expandServiceTemplateVolumesCloudSqlInstanceMap expands the contents of ServiceTemplateVolumesCloudSqlInstance into a JSON // request object. func expandServiceTemplateVolumesCloudSqlInstanceMap(c *Client, f map[string]ServiceTemplateVolumesCloudSqlInstance, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTemplateVolumesCloudSqlInstance(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTemplateVolumesCloudSqlInstanceSlice expands the contents of ServiceTemplateVolumesCloudSqlInstance into a JSON // request object. func expandServiceTemplateVolumesCloudSqlInstanceSlice(c *Client, f []ServiceTemplateVolumesCloudSqlInstance, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTemplateVolumesCloudSqlInstance(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTemplateVolumesCloudSqlInstanceMap flattens the contents of ServiceTemplateVolumesCloudSqlInstance from a JSON // response object. func flattenServiceTemplateVolumesCloudSqlInstanceMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateVolumesCloudSqlInstance { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateVolumesCloudSqlInstance{} } if len(a) == 0 { return map[string]ServiceTemplateVolumesCloudSqlInstance{} } items := make(map[string]ServiceTemplateVolumesCloudSqlInstance) for k, item := range a { items[k] = *flattenServiceTemplateVolumesCloudSqlInstance(c, item.(map[string]interface{}), res) } return items } // flattenServiceTemplateVolumesCloudSqlInstanceSlice flattens the contents of ServiceTemplateVolumesCloudSqlInstance from a JSON // response object. func flattenServiceTemplateVolumesCloudSqlInstanceSlice(c *Client, i interface{}, res *Service) []ServiceTemplateVolumesCloudSqlInstance { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateVolumesCloudSqlInstance{} } if len(a) == 0 { return []ServiceTemplateVolumesCloudSqlInstance{} } items := make([]ServiceTemplateVolumesCloudSqlInstance, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateVolumesCloudSqlInstance(c, item.(map[string]interface{}), res)) } return items } // expandServiceTemplateVolumesCloudSqlInstance expands an instance of ServiceTemplateVolumesCloudSqlInstance into a JSON // request object. func expandServiceTemplateVolumesCloudSqlInstance(c *Client, f *ServiceTemplateVolumesCloudSqlInstance, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Instances; v != nil { m["instances"] = v } return m, nil } // flattenServiceTemplateVolumesCloudSqlInstance flattens an instance of ServiceTemplateVolumesCloudSqlInstance from a JSON // response object. func flattenServiceTemplateVolumesCloudSqlInstance(c *Client, i interface{}, res *Service) *ServiceTemplateVolumesCloudSqlInstance { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTemplateVolumesCloudSqlInstance{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTemplateVolumesCloudSqlInstance } r.Instances = dcl.FlattenStringSlice(m["instances"]) return r } // expandServiceTrafficMap expands the contents of ServiceTraffic into a JSON // request object. func expandServiceTrafficMap(c *Client, f map[string]ServiceTraffic, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTraffic(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTrafficSlice expands the contents of ServiceTraffic into a JSON // request object. func expandServiceTrafficSlice(c *Client, f []ServiceTraffic, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTraffic(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTrafficMap flattens the contents of ServiceTraffic from a JSON // response object. func flattenServiceTrafficMap(c *Client, i interface{}, res *Service) map[string]ServiceTraffic { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTraffic{} } if len(a) == 0 { return map[string]ServiceTraffic{} } items := make(map[string]ServiceTraffic) for k, item := range a { items[k] = *flattenServiceTraffic(c, item.(map[string]interface{}), res) } return items } // flattenServiceTrafficSlice flattens the contents of ServiceTraffic from a JSON // response object. func flattenServiceTrafficSlice(c *Client, i interface{}, res *Service) []ServiceTraffic { a, ok := i.([]interface{}) if !ok { return []ServiceTraffic{} } if len(a) == 0 { return []ServiceTraffic{} } items := make([]ServiceTraffic, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTraffic(c, item.(map[string]interface{}), res)) } return items } // expandServiceTraffic expands an instance of ServiceTraffic into a JSON // request object. func expandServiceTraffic(c *Client, f *ServiceTraffic, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Type; !dcl.IsEmptyValueIndirect(v) { m["type"] = v } if v := f.Revision; !dcl.IsEmptyValueIndirect(v) { m["revision"] = v } if v := f.Percent; !dcl.IsEmptyValueIndirect(v) { m["percent"] = v } if v := f.Tag; !dcl.IsEmptyValueIndirect(v) { m["tag"] = v } return m, nil } // flattenServiceTraffic flattens an instance of ServiceTraffic from a JSON // response object. func flattenServiceTraffic(c *Client, i interface{}, res *Service) *ServiceTraffic { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTraffic{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTraffic } r.Type = flattenServiceTrafficTypeEnum(m["type"]) r.Revision = dcl.FlattenString(m["revision"]) r.Percent = dcl.FlattenInteger(m["percent"]) r.Tag = dcl.FlattenString(m["tag"]) return r } // expandServiceTerminalConditionMap expands the contents of ServiceTerminalCondition into a JSON // request object. func expandServiceTerminalConditionMap(c *Client, f map[string]ServiceTerminalCondition, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTerminalCondition(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTerminalConditionSlice expands the contents of ServiceTerminalCondition into a JSON // request object. func expandServiceTerminalConditionSlice(c *Client, f []ServiceTerminalCondition, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTerminalCondition(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTerminalConditionMap flattens the contents of ServiceTerminalCondition from a JSON // response object. func flattenServiceTerminalConditionMap(c *Client, i interface{}, res *Service) map[string]ServiceTerminalCondition { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTerminalCondition{} } if len(a) == 0 { return map[string]ServiceTerminalCondition{} } items := make(map[string]ServiceTerminalCondition) for k, item := range a { items[k] = *flattenServiceTerminalCondition(c, item.(map[string]interface{}), res) } return items } // flattenServiceTerminalConditionSlice flattens the contents of ServiceTerminalCondition from a JSON // response object. func flattenServiceTerminalConditionSlice(c *Client, i interface{}, res *Service) []ServiceTerminalCondition { a, ok := i.([]interface{}) if !ok { return []ServiceTerminalCondition{} } if len(a) == 0 { return []ServiceTerminalCondition{} } items := make([]ServiceTerminalCondition, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTerminalCondition(c, item.(map[string]interface{}), res)) } return items } // expandServiceTerminalCondition expands an instance of ServiceTerminalCondition into a JSON // request object. func expandServiceTerminalCondition(c *Client, f *ServiceTerminalCondition, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Type; !dcl.IsEmptyValueIndirect(v) { m["type"] = v } if v := f.State; !dcl.IsEmptyValueIndirect(v) { m["state"] = v } if v := f.Message; !dcl.IsEmptyValueIndirect(v) { m["message"] = v } if v := f.LastTransitionTime; !dcl.IsEmptyValueIndirect(v) { m["lastTransitionTime"] = v } if v := f.Severity; !dcl.IsEmptyValueIndirect(v) { m["severity"] = v } if v := f.Reason; !dcl.IsEmptyValueIndirect(v) { m["reason"] = v } if v := f.RevisionReason; !dcl.IsEmptyValueIndirect(v) { m["revisionReason"] = v } if v := f.JobReason; !dcl.IsEmptyValueIndirect(v) { m["jobReason"] = v } return m, nil } // flattenServiceTerminalCondition flattens an instance of ServiceTerminalCondition from a JSON // response object. func flattenServiceTerminalCondition(c *Client, i interface{}, res *Service) *ServiceTerminalCondition { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTerminalCondition{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTerminalCondition } r.Type = dcl.FlattenString(m["type"]) r.State = flattenServiceTerminalConditionStateEnum(m["state"]) r.Message = dcl.FlattenString(m["message"]) r.LastTransitionTime = dcl.FlattenString(m["lastTransitionTime"]) r.Severity = flattenServiceTerminalConditionSeverityEnum(m["severity"]) r.Reason = flattenServiceTerminalConditionReasonEnum(m["reason"]) r.RevisionReason = flattenServiceTerminalConditionRevisionReasonEnum(m["revisionReason"]) r.JobReason = flattenServiceTerminalConditionJobReasonEnum(m["jobReason"]) return r } // expandServiceTrafficStatusesMap expands the contents of ServiceTrafficStatuses into a JSON // request object. func expandServiceTrafficStatusesMap(c *Client, f map[string]ServiceTrafficStatuses, res *Service) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandServiceTrafficStatuses(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandServiceTrafficStatusesSlice expands the contents of ServiceTrafficStatuses into a JSON // request object. func expandServiceTrafficStatusesSlice(c *Client, f []ServiceTrafficStatuses, res *Service) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandServiceTrafficStatuses(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenServiceTrafficStatusesMap flattens the contents of ServiceTrafficStatuses from a JSON // response object. func flattenServiceTrafficStatusesMap(c *Client, i interface{}, res *Service) map[string]ServiceTrafficStatuses { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTrafficStatuses{} } if len(a) == 0 { return map[string]ServiceTrafficStatuses{} } items := make(map[string]ServiceTrafficStatuses) for k, item := range a { items[k] = *flattenServiceTrafficStatuses(c, item.(map[string]interface{}), res) } return items } // flattenServiceTrafficStatusesSlice flattens the contents of ServiceTrafficStatuses from a JSON // response object. func flattenServiceTrafficStatusesSlice(c *Client, i interface{}, res *Service) []ServiceTrafficStatuses { a, ok := i.([]interface{}) if !ok { return []ServiceTrafficStatuses{} } if len(a) == 0 { return []ServiceTrafficStatuses{} } items := make([]ServiceTrafficStatuses, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTrafficStatuses(c, item.(map[string]interface{}), res)) } return items } // expandServiceTrafficStatuses expands an instance of ServiceTrafficStatuses into a JSON // request object. func expandServiceTrafficStatuses(c *Client, f *ServiceTrafficStatuses, res *Service) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Type; !dcl.IsEmptyValueIndirect(v) { m["type"] = v } if v := f.Revision; !dcl.IsEmptyValueIndirect(v) { m["revision"] = v } if v := f.Percent; !dcl.IsEmptyValueIndirect(v) { m["percent"] = v } if v := f.Tag; !dcl.IsEmptyValueIndirect(v) { m["tag"] = v } if v := f.Uri; !dcl.IsEmptyValueIndirect(v) { m["uri"] = v } return m, nil } // flattenServiceTrafficStatuses flattens an instance of ServiceTrafficStatuses from a JSON // response object. func flattenServiceTrafficStatuses(c *Client, i interface{}, res *Service) *ServiceTrafficStatuses { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &ServiceTrafficStatuses{} if dcl.IsEmptyValueIndirect(i) { return EmptyServiceTrafficStatuses } r.Type = flattenServiceTrafficStatusesTypeEnum(m["type"]) r.Revision = dcl.FlattenString(m["revision"]) r.Percent = dcl.FlattenInteger(m["percent"]) r.Tag = dcl.FlattenString(m["tag"]) r.Uri = dcl.FlattenString(m["uri"]) return r } // flattenServiceIngressEnumMap flattens the contents of ServiceIngressEnum from a JSON // response object. func flattenServiceIngressEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceIngressEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceIngressEnum{} } if len(a) == 0 { return map[string]ServiceIngressEnum{} } items := make(map[string]ServiceIngressEnum) for k, item := range a { items[k] = *flattenServiceIngressEnum(item.(interface{})) } return items } // flattenServiceIngressEnumSlice flattens the contents of ServiceIngressEnum from a JSON // response object. func flattenServiceIngressEnumSlice(c *Client, i interface{}, res *Service) []ServiceIngressEnum { a, ok := i.([]interface{}) if !ok { return []ServiceIngressEnum{} } if len(a) == 0 { return []ServiceIngressEnum{} } items := make([]ServiceIngressEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceIngressEnum(item.(interface{}))) } return items } // flattenServiceIngressEnum asserts that an interface is a string, and returns a // pointer to a *ServiceIngressEnum with the same value as that string. func flattenServiceIngressEnum(i interface{}) *ServiceIngressEnum { s, ok := i.(string) if !ok { return nil } return ServiceIngressEnumRef(s) } // flattenServiceLaunchStageEnumMap flattens the contents of ServiceLaunchStageEnum from a JSON // response object. func flattenServiceLaunchStageEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceLaunchStageEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceLaunchStageEnum{} } if len(a) == 0 { return map[string]ServiceLaunchStageEnum{} } items := make(map[string]ServiceLaunchStageEnum) for k, item := range a { items[k] = *flattenServiceLaunchStageEnum(item.(interface{})) } return items } // flattenServiceLaunchStageEnumSlice flattens the contents of ServiceLaunchStageEnum from a JSON // response object. func flattenServiceLaunchStageEnumSlice(c *Client, i interface{}, res *Service) []ServiceLaunchStageEnum { a, ok := i.([]interface{}) if !ok { return []ServiceLaunchStageEnum{} } if len(a) == 0 { return []ServiceLaunchStageEnum{} } items := make([]ServiceLaunchStageEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceLaunchStageEnum(item.(interface{}))) } return items } // flattenServiceLaunchStageEnum asserts that an interface is a string, and returns a // pointer to a *ServiceLaunchStageEnum with the same value as that string. func flattenServiceLaunchStageEnum(i interface{}) *ServiceLaunchStageEnum { s, ok := i.(string) if !ok { return nil } return ServiceLaunchStageEnumRef(s) } // flattenServiceTemplateVPCAccessEgressEnumMap flattens the contents of ServiceTemplateVPCAccessEgressEnum from a JSON // response object. func flattenServiceTemplateVPCAccessEgressEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateVPCAccessEgressEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateVPCAccessEgressEnum{} } if len(a) == 0 { return map[string]ServiceTemplateVPCAccessEgressEnum{} } items := make(map[string]ServiceTemplateVPCAccessEgressEnum) for k, item := range a { items[k] = *flattenServiceTemplateVPCAccessEgressEnum(item.(interface{})) } return items } // flattenServiceTemplateVPCAccessEgressEnumSlice flattens the contents of ServiceTemplateVPCAccessEgressEnum from a JSON // response object. func flattenServiceTemplateVPCAccessEgressEnumSlice(c *Client, i interface{}, res *Service) []ServiceTemplateVPCAccessEgressEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateVPCAccessEgressEnum{} } if len(a) == 0 { return []ServiceTemplateVPCAccessEgressEnum{} } items := make([]ServiceTemplateVPCAccessEgressEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateVPCAccessEgressEnum(item.(interface{}))) } return items } // flattenServiceTemplateVPCAccessEgressEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTemplateVPCAccessEgressEnum with the same value as that string. func flattenServiceTemplateVPCAccessEgressEnum(i interface{}) *ServiceTemplateVPCAccessEgressEnum { s, ok := i.(string) if !ok { return nil } return ServiceTemplateVPCAccessEgressEnumRef(s) } // flattenServiceTemplateExecutionEnvironmentEnumMap flattens the contents of ServiceTemplateExecutionEnvironmentEnum from a JSON // response object. func flattenServiceTemplateExecutionEnvironmentEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTemplateExecutionEnvironmentEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTemplateExecutionEnvironmentEnum{} } if len(a) == 0 { return map[string]ServiceTemplateExecutionEnvironmentEnum{} } items := make(map[string]ServiceTemplateExecutionEnvironmentEnum) for k, item := range a { items[k] = *flattenServiceTemplateExecutionEnvironmentEnum(item.(interface{})) } return items } // flattenServiceTemplateExecutionEnvironmentEnumSlice flattens the contents of ServiceTemplateExecutionEnvironmentEnum from a JSON // response object. func flattenServiceTemplateExecutionEnvironmentEnumSlice(c *Client, i interface{}, res *Service) []ServiceTemplateExecutionEnvironmentEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTemplateExecutionEnvironmentEnum{} } if len(a) == 0 { return []ServiceTemplateExecutionEnvironmentEnum{} } items := make([]ServiceTemplateExecutionEnvironmentEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTemplateExecutionEnvironmentEnum(item.(interface{}))) } return items } // flattenServiceTemplateExecutionEnvironmentEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTemplateExecutionEnvironmentEnum with the same value as that string. func flattenServiceTemplateExecutionEnvironmentEnum(i interface{}) *ServiceTemplateExecutionEnvironmentEnum { s, ok := i.(string) if !ok { return nil } return ServiceTemplateExecutionEnvironmentEnumRef(s) } // flattenServiceTrafficTypeEnumMap flattens the contents of ServiceTrafficTypeEnum from a JSON // response object. func flattenServiceTrafficTypeEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTrafficTypeEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTrafficTypeEnum{} } if len(a) == 0 { return map[string]ServiceTrafficTypeEnum{} } items := make(map[string]ServiceTrafficTypeEnum) for k, item := range a { items[k] = *flattenServiceTrafficTypeEnum(item.(interface{})) } return items } // flattenServiceTrafficTypeEnumSlice flattens the contents of ServiceTrafficTypeEnum from a JSON // response object. func flattenServiceTrafficTypeEnumSlice(c *Client, i interface{}, res *Service) []ServiceTrafficTypeEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTrafficTypeEnum{} } if len(a) == 0 { return []ServiceTrafficTypeEnum{} } items := make([]ServiceTrafficTypeEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTrafficTypeEnum(item.(interface{}))) } return items } // flattenServiceTrafficTypeEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTrafficTypeEnum with the same value as that string. func flattenServiceTrafficTypeEnum(i interface{}) *ServiceTrafficTypeEnum { s, ok := i.(string) if !ok { return nil } return ServiceTrafficTypeEnumRef(s) } // flattenServiceTerminalConditionStateEnumMap flattens the contents of ServiceTerminalConditionStateEnum from a JSON // response object. func flattenServiceTerminalConditionStateEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTerminalConditionStateEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTerminalConditionStateEnum{} } if len(a) == 0 { return map[string]ServiceTerminalConditionStateEnum{} } items := make(map[string]ServiceTerminalConditionStateEnum) for k, item := range a { items[k] = *flattenServiceTerminalConditionStateEnum(item.(interface{})) } return items } // flattenServiceTerminalConditionStateEnumSlice flattens the contents of ServiceTerminalConditionStateEnum from a JSON // response object. func flattenServiceTerminalConditionStateEnumSlice(c *Client, i interface{}, res *Service) []ServiceTerminalConditionStateEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTerminalConditionStateEnum{} } if len(a) == 0 { return []ServiceTerminalConditionStateEnum{} } items := make([]ServiceTerminalConditionStateEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTerminalConditionStateEnum(item.(interface{}))) } return items } // flattenServiceTerminalConditionStateEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTerminalConditionStateEnum with the same value as that string. func flattenServiceTerminalConditionStateEnum(i interface{}) *ServiceTerminalConditionStateEnum { s, ok := i.(string) if !ok { return nil } return ServiceTerminalConditionStateEnumRef(s) } // flattenServiceTerminalConditionSeverityEnumMap flattens the contents of ServiceTerminalConditionSeverityEnum from a JSON // response object. func flattenServiceTerminalConditionSeverityEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTerminalConditionSeverityEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTerminalConditionSeverityEnum{} } if len(a) == 0 { return map[string]ServiceTerminalConditionSeverityEnum{} } items := make(map[string]ServiceTerminalConditionSeverityEnum) for k, item := range a { items[k] = *flattenServiceTerminalConditionSeverityEnum(item.(interface{})) } return items } // flattenServiceTerminalConditionSeverityEnumSlice flattens the contents of ServiceTerminalConditionSeverityEnum from a JSON // response object. func flattenServiceTerminalConditionSeverityEnumSlice(c *Client, i interface{}, res *Service) []ServiceTerminalConditionSeverityEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTerminalConditionSeverityEnum{} } if len(a) == 0 { return []ServiceTerminalConditionSeverityEnum{} } items := make([]ServiceTerminalConditionSeverityEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTerminalConditionSeverityEnum(item.(interface{}))) } return items } // flattenServiceTerminalConditionSeverityEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTerminalConditionSeverityEnum with the same value as that string. func flattenServiceTerminalConditionSeverityEnum(i interface{}) *ServiceTerminalConditionSeverityEnum { s, ok := i.(string) if !ok { return nil } return ServiceTerminalConditionSeverityEnumRef(s) } // flattenServiceTerminalConditionReasonEnumMap flattens the contents of ServiceTerminalConditionReasonEnum from a JSON // response object. func flattenServiceTerminalConditionReasonEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTerminalConditionReasonEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTerminalConditionReasonEnum{} } if len(a) == 0 { return map[string]ServiceTerminalConditionReasonEnum{} } items := make(map[string]ServiceTerminalConditionReasonEnum) for k, item := range a { items[k] = *flattenServiceTerminalConditionReasonEnum(item.(interface{})) } return items } // flattenServiceTerminalConditionReasonEnumSlice flattens the contents of ServiceTerminalConditionReasonEnum from a JSON // response object. func flattenServiceTerminalConditionReasonEnumSlice(c *Client, i interface{}, res *Service) []ServiceTerminalConditionReasonEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTerminalConditionReasonEnum{} } if len(a) == 0 { return []ServiceTerminalConditionReasonEnum{} } items := make([]ServiceTerminalConditionReasonEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTerminalConditionReasonEnum(item.(interface{}))) } return items } // flattenServiceTerminalConditionReasonEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTerminalConditionReasonEnum with the same value as that string. func flattenServiceTerminalConditionReasonEnum(i interface{}) *ServiceTerminalConditionReasonEnum { s, ok := i.(string) if !ok { return nil } return ServiceTerminalConditionReasonEnumRef(s) } // flattenServiceTerminalConditionRevisionReasonEnumMap flattens the contents of ServiceTerminalConditionRevisionReasonEnum from a JSON // response object. func flattenServiceTerminalConditionRevisionReasonEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTerminalConditionRevisionReasonEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTerminalConditionRevisionReasonEnum{} } if len(a) == 0 { return map[string]ServiceTerminalConditionRevisionReasonEnum{} } items := make(map[string]ServiceTerminalConditionRevisionReasonEnum) for k, item := range a { items[k] = *flattenServiceTerminalConditionRevisionReasonEnum(item.(interface{})) } return items } // flattenServiceTerminalConditionRevisionReasonEnumSlice flattens the contents of ServiceTerminalConditionRevisionReasonEnum from a JSON // response object. func flattenServiceTerminalConditionRevisionReasonEnumSlice(c *Client, i interface{}, res *Service) []ServiceTerminalConditionRevisionReasonEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTerminalConditionRevisionReasonEnum{} } if len(a) == 0 { return []ServiceTerminalConditionRevisionReasonEnum{} } items := make([]ServiceTerminalConditionRevisionReasonEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTerminalConditionRevisionReasonEnum(item.(interface{}))) } return items } // flattenServiceTerminalConditionRevisionReasonEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTerminalConditionRevisionReasonEnum with the same value as that string. func flattenServiceTerminalConditionRevisionReasonEnum(i interface{}) *ServiceTerminalConditionRevisionReasonEnum { s, ok := i.(string) if !ok { return nil } return ServiceTerminalConditionRevisionReasonEnumRef(s) } // flattenServiceTerminalConditionJobReasonEnumMap flattens the contents of ServiceTerminalConditionJobReasonEnum from a JSON // response object. func flattenServiceTerminalConditionJobReasonEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTerminalConditionJobReasonEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTerminalConditionJobReasonEnum{} } if len(a) == 0 { return map[string]ServiceTerminalConditionJobReasonEnum{} } items := make(map[string]ServiceTerminalConditionJobReasonEnum) for k, item := range a { items[k] = *flattenServiceTerminalConditionJobReasonEnum(item.(interface{})) } return items } // flattenServiceTerminalConditionJobReasonEnumSlice flattens the contents of ServiceTerminalConditionJobReasonEnum from a JSON // response object. func flattenServiceTerminalConditionJobReasonEnumSlice(c *Client, i interface{}, res *Service) []ServiceTerminalConditionJobReasonEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTerminalConditionJobReasonEnum{} } if len(a) == 0 { return []ServiceTerminalConditionJobReasonEnum{} } items := make([]ServiceTerminalConditionJobReasonEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTerminalConditionJobReasonEnum(item.(interface{}))) } return items } // flattenServiceTerminalConditionJobReasonEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTerminalConditionJobReasonEnum with the same value as that string. func flattenServiceTerminalConditionJobReasonEnum(i interface{}) *ServiceTerminalConditionJobReasonEnum { s, ok := i.(string) if !ok { return nil } return ServiceTerminalConditionJobReasonEnumRef(s) } // flattenServiceTrafficStatusesTypeEnumMap flattens the contents of ServiceTrafficStatusesTypeEnum from a JSON // response object. func flattenServiceTrafficStatusesTypeEnumMap(c *Client, i interface{}, res *Service) map[string]ServiceTrafficStatusesTypeEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]ServiceTrafficStatusesTypeEnum{} } if len(a) == 0 { return map[string]ServiceTrafficStatusesTypeEnum{} } items := make(map[string]ServiceTrafficStatusesTypeEnum) for k, item := range a { items[k] = *flattenServiceTrafficStatusesTypeEnum(item.(interface{})) } return items } // flattenServiceTrafficStatusesTypeEnumSlice flattens the contents of ServiceTrafficStatusesTypeEnum from a JSON // response object. func flattenServiceTrafficStatusesTypeEnumSlice(c *Client, i interface{}, res *Service) []ServiceTrafficStatusesTypeEnum { a, ok := i.([]interface{}) if !ok { return []ServiceTrafficStatusesTypeEnum{} } if len(a) == 0 { return []ServiceTrafficStatusesTypeEnum{} } items := make([]ServiceTrafficStatusesTypeEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenServiceTrafficStatusesTypeEnum(item.(interface{}))) } return items } // flattenServiceTrafficStatusesTypeEnum asserts that an interface is a string, and returns a // pointer to a *ServiceTrafficStatusesTypeEnum with the same value as that string. func flattenServiceTrafficStatusesTypeEnum(i interface{}) *ServiceTrafficStatusesTypeEnum { s, ok := i.(string) if !ok { return nil } return ServiceTrafficStatusesTypeEnumRef(s) } // This function returns a matcher that checks whether a serialized resource matches this resource // in its parameters (as defined by the fields in a Get, which definitionally define resource // identity). This is useful in extracting the element from a List call. func (r *Service) matcher(c *Client) func([]byte) bool { return func(b []byte) bool { cr, err := unmarshalService(b, c, r) if err != nil { c.Config.Logger.Warning("failed to unmarshal provided resource in matcher.") return false } nr := r.urlNormalized() ncr := cr.urlNormalized() c.Config.Logger.Infof("looking for %v\nin %v", nr, ncr) if nr.Project == nil && ncr.Project == nil { c.Config.Logger.Info("Both Project fields null - considering equal.") } else if nr.Project == nil || ncr.Project == nil { c.Config.Logger.Info("Only one Project field is null - considering unequal.") return false } else if *nr.Project != *ncr.Project { return false } if nr.Location == nil && ncr.Location == nil { c.Config.Logger.Info("Both Location fields null - considering equal.") } else if nr.Location == nil || ncr.Location == nil { c.Config.Logger.Info("Only one Location field is null - considering unequal.") return false } else if *nr.Location != *ncr.Location { return false } if nr.Name == nil && ncr.Name == nil { c.Config.Logger.Info("Both Name fields null - considering equal.") } else if nr.Name == nil || ncr.Name == nil { c.Config.Logger.Info("Only one Name field is null - considering unequal.") return false } else if *nr.Name != *ncr.Name { return false } return true } } type serviceDiff struct { // The diff should include one or the other of RequiresRecreate or UpdateOp. RequiresRecreate bool UpdateOp serviceApiOperation FieldName string // used for error logging } func convertFieldDiffsToServiceDiffs(config *dcl.Config, fds []*dcl.FieldDiff, opts []dcl.ApplyOption) ([]serviceDiff, error) { opNamesToFieldDiffs := make(map[string][]*dcl.FieldDiff) // Map each operation name to the field diffs associated with it. for _, fd := range fds { for _, ro := range fd.ResultingOperation { if fieldDiffs, ok := opNamesToFieldDiffs[ro]; ok { fieldDiffs = append(fieldDiffs, fd) opNamesToFieldDiffs[ro] = fieldDiffs } else { config.Logger.Infof("%s required due to diff: %v", ro, fd) opNamesToFieldDiffs[ro] = []*dcl.FieldDiff{fd} } } } var diffs []serviceDiff // For each operation name, create a serviceDiff which contains the operation. for opName, fieldDiffs := range opNamesToFieldDiffs { // Use the first field diff's field name for logging required recreate error. diff := serviceDiff{FieldName: fieldDiffs[0].FieldName} if opName == "Recreate" { diff.RequiresRecreate = true } else { apiOp, err := convertOpNameToServiceApiOperation(opName, fieldDiffs, opts...) if err != nil { return diffs, err } diff.UpdateOp = apiOp } diffs = append(diffs, diff) } return diffs, nil } func convertOpNameToServiceApiOperation(opName string, fieldDiffs []*dcl.FieldDiff, opts ...dcl.ApplyOption) (serviceApiOperation, error) { switch opName { case "updateServiceUpdateServiceOperation": return &updateServiceUpdateServiceOperation{FieldDiffs: fieldDiffs}, nil default: return nil, fmt.Errorf("no such operation with name: %v", opName) } } func extractServiceFields(r *Service) error { vBinaryAuthorization := r.BinaryAuthorization if vBinaryAuthorization == nil { // note: explicitly not the empty object. vBinaryAuthorization = &ServiceBinaryAuthorization{} } if err := extractServiceBinaryAuthorizationFields(r, vBinaryAuthorization); err != nil { return err } if !dcl.IsEmptyValueIndirect(vBinaryAuthorization) { r.BinaryAuthorization = vBinaryAuthorization } vTemplate := r.Template if vTemplate == nil { // note: explicitly not the empty object. vTemplate = &ServiceTemplate{} } if err := extractServiceTemplateFields(r, vTemplate); err != nil { return err } if !dcl.IsEmptyValueIndirect(vTemplate) { r.Template = vTemplate } vTerminalCondition := r.TerminalCondition if vTerminalCondition == nil { // note: explicitly not the empty object. vTerminalCondition = &ServiceTerminalCondition{} } if err := extractServiceTerminalConditionFields(r, vTerminalCondition); err != nil { return err } if !dcl.IsEmptyValueIndirect(vTerminalCondition) { r.TerminalCondition = vTerminalCondition } return nil } func extractServiceBinaryAuthorizationFields(r *Service, o *ServiceBinaryAuthorization) error { return nil } func extractServiceTemplateFields(r *Service, o *ServiceTemplate) error { vScaling := o.Scaling if vScaling == nil { // note: explicitly not the empty object. vScaling = &ServiceTemplateScaling{} } if err := extractServiceTemplateScalingFields(r, vScaling); err != nil { return err } if !dcl.IsEmptyValueIndirect(vScaling) { o.Scaling = vScaling } vVPCAccess := o.VPCAccess if vVPCAccess == nil { // note: explicitly not the empty object. vVPCAccess = &ServiceTemplateVPCAccess{} } if err := extractServiceTemplateVPCAccessFields(r, vVPCAccess); err != nil { return err } if !dcl.IsEmptyValueIndirect(vVPCAccess) { o.VPCAccess = vVPCAccess } return nil } func extractServiceTemplateScalingFields(r *Service, o *ServiceTemplateScaling) error { return nil } func extractServiceTemplateVPCAccessFields(r *Service, o *ServiceTemplateVPCAccess) error { return nil } func extractServiceTemplateContainersFields(r *Service, o *ServiceTemplateContainers) error { vResources := o.Resources if vResources == nil { // note: explicitly not the empty object. vResources = &ServiceTemplateContainersResources{} } if err := extractServiceTemplateContainersResourcesFields(r, vResources); err != nil { return err } if !dcl.IsEmptyValueIndirect(vResources) { o.Resources = vResources } return nil } func extractServiceTemplateContainersEnvFields(r *Service, o *ServiceTemplateContainersEnv) error { vValueSource := o.ValueSource if vValueSource == nil { // note: explicitly not the empty object. vValueSource = &ServiceTemplateContainersEnvValueSource{} } if err := extractServiceTemplateContainersEnvValueSourceFields(r, vValueSource); err != nil { return err } if !dcl.IsEmptyValueIndirect(vValueSource) { o.ValueSource = vValueSource } return nil } func extractServiceTemplateContainersEnvValueSourceFields(r *Service, o *ServiceTemplateContainersEnvValueSource) error { vSecretKeyRef := o.SecretKeyRef if vSecretKeyRef == nil { // note: explicitly not the empty object. vSecretKeyRef = &ServiceTemplateContainersEnvValueSourceSecretKeyRef{} } if err := extractServiceTemplateContainersEnvValueSourceSecretKeyRefFields(r, vSecretKeyRef); err != nil { return err } if !dcl.IsEmptyValueIndirect(vSecretKeyRef) { o.SecretKeyRef = vSecretKeyRef } return nil } func extractServiceTemplateContainersEnvValueSourceSecretKeyRefFields(r *Service, o *ServiceTemplateContainersEnvValueSourceSecretKeyRef) error { return nil } func extractServiceTemplateContainersResourcesFields(r *Service, o *ServiceTemplateContainersResources) error { return nil } func extractServiceTemplateContainersPortsFields(r *Service, o *ServiceTemplateContainersPorts) error { return nil } func extractServiceTemplateContainersVolumeMountsFields(r *Service, o *ServiceTemplateContainersVolumeMounts) error { return nil } func extractServiceTemplateVolumesFields(r *Service, o *ServiceTemplateVolumes) error { vSecret := o.Secret if vSecret == nil { // note: explicitly not the empty object. vSecret = &ServiceTemplateVolumesSecret{} } if err := extractServiceTemplateVolumesSecretFields(r, vSecret); err != nil { return err } if !dcl.IsEmptyValueIndirect(vSecret) { o.Secret = vSecret } vCloudSqlInstance := o.CloudSqlInstance if vCloudSqlInstance == nil { // note: explicitly not the empty object. vCloudSqlInstance = &ServiceTemplateVolumesCloudSqlInstance{} } if err := extractServiceTemplateVolumesCloudSqlInstanceFields(r, vCloudSqlInstance); err != nil { return err } if !dcl.IsEmptyValueIndirect(vCloudSqlInstance) { o.CloudSqlInstance = vCloudSqlInstance } return nil } func extractServiceTemplateVolumesSecretFields(r *Service, o *ServiceTemplateVolumesSecret) error { return nil } func extractServiceTemplateVolumesSecretItemsFields(r *Service, o *ServiceTemplateVolumesSecretItems) error { return nil } func extractServiceTemplateVolumesCloudSqlInstanceFields(r *Service, o *ServiceTemplateVolumesCloudSqlInstance) error { return nil } func extractServiceTrafficFields(r *Service, o *ServiceTraffic) error { return nil } func extractServiceTerminalConditionFields(r *Service, o *ServiceTerminalCondition) error { return nil } func extractServiceTrafficStatusesFields(r *Service, o *ServiceTrafficStatuses) error { return nil } func postReadExtractServiceFields(r *Service) error { vBinaryAuthorization := r.BinaryAuthorization if vBinaryAuthorization == nil { // note: explicitly not the empty object. vBinaryAuthorization = &ServiceBinaryAuthorization{} } if err := postReadExtractServiceBinaryAuthorizationFields(r, vBinaryAuthorization); err != nil { return err } if !dcl.IsEmptyValueIndirect(vBinaryAuthorization) { r.BinaryAuthorization = vBinaryAuthorization } vTemplate := r.Template if vTemplate == nil { // note: explicitly not the empty object. vTemplate = &ServiceTemplate{} } if err := postReadExtractServiceTemplateFields(r, vTemplate); err != nil { return err } if !dcl.IsEmptyValueIndirect(vTemplate) { r.Template = vTemplate } vTerminalCondition := r.TerminalCondition if vTerminalCondition == nil { // note: explicitly not the empty object. vTerminalCondition = &ServiceTerminalCondition{} } if err := postReadExtractServiceTerminalConditionFields(r, vTerminalCondition); err != nil { return err } if !dcl.IsEmptyValueIndirect(vTerminalCondition) { r.TerminalCondition = vTerminalCondition } return nil } func postReadExtractServiceBinaryAuthorizationFields(r *Service, o *ServiceBinaryAuthorization) error { return nil } func postReadExtractServiceTemplateFields(r *Service, o *ServiceTemplate) error { vScaling := o.Scaling if vScaling == nil { // note: explicitly not the empty object. vScaling = &ServiceTemplateScaling{} } if err := extractServiceTemplateScalingFields(r, vScaling); err != nil { return err } if !dcl.IsEmptyValueIndirect(vScaling) { o.Scaling = vScaling } vVPCAccess := o.VPCAccess if vVPCAccess == nil { // note: explicitly not the empty object. vVPCAccess = &ServiceTemplateVPCAccess{} } if err := extractServiceTemplateVPCAccessFields(r, vVPCAccess); err != nil { return err } if !dcl.IsEmptyValueIndirect(vVPCAccess) { o.VPCAccess = vVPCAccess } return nil } func postReadExtractServiceTemplateScalingFields(r *Service, o *ServiceTemplateScaling) error { return nil } func postReadExtractServiceTemplateVPCAccessFields(r *Service, o *ServiceTemplateVPCAccess) error { return nil } func postReadExtractServiceTemplateContainersFields(r *Service, o *ServiceTemplateContainers) error { vResources := o.Resources if vResources == nil { // note: explicitly not the empty object. vResources = &ServiceTemplateContainersResources{} } if err := extractServiceTemplateContainersResourcesFields(r, vResources); err != nil { return err } if !dcl.IsEmptyValueIndirect(vResources) { o.Resources = vResources } return nil } func postReadExtractServiceTemplateContainersEnvFields(r *Service, o *ServiceTemplateContainersEnv) error { vValueSource := o.ValueSource if vValueSource == nil { // note: explicitly not the empty object. vValueSource = &ServiceTemplateContainersEnvValueSource{} } if err := extractServiceTemplateContainersEnvValueSourceFields(r, vValueSource); err != nil { return err } if !dcl.IsEmptyValueIndirect(vValueSource) { o.ValueSource = vValueSource } return nil } func postReadExtractServiceTemplateContainersEnvValueSourceFields(r *Service, o *ServiceTemplateContainersEnvValueSource) error { vSecretKeyRef := o.SecretKeyRef if vSecretKeyRef == nil { // note: explicitly not the empty object. vSecretKeyRef = &ServiceTemplateContainersEnvValueSourceSecretKeyRef{} } if err := extractServiceTemplateContainersEnvValueSourceSecretKeyRefFields(r, vSecretKeyRef); err != nil { return err } if !dcl.IsEmptyValueIndirect(vSecretKeyRef) { o.SecretKeyRef = vSecretKeyRef } return nil } func postReadExtractServiceTemplateContainersEnvValueSourceSecretKeyRefFields(r *Service, o *ServiceTemplateContainersEnvValueSourceSecretKeyRef) error { return nil } func postReadExtractServiceTemplateContainersResourcesFields(r *Service, o *ServiceTemplateContainersResources) error { return nil } func postReadExtractServiceTemplateContainersPortsFields(r *Service, o *ServiceTemplateContainersPorts) error { return nil } func postReadExtractServiceTemplateContainersVolumeMountsFields(r *Service, o *ServiceTemplateContainersVolumeMounts) error { return nil } func postReadExtractServiceTemplateVolumesFields(r *Service, o *ServiceTemplateVolumes) error { vSecret := o.Secret if vSecret == nil { // note: explicitly not the empty object. vSecret = &ServiceTemplateVolumesSecret{} } if err := extractServiceTemplateVolumesSecretFields(r, vSecret); err != nil { return err } if !dcl.IsEmptyValueIndirect(vSecret) { o.Secret = vSecret } vCloudSqlInstance := o.CloudSqlInstance if vCloudSqlInstance == nil { // note: explicitly not the empty object. vCloudSqlInstance = &ServiceTemplateVolumesCloudSqlInstance{} } if err := extractServiceTemplateVolumesCloudSqlInstanceFields(r, vCloudSqlInstance); err != nil { return err } if !dcl.IsEmptyValueIndirect(vCloudSqlInstance) { o.CloudSqlInstance = vCloudSqlInstance } return nil } func postReadExtractServiceTemplateVolumesSecretFields(r *Service, o *ServiceTemplateVolumesSecret) error { return nil } func postReadExtractServiceTemplateVolumesSecretItemsFields(r *Service, o *ServiceTemplateVolumesSecretItems) error { return nil } func postReadExtractServiceTemplateVolumesCloudSqlInstanceFields(r *Service, o *ServiceTemplateVolumesCloudSqlInstance) error { return nil } func postReadExtractServiceTrafficFields(r *Service, o *ServiceTraffic) error { return nil } func postReadExtractServiceTerminalConditionFields(r *Service, o *ServiceTerminalCondition) error { return nil } func postReadExtractServiceTrafficStatusesFields(r *Service, o *ServiceTrafficStatuses) error { return nil }