# -*- coding: utf-8 -*- # # Copyright 2015 Google LLC. 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. """SourceRepo APIs layer. Parse methods accepts strings from command-line arguments, and it can accept more formats like "https://...". Get methods are strict about the arguments. """ from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals from apitools.base.py import list_pager from googlecloudsdk.api_lib.util import apis from googlecloudsdk.core import exceptions as core_exceptions from googlecloudsdk.core import properties from googlecloudsdk.core import resources import six class RepoResourceError(core_exceptions.Error): """Raised when a repo could not be parsed.""" def ParseRepo(repo): """Parse a string as a sourcerepo.projects.repos resource.""" try: return resources.REGISTRY.Parse( repo, params={'projectsId': properties.VALUES.core.project.GetOrFail}, collection='sourcerepo.projects.repos') except core_exceptions.Error as e: raise RepoResourceError(six.text_type(e)) def GetDefaultProject(): """Create a sourcerepo.projects resource of the default project.""" return resources.REGISTRY.Create( 'sourcerepo.projects', projectsId=properties.VALUES.core.project.GetOrFail()) class Source(object): """Base class for sourcerepo api wrappers.""" def __init__(self, client=None): if client is None: client = apis.GetClientInstance('sourcerepo', 'v1') self._client = client self.messages = apis.GetMessagesModule('sourcerepo', 'v1') def GetIamPolicy(self, repo_resource): """Gets IAM policy for a repo. Args: repo_resource: The repo resource with collection type sourcerepo.projects.repos Returns: (messages.Policy) The IAM policy. """ request = self.messages.SourcerepoProjectsReposGetIamPolicyRequest( resource=repo_resource.RelativeName()) return self._client.projects_repos.GetIamPolicy(request) def SetIamPolicy(self, repo_resource, policy): """Sets the IAM policy from a policy string. Args: repo_resource: The repo as a resource with colleciton type sourcerepo.projects.repos policy: (string) The file containing the new IAM policy. Returns: (messages.Policy) The IAM policy. """ req = self.messages.SetIamPolicyRequest(policy=policy) request = self.messages.SourcerepoProjectsReposSetIamPolicyRequest( resource=repo_resource.RelativeName(), setIamPolicyRequest=req) return self._client.projects_repos.SetIamPolicy(request) def ListRepos(self, project_resource, limit=None, page_size=None): """Returns list of repos.""" return list_pager.YieldFromList( self._client.projects_repos, self.messages.SourcerepoProjectsReposListRequest( name=project_resource.RelativeName()), limit=limit, batch_size_attribute='pageSize', batch_size=page_size, field='repos') def GetRepo(self, repo_resource): """Finds details on the named repo, if it exists. Args: repo_resource: (Resource) A resource representing the repo to create. Returns: (messages.Repo) The full definition of the new repo, as reported by the server. Returns None if the repo does not exist. """ request = self.messages.SourcerepoProjectsReposGetRequest( name=repo_resource.RelativeName()) return self._client.projects_repos.Get(request) def CreateRepo(self, repo_resource): """Creates a repo. Args: repo_resource: (Resource) A resource representing the repo to create. Returns: (messages.Repo) The full definition of the new repo, as reported by the server. """ parent = resources.REGISTRY.Create( 'sourcerepo.projects', projectsId=repo_resource.projectsId) request = self.messages.SourcerepoProjectsReposCreateRequest( parent=parent.RelativeName(), repo=self.messages.Repo(name=repo_resource.RelativeName())) return self._client.projects_repos.Create(request) def DeleteRepo(self, repo_resource): """Deletes a repo. Args: repo_resource: (Resource) A resource representing the repo to create. """ request = self.messages.SourcerepoProjectsReposDeleteRequest( name=repo_resource.RelativeName()) self._client.projects_repos.Delete(request) def PatchRepo(self, repo, update_mask='pubsubConfigs'): """Updates a repo's configuration.""" req = self.messages.SourcerepoProjectsReposPatchRequest( name=repo.name, updateRepoRequest=self.messages.UpdateRepoRequest( repo=repo, updateMask=update_mask)) return self._client.projects_repos.Patch(req)