<?php
/*
 * Copyright 2014 Google Inc.
 *
 * 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.
 */

namespace Google\Service\ServiceConsumerManagement\Resource;

use Google\Service\ServiceConsumerManagement\AddTenantProjectRequest;
use Google\Service\ServiceConsumerManagement\ApplyTenantProjectConfigRequest;
use Google\Service\ServiceConsumerManagement\AttachTenantProjectRequest;
use Google\Service\ServiceConsumerManagement\CreateTenancyUnitRequest;
use Google\Service\ServiceConsumerManagement\DeleteTenantProjectRequest;
use Google\Service\ServiceConsumerManagement\ListTenancyUnitsResponse;
use Google\Service\ServiceConsumerManagement\Operation;
use Google\Service\ServiceConsumerManagement\RemoveTenantProjectRequest;
use Google\Service\ServiceConsumerManagement\TenancyUnit;
use Google\Service\ServiceConsumerManagement\UndeleteTenantProjectRequest;

/**
 * The "tenancyUnits" collection of methods.
 * Typical usage is:
 *  <code>
 *   $serviceconsumermanagementService = new Google\Service\ServiceConsumerManagement(...);
 *   $tenancyUnits = $serviceconsumermanagementService->tenancyUnits;
 *  </code>
 */
class ServicesTenancyUnits extends \Google\Service\Resource
{
  /**
   * Add a new tenant project to the tenancy unit. There can be a maximum of 1024
   * tenant projects in a tenancy unit. If there are previously failed
   * `AddTenantProject` calls, you might need to call `RemoveTenantProject` first
   * to resolve them before you can make another call to `AddTenantProject` with
   * the same tag. Operation. (tenancyUnits.addProject)
   *
   * @param string $parent Required. Name of the tenancy unit. Such as
   * 'services/service.googleapis.com/projects/12345/tenancyUnits/abcd'.
   * @param AddTenantProjectRequest $postBody
   * @param array $optParams Optional parameters.
   * @return Operation
   */
  public function addProject($parent, AddTenantProjectRequest $postBody, $optParams = [])
  {
    $params = ['parent' => $parent, 'postBody' => $postBody];
    $params = array_merge($params, $optParams);
    return $this->call('addProject', [$params], Operation::class);
  }
  /**
   * Apply a configuration to an existing tenant project. This project must exist
   * in an active state and have the original owner account. The caller must have
   * permission to add a project to the given tenancy unit. The configuration is
   * applied, but any existing settings on the project aren't modified. Specified
   * policy bindings are applied. Existing bindings aren't modified. Specified
   * services are activated. No service is deactivated. If specified, new billing
   * configuration is applied. Omit a billing configuration to keep the existing
   * one. A service account in the project is created if previously non existed.
   * Specified labels will be appended to tenant project, note that the value of
   * existing label key will be updated if the same label key is requested. The
   * specified folder is ignored, as moving a tenant project to a different folder
   * isn't supported. The operation fails if any of the steps fail, but no
   * rollback of already applied configuration changes is attempted. Operation.
   * (tenancyUnits.applyProjectConfig)
   *
   * @param string $name Required. Name of the tenancy unit. Such as
   * 'services/service.googleapis.com/projects/12345/tenancyUnits/abcd'.
   * @param ApplyTenantProjectConfigRequest $postBody
   * @param array $optParams Optional parameters.
   * @return Operation
   */
  public function applyProjectConfig($name, ApplyTenantProjectConfigRequest $postBody, $optParams = [])
  {
    $params = ['name' => $name, 'postBody' => $postBody];
    $params = array_merge($params, $optParams);
    return $this->call('applyProjectConfig', [$params], Operation::class);
  }
  /**
   * Attach an existing project to the tenancy unit as a new tenant resource. The
   * project could either be the tenant project reserved by calling
   * `AddTenantProject` under a tenancy unit of a service producer's project of a
   * managed service, or from a separate project. The caller is checked against a
   * set of permissions as if calling `AddTenantProject` on the same service
   * consumer. To trigger the attachment, the targeted tenant project must be in a
   * folder. Make sure the ServiceConsumerManagement service account is the owner
   * of that project. These two requirements are already met if the project is
   * reserved by calling `AddTenantProject`. Operation.
   * (tenancyUnits.attachProject)
   *
   * @param string $name Required. Name of the tenancy unit that the project will
   * be attached to. Such as
   * 'services/service.googleapis.com/projects/12345/tenancyUnits/abcd'.
   * @param AttachTenantProjectRequest $postBody
   * @param array $optParams Optional parameters.
   * @return Operation
   */
  public function attachProject($name, AttachTenantProjectRequest $postBody, $optParams = [])
  {
    $params = ['name' => $name, 'postBody' => $postBody];
    $params = array_merge($params, $optParams);
    return $this->call('attachProject', [$params], Operation::class);
  }
  /**
   * Creates a tenancy unit with no tenant resources. If tenancy unit already
   * exists, it will be returned, however, in this case, returned TenancyUnit does
   * not have tenant_resources field set and ListTenancyUnits has to be used to
   * get a complete TenancyUnit with all fields populated. (tenancyUnits.create)
   *
   * @param string $parent Required. services/{service}/{collection id}/{resource
   * id} {collection id} is the cloud resource collection type representing the
   * service consumer, for example 'projects', or 'organizations'. {resource id}
   * is the consumer numeric id, such as project number: '123456'. {service} the
   * name of a managed service, such as 'service.googleapis.com'. Enables service
   * binding using the new tenancy unit.
   * @param CreateTenancyUnitRequest $postBody
   * @param array $optParams Optional parameters.
   * @return TenancyUnit
   */
  public function create($parent, CreateTenancyUnitRequest $postBody, $optParams = [])
  {
    $params = ['parent' => $parent, 'postBody' => $postBody];
    $params = array_merge($params, $optParams);
    return $this->call('create', [$params], TenancyUnit::class);
  }
  /**
   * Delete a tenancy unit. Before you delete the tenancy unit, there should be no
   * tenant resources in it that aren't in a DELETED state. Operation.
   * (tenancyUnits.delete)
   *
   * @param string $name Required. Name of the tenancy unit to be deleted.
   * @param array $optParams Optional parameters.
   * @return Operation
   */
  public function delete($name, $optParams = [])
  {
    $params = ['name' => $name];
    $params = array_merge($params, $optParams);
    return $this->call('delete', [$params], Operation::class);
  }
  /**
   * Deletes the specified project resource identified by a tenant resource tag.
   * The mothod removes a project lien with a 'TenantManager' origin if that was
   * added. It will then attempt to delete the project. If that operation fails,
   * this method also fails. After the project has been deleted, the tenant
   * resource state is set to DELETED. To permanently remove resource metadata,
   * call the `RemoveTenantProject` method. New resources with the same tag can't
   * be added if there are existing resources in a DELETED state. Operation.
   * (tenancyUnits.deleteProject)
   *
   * @param string $name Required. Name of the tenancy unit. Such as
   * 'services/service.googleapis.com/projects/12345/tenancyUnits/abcd'.
   * @param DeleteTenantProjectRequest $postBody
   * @param array $optParams Optional parameters.
   * @return Operation
   */
  public function deleteProject($name, DeleteTenantProjectRequest $postBody, $optParams = [])
  {
    $params = ['name' => $name, 'postBody' => $postBody];
    $params = array_merge($params, $optParams);
    return $this->call('deleteProject', [$params], Operation::class);
  }
  /**
   * Find the tenancy unit for a managed service and service consumer. This method
   * shouldn't be used in a service producer's runtime path, for example to find
   * the tenant project number when creating VMs. Service producers must persist
   * the tenant project's information after the project is created.
   * (tenancyUnits.listServicesTenancyUnits)
   *
   * @param string $parent Required. Managed service and service consumer.
   * Required. services/{service}/{collection id}/{resource id} {collection id} is
   * the cloud resource collection type representing the service consumer, for
   * example 'projects', or 'organizations'. {resource id} is the consumer numeric
   * id, such as project number: '123456'. {service} the name of a service, such
   * as 'service.googleapis.com'.
   * @param array $optParams Optional parameters.
   *
   * @opt_param string filter Optional. Filter expression over tenancy resources
   * field. Optional.
   * @opt_param int pageSize Optional. The maximum number of results returned by
   * this request.
   * @opt_param string pageToken Optional. The continuation token, which is used
   * to page through large result sets. To get the next page of results, set this
   * parameter to the value of `nextPageToken` from the previous response.
   * @return ListTenancyUnitsResponse
   */
  public function listServicesTenancyUnits($parent, $optParams = [])
  {
    $params = ['parent' => $parent];
    $params = array_merge($params, $optParams);
    return $this->call('list', [$params], ListTenancyUnitsResponse::class);
  }
  /**
   * Removes the specified project resource identified by a tenant resource tag.
   * The method removes the project lien with 'TenantManager' origin if that was
   * added. It then attempts to delete the project. If that operation fails, this
   * method also fails. Calls to remove already removed or non-existent tenant
   * project succeed. After the project has been deleted, or if was already in a
   * DELETED state, resource metadata is permanently removed from the tenancy
   * unit. Operation. (tenancyUnits.removeProject)
   *
   * @param string $name Required. Name of the tenancy unit. Such as
   * 'services/service.googleapis.com/projects/12345/tenancyUnits/abcd'.
   * @param RemoveTenantProjectRequest $postBody
   * @param array $optParams Optional parameters.
   * @return Operation
   */
  public function removeProject($name, RemoveTenantProjectRequest $postBody, $optParams = [])
  {
    $params = ['name' => $name, 'postBody' => $postBody];
    $params = array_merge($params, $optParams);
    return $this->call('removeProject', [$params], Operation::class);
  }
  /**
   * Attempts to undelete a previously deleted tenant project. The project must be
   * in a DELETED state. There are no guarantees that an undeleted project will be
   * in a fully restored and functional state. Call the `ApplyTenantProjectConfig`
   * method to update its configuration and then validate all managed service
   * resources. Operation. (tenancyUnits.undeleteProject)
   *
   * @param string $name Required. Name of the tenancy unit. Such as
   * 'services/service.googleapis.com/projects/12345/tenancyUnits/abcd'.
   * @param UndeleteTenantProjectRequest $postBody
   * @param array $optParams Optional parameters.
   * @return Operation
   */
  public function undeleteProject($name, UndeleteTenantProjectRequest $postBody, $optParams = [])
  {
    $params = ['name' => $name, 'postBody' => $postBody];
    $params = array_merge($params, $optParams);
    return $this->call('undeleteProject', [$params], Operation::class);
  }
}

// Adding a class alias for backwards compatibility with the previous class name.
class_alias(ServicesTenancyUnits::class, 'Google_Service_ServiceConsumerManagement_Resource_ServicesTenancyUnits');
