Class: Gcloud::ResourceManager::Project

Inherits:
Object
  • Object
show all
Defined in:
lib/gcloud/resource_manager/project.rb,
lib/gcloud/resource_manager/project/list.rb,
lib/gcloud/resource_manager/project/updater.rb

Overview

Project

Project is a high-level Google Cloud Platform entity. It is a container for ACLs, APIs, AppEngine Apps, VMs, and other Google Cloud Platform resources.

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.update do |p|
  p.name = "My Project"
  p.labels["env"] = "production"
end

Direct Known Subclasses

Updater

Defined Under Namespace

Classes: List, Updater

Instance Method Summary collapse

Instance Method Details

#active?Boolean

Checks if the state is ACTIVE.

Returns:

  • (Boolean)

208
209
210
211
# File 'lib/gcloud/resource_manager/project.rb', line 208

def active?
  return false if state.nil?
  "ACTIVE".casecmp(state).zero?
end

#created_atObject

The time that this project was created.


183
184
185
186
187
# File 'lib/gcloud/resource_manager/project.rb', line 183

def created_at
  Time.parse @gapi["createTime"]
rescue
  nil
end

#deleteObject

Marks the project for deletion. This method will only affect the project if the following criteria are met:

  • The project does not have a billing account associated with it.
  • The project has a lifecycle state of ACTIVE.
  • This method changes the project's lifecycle state from ACTIVE to DELETE_REQUESTED. The deletion starts at an unspecified time, at which point the lifecycle state changes to DELETE_IN_PROGRESS.

Until the deletion completes, you can check the lifecycle state by calling #reload!, or by retrieving the project with Manager#project. The project remains visible to Manager#project and Manager#projects, but cannot be updated.

After the deletion completes, the project is not retrievable by the Manager#project and Manager#projects methods.

The caller must have modify permissions for this project.

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.active? #=> true
project.delete
project.active? #=> false
project.delete_requested? #=> true

312
313
314
315
316
317
318
319
320
# File 'lib/gcloud/resource_manager/project.rb', line 312

def delete
  resp = connection.delete_project project_id
  if resp.success?
    reload!
    true
  else
    fail ApiError.from_response(resp)
  end
end

#delete_in_progress?Boolean

Checks if the state is DELETE_IN_PROGRESS.

Returns:

  • (Boolean)

229
230
231
232
# File 'lib/gcloud/resource_manager/project.rb', line 229

def delete_in_progress?
  return false if state.nil?
  "DELETE_IN_PROGRESS".casecmp(state).zero?
end

#delete_requested?Boolean

Checks if the state is DELETE_REQUESTED.

Returns:

  • (Boolean)

222
223
224
225
# File 'lib/gcloud/resource_manager/project.rb', line 222

def delete_requested?
  return false if state.nil?
  "DELETE_REQUESTED".casecmp(state).zero?
end

#labelsObject

The labels associated with this project.

Label keys must be between 1 and 63 characters long and must conform to the regular expression a-z?.

Label values must be between 0 and 63 characters long and must conform to the regular expression (a-z?)?.

No more than 256 labels can be associated with a given resource. (Hash)

Examples:

Labels are read-only and cannot be changed:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.labels["env"] #=> "dev" # read only
project.labels["env"] = "production" # raises error

Labels can be updated by passing a block, or with #labels=:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.labels do |labels|
  labels["env"] = "production"
end

137
138
139
140
141
142
143
144
145
146
147
# File 'lib/gcloud/resource_manager/project.rb', line 137

def labels
  labels = @gapi["labels"]
  labels = labels.to_hash if labels.respond_to? :to_hash
  if block_given?
    yielded_labels = labels.dup
    yield yielded_labels
    self.labels = yielded_labels if yielded_labels != labels # changed
  else
    labels.freeze
  end
end

#labels=(new_labels) ⇒ Object

Updates the labels associated with this project.

Label keys must be between 1 and 63 characters long and must conform to the regular expression a-z?.

Label values must be between 0 and 63 characters long and must conform to the regular expression (a-z?)?.

No more than 256 labels can be associated with a given resource. (Hash)

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.labels = { "env" => "production" }

169
170
171
172
173
174
175
176
177
178
# File 'lib/gcloud/resource_manager/project.rb', line 169

def labels= new_labels
  ensure_connection!
  @gapi["labels"] = new_labels
  resp = connection.update_project @gapi
  if resp.success?
    @gapi = resp.data
  else
    fail ApiError.from_response(resp)
  end
end

#nameObject

The user-assigned name of the project.


76
77
78
# File 'lib/gcloud/resource_manager/project.rb', line 76

def name
  @gapi["name"]
end

#name=(new_name) ⇒ Object

Updates the user-assigned name of the project. This field is optional and can remain unset.

Allowed characters are: lowercase and uppercase letters, numbers, hyphen, single-quote, double-quote, space, and exclamation point.

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.name = "My Project"

95
96
97
98
99
100
101
102
103
104
# File 'lib/gcloud/resource_manager/project.rb', line 95

def name= new_name
  ensure_connection!
  @gapi["name"] = new_name
  resp = connection.update_project @gapi
  if resp.success?
    @gapi = resp.data
  else
    fail ApiError.from_response(resp)
  end
end

#policy(force: false) ⇒ Hash

Gets the Cloud IAM access control policy. Returns a hash that conforms to the following structure:

{ "bindings" => [{ "role" => "roles/viewer", "members" => ["serviceAccount:your-service-account"] }], "version" => 0, "etag" => "CAE=" }

Examples:

Policy values are memoized by default:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
policy = project.policy

puts policy["bindings"]
puts policy["version"]
puts policy["etag"]

Use the force option to retrieve the latest policy:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
policy = project.policy force: true

Parameters:

  • force (Boolean)

    Force load the latest policy when true. Otherwise the policy will be memoized to reduce the number of API calls made. The default is false.

Returns:

  • (Hash)

    See description

See Also:


393
394
395
396
397
398
399
400
401
402
403
# File 'lib/gcloud/resource_manager/project.rb', line 393

def policy force: false
  @policy = nil if force
  @policy ||= begin
    ensure_connection!
    resp = connection.get_policy project_id
    fail ApiError.from_response(resp) unless resp.success?
    policy = resp.data
    policy = policy.to_hash if policy.respond_to? :to_hash
    policy
  end
end

#policy=(new_policy) ⇒ Object

Sets the Cloud IAM access control policy.

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"

viewer_policy = {
  "bindings" => [{
    "role" => "roles/viewer",
    "members" => ["serviceAccount:your-service-account"]
  }]
}
project.policy = viewer_policy

Parameters:

  • new_policy (String)

    A hash that conforms to the following structure:

    { "bindings" => [{ "role" => "roles/viewer", "members" => ["serviceAccount:your-service-account"] }] }

See Also:


437
438
439
440
441
442
443
444
445
446
# File 'lib/gcloud/resource_manager/project.rb', line 437

def policy= new_policy
  ensure_connection!
  resp = connection.set_policy project_id, new_policy
  if resp.success?
    @policy = resp.data
    @policy = @policy.to_hash if @policy.respond_to? :to_hash
  else
    fail ApiError.from_response(resp)
  end
end

#project_idObject

The unique, user-assigned ID of the project. It must be 6 to 30 lowercase letters, digits, or hyphens. It must start with a letter. Trailing hyphens are prohibited. e.g. tokyo-rain-123


62
63
64
# File 'lib/gcloud/resource_manager/project.rb', line 62

def project_id
  @gapi["projectId"]
end

#project_numberObject

The number uniquely identifying the project. e.g. 415104041262


69
70
71
# File 'lib/gcloud/resource_manager/project.rb', line 69

def project_number
  @gapi["projectNumber"]
end

#reload!Object Also known as: refresh!

Reloads the project (with updated state) from the Google Cloud Resource Manager service.

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.reload!

271
272
273
274
275
276
277
278
# File 'lib/gcloud/resource_manager/project.rb', line 271

def reload!
  resp = connection.get_project project_id
  if resp.success?
    @gapi = resp.data
  else
    fail ApiError.from_response(resp)
  end
end

#stateObject

The project lifecycle state.

Possible values are:

  • ACTIVE - The normal and active state.
  • LIFECYCLE_STATE_UNSPECIFIED - Unspecified state. This is only used/useful for distinguishing unset values.
  • DELETE_REQUESTED - The project has been marked for deletion by the user (by invoking DeleteProject) or by the system (Google Cloud Platform). This can generally be reversed by invoking UndeleteProject.
  • DELETE_IN_PROGRESS - The process of deleting the project has begun. Reversing the deletion is no longer possible.

202
203
204
# File 'lib/gcloud/resource_manager/project.rb', line 202

def state
  @gapi["lifecycleState"]
end

#test_permissions(*permissions) ⇒ Array<String>

Tests the specified permissions against the Cloud IAM access control policy.

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
perms = project.test_permissions "resourcemanager.projects.get",
                                 "resourcemanager.projects.delete"
perms.include? "resourcemanager.projects.get"    #=> true
perms.include? "resourcemanager.projects.delete" #=> false

Parameters:

  • *permissions (String, Array<String>)

    The set of permissions to check access for. Permissions with wildcards (such as * or storage.*) are not allowed.

Returns:

  • (Array<String>)

    The permissions that have access

See Also:


472
473
474
475
476
477
478
479
480
481
# File 'lib/gcloud/resource_manager/project.rb', line 472

def test_permissions *permissions
  permissions = Array(permissions).flatten
  ensure_connection!
  resp = connection.test_permissions project_id, permissions
  if resp.success?
    Array(resp.data["permissions"])
  else
    fail ApiError.from_response(resp)
  end
end

#undeleteObject

Restores the project. You can only use this method for a project that has a lifecycle state of DELETE_REQUESTED. After deletion starts, as indicated by a lifecycle state of DELETE_IN_PROGRESS, the project cannot be restored.

The caller must have modify permissions for this project.

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.delete_requested? #=> true
project.undelete
project.delete_requested? #=> false
project.active? #=> true

341
342
343
344
345
346
347
348
349
# File 'lib/gcloud/resource_manager/project.rb', line 341

def undelete
  resp = connection.undelete_project project_id
  if resp.success?
    reload!
    true
  else
    fail ApiError.from_response(resp)
  end
end

#unspecified?Boolean

Checks if the state is LIFECYCLE_STATE_UNSPECIFIED.

Returns:

  • (Boolean)

215
216
217
218
# File 'lib/gcloud/resource_manager/project.rb', line 215

def unspecified?
  return false if state.nil?
  "LIFECYCLE_STATE_UNSPECIFIED".casecmp(state).zero?
end

#update {|updater| ... } ⇒ Object

Updates the project in a single API call. See Updater

Examples:

require "gcloud"

gcloud = Gcloud.new
resource_manager = gcloud.resource_manager
project = resource_manager.project "tokyo-rain-123"
project.update do |p|
  p.name = "My Project"
  p.labels["env"] = "production"
end

Yields:

  • (updater)

248
249
250
251
252
253
254
255
256
257
# File 'lib/gcloud/resource_manager/project.rb', line 248

def update
  updater = Updater.from_project self
  yield updater
  resp = connection.update_project updater.gapi
  if resp.success?
    @gapi = resp.data
  else
    fail ApiError.from_response(resp)
  end
end