# Copyright 2019 Google LLC
#
# 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.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.Batch.V1.Model.AllocationPolicy do
  @moduledoc """
  A Job's resource allocation policy describes when, where, and how compute resources should be allocated for the Job.

  ## Attributes

  *   `instances` (*type:* `list(GoogleApi.Batch.V1.Model.InstancePolicyOrTemplate.t)`, *default:* `nil`) - Describe instances that can be created by this AllocationPolicy. Only instances[0] is supported now.
  *   `labels` (*type:* `map()`, *default:* `nil`) - Custom labels to apply to the job and all the Compute Engine resources that both are created by this allocation policy and support labels. Use labels to group and describe the resources they are applied to. Batch automatically applies predefined labels and supports multiple `labels` fields for each job, which each let you apply custom labels to various resources. Label names that start with "goog-" or "google-" are reserved for predefined labels. For more information about labels with Batch, see [Organize resources using labels](https://cloud.google.com/batch/docs/organize-resources-using-labels).
  *   `location` (*type:* `GoogleApi.Batch.V1.Model.LocationPolicy.t`, *default:* `nil`) - Location where compute resources should be allocated for the Job.
  *   `network` (*type:* `GoogleApi.Batch.V1.Model.NetworkPolicy.t`, *default:* `nil`) - The network policy. If you define an instance template in the `InstancePolicyOrTemplate` field, Batch will use the network settings in the instance template instead of this field.
  *   `placement` (*type:* `GoogleApi.Batch.V1.Model.PlacementPolicy.t`, *default:* `nil`) - The placement policy.
  *   `serviceAccount` (*type:* `GoogleApi.Batch.V1.Model.ServiceAccount.t`, *default:* `nil`) - Defines the service account for Batch-created VMs. If omitted, the [default Compute Engine service account](https://cloud.google.com/compute/docs/access/service-accounts#default_service_account) is used. Must match the service account specified in any used instance template configured in the Batch job. Includes the following fields: * email: The service account's email address. If not set, the default Compute Engine service account is used. * scopes: Additional OAuth scopes to grant the service account, beyond the default cloud-platform scope. (list of strings)
  *   `tags` (*type:* `list(String.t)`, *default:* `nil`) - Optional. Tags applied to the VM instances. The tags identify valid sources or targets for network firewalls. Each tag must be 1-63 characters long, and comply with [RFC1035](https://www.ietf.org/rfc/rfc1035.txt).
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :instances => list(GoogleApi.Batch.V1.Model.InstancePolicyOrTemplate.t()) | nil,
          :labels => map() | nil,
          :location => GoogleApi.Batch.V1.Model.LocationPolicy.t() | nil,
          :network => GoogleApi.Batch.V1.Model.NetworkPolicy.t() | nil,
          :placement => GoogleApi.Batch.V1.Model.PlacementPolicy.t() | nil,
          :serviceAccount => GoogleApi.Batch.V1.Model.ServiceAccount.t() | nil,
          :tags => list(String.t()) | nil
        }

  field(:instances, as: GoogleApi.Batch.V1.Model.InstancePolicyOrTemplate, type: :list)
  field(:labels, type: :map)
  field(:location, as: GoogleApi.Batch.V1.Model.LocationPolicy)
  field(:network, as: GoogleApi.Batch.V1.Model.NetworkPolicy)
  field(:placement, as: GoogleApi.Batch.V1.Model.PlacementPolicy)
  field(:serviceAccount, as: GoogleApi.Batch.V1.Model.ServiceAccount)
  field(:tags, type: :list)
end

defimpl Poison.Decoder, for: GoogleApi.Batch.V1.Model.AllocationPolicy do
  def decode(value, options) do
    GoogleApi.Batch.V1.Model.AllocationPolicy.decode(value, options)
  end
end

defimpl Poison.Encoder, for: GoogleApi.Batch.V1.Model.AllocationPolicy do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
