# 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.Storage.V1.Model.Bucket do
  @moduledoc """
  A bucket.

  ## Attributes

  *   `selfLink` (*type:* `String.t`, *default:* `nil`) - The URI of this bucket.
  *   `labels` (*type:* `map()`, *default:* `nil`) - User-provided labels, in key/value pairs.
  *   `name` (*type:* `String.t`, *default:* `nil`) - The name of the bucket.
  *   `kind` (*type:* `String.t`, *default:* `storage#bucket`) - The kind of item this is. For buckets, this is always storage#bucket.
  *   `acl` (*type:* `list(GoogleApi.Storage.V1.Model.BucketAccessControl.t)`, *default:* `nil`) - Access controls on the bucket.
  *   `objectRetention` (*type:* `GoogleApi.Storage.V1.Model.BucketObjectRetention.t`, *default:* `nil`) - The bucket's object retention config.
  *   `iamConfiguration` (*type:* `GoogleApi.Storage.V1.Model.BucketIamConfiguration.t`, *default:* `nil`) - The bucket's IAM configuration.
  *   `lifecycle` (*type:* `GoogleApi.Storage.V1.Model.BucketLifecycle.t`, *default:* `nil`) - The bucket's lifecycle configuration. See [Lifecycle Management](https://cloud.google.com/storage/docs/lifecycle) for more information.
  *   `updated` (*type:* `DateTime.t`, *default:* `nil`) - The modification time of the bucket in RFC 3339 format.
  *   `customPlacementConfig` (*type:* `GoogleApi.Storage.V1.Model.BucketCustomPlacementConfig.t`, *default:* `nil`) - The bucket's custom placement configuration for Custom Dual Regions.
  *   `autoclass` (*type:* `GoogleApi.Storage.V1.Model.BucketAutoclass.t`, *default:* `nil`) - The bucket's Autoclass configuration.
  *   `locationType` (*type:* `String.t`, *default:* `nil`) - The type of the bucket location.
  *   `website` (*type:* `GoogleApi.Storage.V1.Model.BucketWebsite.t`, *default:* `nil`) - The bucket's website configuration, controlling how the service behaves when accessing bucket contents as a web site. See the [Static Website Examples](https://cloud.google.com/storage/docs/static-website) for more information.
  *   `timeCreated` (*type:* `DateTime.t`, *default:* `nil`) - The creation time of the bucket in RFC 3339 format.
  *   `ipFilter` (*type:* `GoogleApi.Storage.V1.Model.BucketIpFilter.t`, *default:* `nil`) - The bucket's IP filter configuration. Specifies the network sources that are allowed to access the operations on the bucket, as well as its underlying objects. Only enforced when the mode is set to 'Enabled'.
  *   `softDeletePolicy` (*type:* `GoogleApi.Storage.V1.Model.BucketSoftDeletePolicy.t`, *default:* `nil`) - The bucket's soft delete policy, which defines the period of time that soft-deleted objects will be retained, and cannot be permanently deleted.
  *   `encryption` (*type:* `GoogleApi.Storage.V1.Model.BucketEncryption.t`, *default:* `nil`) - Encryption configuration for a bucket.
  *   `rpo` (*type:* `String.t`, *default:* `nil`) - The Recovery Point Objective (RPO) of this bucket. Set to ASYNC_TURBO to turn on Turbo Replication on a bucket.
  *   `satisfiesPZS` (*type:* `boolean()`, *default:* `nil`) - Reserved for future use.
  *   `projectNumber` (*type:* `String.t`, *default:* `nil`) - The project number of the project the bucket belongs to.
  *   `defaultEventBasedHold` (*type:* `boolean()`, *default:* `nil`) - The default value for event-based hold on newly created objects in this bucket. Event-based hold is a way to retain objects indefinitely until an event occurs, signified by the hold's release. After being released, such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here, bucket-level retention is 3 years and the event is loan being paid in full. In this example, these objects will be held intact for any number of years until the event has occurred (event-based hold on the object is released) and then 3 more years after that. That means retention duration of the objects begins from the moment event-based hold transitioned from true to false. Objects under event-based hold cannot be deleted, overwritten or archived until the hold is removed.
  *   `location` (*type:* `String.t`, *default:* `nil`) - The location of the bucket. Object data for objects in the bucket resides in physical storage within this region. Defaults to US. See the [Developer's Guide](https://cloud.google.com/storage/docs/locations) for the authoritative list.
  *   `defaultObjectAcl` (*type:* `list(GoogleApi.Storage.V1.Model.ObjectAccessControl.t)`, *default:* `nil`) - Default access controls to apply to new objects when no ACL is provided.
  *   `metageneration` (*type:* `String.t`, *default:* `nil`) - The metadata generation of this bucket.
  *   `softDeleteTime` (*type:* `DateTime.t`, *default:* `nil`) - The soft delete time of the bucket in RFC 3339 format.
  *   `generation` (*type:* `String.t`, *default:* `nil`) - The generation of this bucket.
  *   `storageClass` (*type:* `String.t`, *default:* `nil`) - The bucket's default storage class, used whenever no storageClass is specified for a newly-created object. This defines how objects in the bucket are stored and determines the SLA and the cost of storage. Values include MULTI_REGIONAL, REGIONAL, STANDARD, NEARLINE, COLDLINE, ARCHIVE, and DURABLE_REDUCED_AVAILABILITY. If this value is not specified when the bucket is created, it will default to STANDARD. For more information, see [Storage Classes](https://cloud.google.com/storage/docs/storage-classes).
  *   `cors` (*type:* `list(GoogleApi.Storage.V1.Model.BucketCors.t)`, *default:* `nil`) - The bucket's Cross-Origin Resource Sharing (CORS) configuration.
  *   `billing` (*type:* `GoogleApi.Storage.V1.Model.BucketBilling.t`, *default:* `nil`) - The bucket's billing configuration.
  *   `hardDeleteTime` (*type:* `DateTime.t`, *default:* `nil`) - The hard delete time of the bucket in RFC 3339 format.
  *   `hierarchicalNamespace` (*type:* `GoogleApi.Storage.V1.Model.BucketHierarchicalNamespace.t`, *default:* `nil`) - The bucket's hierarchical namespace configuration.
  *   `retentionPolicy` (*type:* `GoogleApi.Storage.V1.Model.BucketRetentionPolicy.t`, *default:* `nil`) - The bucket's retention policy. The retention policy enforces a minimum retention time for all objects contained in the bucket, based on their creation time. Any attempt to overwrite or delete objects younger than the retention period will result in a PERMISSION_DENIED error. An unlocked retention policy can be modified or removed from the bucket via a storage.buckets.update operation. A locked retention policy cannot be removed or shortened in duration for the lifetime of the bucket. Attempting to remove or decrease period of a locked retention policy will result in a PERMISSION_DENIED error.
  *   `etag` (*type:* `String.t`, *default:* `nil`) - HTTP 1.1 Entity tag for the bucket.
  *   `satisfiesPZI` (*type:* `boolean()`, *default:* `nil`) - Reserved for future use.
  *   `id` (*type:* `String.t`, *default:* `nil`) - The ID of the bucket. For buckets, the id and name properties are the same.
  *   `versioning` (*type:* `GoogleApi.Storage.V1.Model.BucketVersioning.t`, *default:* `nil`) - The bucket's versioning configuration.
  *   `logging` (*type:* `GoogleApi.Storage.V1.Model.BucketLogging.t`, *default:* `nil`) - The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current bucket's logs.
  *   `owner` (*type:* `GoogleApi.Storage.V1.Model.BucketOwner.t`, *default:* `nil`) - The owner of the bucket. This is always the project team's owner group.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :selfLink => String.t() | nil,
          :labels => map() | nil,
          :name => String.t() | nil,
          :kind => String.t() | nil,
          :acl => list(GoogleApi.Storage.V1.Model.BucketAccessControl.t()) | nil,
          :objectRetention => GoogleApi.Storage.V1.Model.BucketObjectRetention.t() | nil,
          :iamConfiguration => GoogleApi.Storage.V1.Model.BucketIamConfiguration.t() | nil,
          :lifecycle => GoogleApi.Storage.V1.Model.BucketLifecycle.t() | nil,
          :updated => DateTime.t() | nil,
          :customPlacementConfig =>
            GoogleApi.Storage.V1.Model.BucketCustomPlacementConfig.t() | nil,
          :autoclass => GoogleApi.Storage.V1.Model.BucketAutoclass.t() | nil,
          :locationType => String.t() | nil,
          :website => GoogleApi.Storage.V1.Model.BucketWebsite.t() | nil,
          :timeCreated => DateTime.t() | nil,
          :ipFilter => GoogleApi.Storage.V1.Model.BucketIpFilter.t() | nil,
          :softDeletePolicy => GoogleApi.Storage.V1.Model.BucketSoftDeletePolicy.t() | nil,
          :encryption => GoogleApi.Storage.V1.Model.BucketEncryption.t() | nil,
          :rpo => String.t() | nil,
          :satisfiesPZS => boolean() | nil,
          :projectNumber => String.t() | nil,
          :defaultEventBasedHold => boolean() | nil,
          :location => String.t() | nil,
          :defaultObjectAcl => list(GoogleApi.Storage.V1.Model.ObjectAccessControl.t()) | nil,
          :metageneration => String.t() | nil,
          :softDeleteTime => DateTime.t() | nil,
          :generation => String.t() | nil,
          :storageClass => String.t() | nil,
          :cors => list(GoogleApi.Storage.V1.Model.BucketCors.t()) | nil,
          :billing => GoogleApi.Storage.V1.Model.BucketBilling.t() | nil,
          :hardDeleteTime => DateTime.t() | nil,
          :hierarchicalNamespace =>
            GoogleApi.Storage.V1.Model.BucketHierarchicalNamespace.t() | nil,
          :retentionPolicy => GoogleApi.Storage.V1.Model.BucketRetentionPolicy.t() | nil,
          :etag => String.t() | nil,
          :satisfiesPZI => boolean() | nil,
          :id => String.t() | nil,
          :versioning => GoogleApi.Storage.V1.Model.BucketVersioning.t() | nil,
          :logging => GoogleApi.Storage.V1.Model.BucketLogging.t() | nil,
          :owner => GoogleApi.Storage.V1.Model.BucketOwner.t() | nil
        }

  field(:selfLink)
  field(:labels, type: :map)
  field(:name)
  field(:kind)
  field(:acl, as: GoogleApi.Storage.V1.Model.BucketAccessControl, type: :list)
  field(:objectRetention, as: GoogleApi.Storage.V1.Model.BucketObjectRetention)
  field(:iamConfiguration, as: GoogleApi.Storage.V1.Model.BucketIamConfiguration)
  field(:lifecycle, as: GoogleApi.Storage.V1.Model.BucketLifecycle)
  field(:updated, as: DateTime)
  field(:customPlacementConfig, as: GoogleApi.Storage.V1.Model.BucketCustomPlacementConfig)
  field(:autoclass, as: GoogleApi.Storage.V1.Model.BucketAutoclass)
  field(:locationType)
  field(:website, as: GoogleApi.Storage.V1.Model.BucketWebsite)
  field(:timeCreated, as: DateTime)
  field(:ipFilter, as: GoogleApi.Storage.V1.Model.BucketIpFilter)
  field(:softDeletePolicy, as: GoogleApi.Storage.V1.Model.BucketSoftDeletePolicy)
  field(:encryption, as: GoogleApi.Storage.V1.Model.BucketEncryption)
  field(:rpo)
  field(:satisfiesPZS)
  field(:projectNumber)
  field(:defaultEventBasedHold)
  field(:location)
  field(:defaultObjectAcl, as: GoogleApi.Storage.V1.Model.ObjectAccessControl, type: :list)
  field(:metageneration)
  field(:softDeleteTime, as: DateTime)
  field(:generation)
  field(:storageClass)
  field(:cors, as: GoogleApi.Storage.V1.Model.BucketCors, type: :list)
  field(:billing, as: GoogleApi.Storage.V1.Model.BucketBilling)
  field(:hardDeleteTime, as: DateTime)
  field(:hierarchicalNamespace, as: GoogleApi.Storage.V1.Model.BucketHierarchicalNamespace)
  field(:retentionPolicy, as: GoogleApi.Storage.V1.Model.BucketRetentionPolicy)
  field(:etag)
  field(:satisfiesPZI)
  field(:id)
  field(:versioning, as: GoogleApi.Storage.V1.Model.BucketVersioning)
  field(:logging, as: GoogleApi.Storage.V1.Model.BucketLogging)
  field(:owner, as: GoogleApi.Storage.V1.Model.BucketOwner)
end

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

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