# Copyright 2015 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
#
# https://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.
require "google/cloud/errors"
require "google/cloud/resource_manager/credentials"
require "google/cloud/resource_manager/service"
require "google/cloud/resource_manager/project"
module Google
module Cloud
module ResourceManager
##
# # Manager
#
# Provides methods for creating, retrieving, and updating projects.
#
# @example
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# resource_manager.projects.each do |project|
# puts projects.project_id
# end
#
# See {Google::Cloud#resource_manager}
class Manager
##
# @private The Service object.
attr_accessor :service
##
# @private Creates a new Service instance.
#
# See {Google::Cloud.resource_manager}
def initialize service
@service = service
end
##
# Retrieves the projects that are visible to the user and satisfy the
# specified filter. This method returns projects in an unspecified
# order. New projects do not necessarily appear at the end of the list.
#
# @param [String] filter An expression for filtering the results of the
# request. Filter rules are case insensitive.
#
# The fields eligible for filtering are:
#
# * `name`
# * `id`
# * `labels.key` - where `key` is the name of a label
#
# Some examples of using labels as filters:
#
# * `name:*` - The project has a name.
# * `name:Howl` - The project's name is Howl or howl.
# * `name:HOWL` - Equivalent to above.
# * `NAME:howl` - Equivalent to above.
# * `labels.color:*` - The project has the label color.
# * `labels.color:red` - The project's label color has the value red.
# * labels.color:red labels.size:big
- The project's
# label color has the value red and its label size has the value
# big.
# @param [String] token A previously-returned page token representing
# part of the larger set of results to view.
# @param [Integer] max Maximum number of projects to return.
#
# @return [Array] (See
# {Google::Cloud::ResourceManager::Project::List})
#
# @example
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# projects = resource_manager.projects
#
# projects.each do |project|
# puts project.project_id
# end
#
# @example Projects can be filtered using the `filter` option:
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# projects = resource_manager.projects filter: "labels.env:production"
#
# projects.each do |project|
# puts project.project_id
# end
#
# @example Retrieve all projects: (See {Project::List#all})
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# projects = resource_manager.projects
#
# projects.all do |project|
# puts project.project_id
# end
#
def projects filter: nil, token: nil, max: nil
gapi = service.list_project filter: filter, token: token, max: max
Project::List.from_gapi gapi, self, filter, max
end
##
# Retrieves the project identified by the specified `project_id`.
#
# @param [String] project_id The ID of the project.
#
# @return [Google::Cloud::ResourceManager::Project, nil] Returns `nil`
# if the project does not exist
#
# @example
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# project = resource_manager.project "tokyo-rain-123"
# project.project_id #=> "tokyo-rain-123"
#
def project project_id
gapi = service.get_project project_id
Project.from_gapi gapi, service
rescue NotFoundError
nil
end
##
# Creates a project resource.
#
# Initially, the project resource is owned by its creator exclusively.
# The creator can later grant permission to others to read or update the
# project.
#
# Several APIs are activated automatically for the project, including
# Google Cloud Storage.
#
# @param [String] project_id 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.
# @param [String] name 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.
# @param [Hash] labels The labels associated with this project.
#
# Label keys must be between 1 and 63 characters long and must conform
# to the following regular expression:
# [a-z]([-a-z0-9]*[a-z0-9])?
.
#
# Label values must be between 0 and 63 characters long and must
# conform to the regular expression
# ([a-z]([-a-z0-9]*[a-z0-9])?)?
.
#
# No more than 256 labels can be associated with a given resource.
#
# @return [Google::Cloud::ResourceManager::Project]
#
# @example
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# project = resource_manager.create_project "tokyo-rain-123"
#
# @example A project can also be created with a `name` and `labels`:
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# project = resource_manager.create_project "tokyo-rain-123",
# name: "Todos Development", labels: {env: :development}
#
def create_project project_id, name: nil, labels: nil
gapi = service.create_project project_id, name, labels
Project.from_gapi gapi, service
end
##
# 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
# 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.
#
# @param [String] project_id The ID of the project.
#
# @example
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# resource_manager.delete "tokyo-rain-123"
#
def delete project_id
service.delete_project project_id
true
end
##
# 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.
#
# @param [String] project_id The ID of the project.
#
# @example
# require "google/cloud/resource_manager"
#
# resource_manager = Google::Cloud::ResourceManager.new
# resource_manager.undelete "tokyo-rain-123"
#
def undelete project_id
service.undelete_project project_id
true
end
protected
##
# Create an options hash from the projects parameters.
def list_projects_options filter, options
# Handle only sending in options
if filter.is_a?(::Hash) && options.empty?
options = filter
filter = nil
end
# Give named parameter priority
options[:filter] = filter || options[:filter]
options
end
end
end
end
end