All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.gcloud.resourcemanager.ResourceManagerImpl Maven / Gradle / Ivy

/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * 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.
 */

package com.google.gcloud.resourcemanager;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.gcloud.RetryHelper.runWithRetries;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.gcloud.BaseService;
import com.google.gcloud.Page;
import com.google.gcloud.PageImpl;
import com.google.gcloud.PageImpl.NextPageFetcher;
import com.google.gcloud.RetryHelper.RetryHelperException;
import com.google.gcloud.resourcemanager.spi.ResourceManagerRpc;
import com.google.gcloud.resourcemanager.spi.ResourceManagerRpc.Tuple;

import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

final class ResourceManagerImpl
    extends BaseService implements ResourceManager {

  private final ResourceManagerRpc resourceManagerRpc;

  ResourceManagerImpl(ResourceManagerOptions options) {
    super(options);
    resourceManagerRpc = options.rpc();
  }

  @Override
  public Project create(final ProjectInfo project) {
    try {
      return Project.fromPb(this, runWithRetries(
          new Callable() {
            @Override
            public com.google.api.services.cloudresourcemanager.model.Project call() {
              return resourceManagerRpc.create(project.toPb());
            }
          }, options().retryParams(), EXCEPTION_HANDLER));
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  @Override
  public void delete(final String projectId) {
    try {
      runWithRetries(new Callable() {
        @Override
        public Void call() {
          resourceManagerRpc.delete(projectId);
          return null;
        }
      }, options().retryParams(), EXCEPTION_HANDLER);
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  @Override
  public Project get(final String projectId, ProjectGetOption... options) {
    final Map optionsMap = optionMap(options);
    try {
      com.google.api.services.cloudresourcemanager.model.Project answer = runWithRetries(
          new Callable() {
            @Override
            public com.google.api.services.cloudresourcemanager.model.Project call() {
              return resourceManagerRpc.get(projectId, optionsMap);
            }
          }, options().retryParams(), EXCEPTION_HANDLER);
      return answer == null ? null : Project.fromPb(this, answer);
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  private static class ProjectPageFetcher implements NextPageFetcher {

    private static final long serialVersionUID = 2158209410430566961L;
    private final Map requestOptions;
    private final ResourceManagerOptions serviceOptions;

    ProjectPageFetcher(ResourceManagerOptions serviceOptions, String cursor,
        Map optionMap) {
      this.requestOptions =
          PageImpl.nextRequestOptions(ResourceManagerRpc.Option.PAGE_TOKEN, cursor, optionMap);
      this.serviceOptions = serviceOptions;
    }

    @Override
    public Page nextPage() {
      return listProjects(serviceOptions, requestOptions);
    }
  }

  @Override
  public Page list(ProjectListOption... options) {
    return listProjects(options(), optionMap(options));
  }

  private static Page listProjects(final ResourceManagerOptions serviceOptions,
      final Map optionsMap) {
    try {
      Tuple> result =
          runWithRetries(new Callable>>() {
                @Override
                public Tuple> call() {
                  return serviceOptions.rpc().list(optionsMap);
                }
              },
              serviceOptions.retryParams(), EXCEPTION_HANDLER);
      String cursor = result.x();
      Iterable projects =
          result.y() == null
              ? ImmutableList.of() : Iterables.transform(
                  result.y(),
                  new Function() {
                    @Override
                    public Project apply(
                        com.google.api.services.cloudresourcemanager.model.Project projectPb) {
                      return new Project(
                          serviceOptions.service(),
                          new ProjectInfo.BuilderImpl(ProjectInfo.fromPb(projectPb)));
                    }
                  });
      return new PageImpl<>(
          new ProjectPageFetcher(serviceOptions, cursor, optionsMap), cursor, projects);
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  @Override
  public Project replace(final ProjectInfo newProject) {
    try {
      return Project.fromPb(this, runWithRetries(
          new Callable() {
            @Override
            public com.google.api.services.cloudresourcemanager.model.Project call() {
              return resourceManagerRpc.replace(newProject.toPb());
            }
          }, options().retryParams(), EXCEPTION_HANDLER));
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  @Override
  public void undelete(final String projectId) {
    try {
      runWithRetries(new Callable() {
        @Override
        public Void call() {
          resourceManagerRpc.undelete(projectId);
          return null;
        }
      }, options().retryParams(), EXCEPTION_HANDLER);
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  @Override
  public Policy getPolicy(final String projectId) {
    try {
      com.google.api.services.cloudresourcemanager.model.Policy answer =
          runWithRetries(
              new Callable() {
                @Override
                public com.google.api.services.cloudresourcemanager.model.Policy call() {
                  return resourceManagerRpc.getPolicy(projectId);
                }
              }, options().retryParams(), EXCEPTION_HANDLER);
      return answer == null ? null : Policy.fromPb(answer);
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  @Override
  public Policy replacePolicy(final String projectId, final Policy newPolicy) {
    try {
      return Policy.fromPb(runWithRetries(
          new Callable() {
            @Override
            public com.google.api.services.cloudresourcemanager.model.Policy call() {
              return resourceManagerRpc.replacePolicy(projectId, newPolicy.toPb());
            }
          }, options().retryParams(), EXCEPTION_HANDLER));
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  @Override
  public List testPermissions(final String projectId, final List permissions) {
    try {
      return runWithRetries(
          new Callable>() {
            @Override
            public List call() {
              return resourceManagerRpc.testPermissions(projectId, permissions);
            }
          }, options().retryParams(), EXCEPTION_HANDLER);
    } catch (RetryHelperException ex) {
      throw ResourceManagerException.translateAndThrow(ex);
    }
  }

  private Map optionMap(Option... options) {
    Map temp = Maps.newEnumMap(ResourceManagerRpc.Option.class);
    for (Option option : options) {
      Object prev = temp.put(option.rpcOption(), option.value());
      checkArgument(prev == null, "Duplicate option %s", option);
    }
    return ImmutableMap.copyOf(temp);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy