def AddDockerTag(args): """Adds a Docker tag.""" src_image, version_or_tag = _ParseDockerImage(args.DOCKER_IMAGE, _INVALID_DOCKER_IMAGE_ERROR) if version_or_tag is None: raise ar_exceptions.InvalidInputValueError(_INVALID_DOCKER_IMAGE_ERROR) dest_image, tag = _ParseDockerTag(args.DOCKER_TAG) if src_image.GetPackageName() != dest_image.GetPackageName(): raise ar_exceptions.InvalidInputValueError( "Image {}\ndoes not match image {}".format( src_image.GetDockerString(), dest_image.GetDockerString())) client = ar_requests.GetClient() messages = ar_requests.GetMessages() docker_version = version_or_tag if isinstance(version_or_tag, DockerTag): docker_version = DockerVersion( version_or_tag.image, ar_requests.GetVersionFromTag(client, messages, version_or_tag.GetTagName())) try: ar_requests.GetTag(client, messages, tag.GetTagName()) except api_exceptions.HttpNotFoundError: ar_requests.CreateDockerTag(client, messages, tag, docker_version) else: ar_requests.DeleteTag(client, messages, tag.GetTagName()) ar_requests.CreateDockerTag(client, messages, tag, docker_version) log.status.Print("Added tag [{}] to image [{}].".format( tag.GetDockerString(), args.DOCKER_IMAGE))
def _ValidateAndGetDockerVersion(version_or_tag): """Validates a version_or_tag and returns the validated DockerVersion object. Args: version_or_tag: a docker version or a docker tag. Returns: a DockerVersion object. Raises: ar_exceptions.InvalidInputValueError if version_or_tag is not valid. """ try: if isinstance(version_or_tag, DockerVersion): # We have all the information about the docker digest. # Call the API to make sure it exists. ar_requests.GetVersion(ar_requests.GetClient(), ar_requests.GetMessages(), version_or_tag.GetVersionName()) return version_or_tag elif isinstance(version_or_tag, DockerTag): digest = ar_requests.GetVersionFromTag(ar_requests.GetClient(), ar_requests.GetMessages(), version_or_tag.GetTagName()) docker_version = DockerVersion(version_or_tag.image, digest) return docker_version else: raise ar_exceptions.InvalidInputValueError( _INVALID_DOCKER_IMAGE_ERROR) except api_exceptions.HttpNotFoundError: raise ar_exceptions.InvalidInputValueError(_DOCKER_IMAGE_NOT_FOUND)
def DeleteDockerImage(args): """Deletes a Docker digest or image. If input is an image, delete the image along with its resources. If input is an image identified by digest, delete the digest. If input is an image identified by tag, delete the digest and the tag. If --delete-tags is specified, delete all tags associated with the image digest. Args: args: user input arguments. Returns: The long-running operation from DeletePackage API call. """ image, version_or_tag = _ParseDockerImage(args.IMAGE, _INVALID_IMAGE_ERROR) _ValidateDockerRepo(image.docker_repo.GetRepositoryName()) client = ar_requests.GetClient() messages = ar_requests.GetMessages() if not version_or_tag: console_io.PromptContinue( message="\nThis operation will delete all tags and images for " + image.GetDockerString() + ".", cancel_on_no=True) return ar_requests.DeletePackage(client, messages, image.GetPackageName()) else: tags_to_delete = [] docker_version = version_or_tag if isinstance(version_or_tag, DockerTag): docker_version = DockerVersion( version_or_tag.image, ar_requests.GetVersionFromTag(client, messages, version_or_tag.GetTagName())) tags_to_delete.append(version_or_tag) existing_tags = _GetDockerVersionTags(client, messages, docker_version) if args.delete_tags: tags_to_delete.extend(existing_tags) if len(existing_tags) != len(tags_to_delete): raise ar_exceptions.ArtifactRegistryError( "Cannot delete image {} because it is tagged. " "Existing tags are:\n- {}".format( args.IMAGE, "\n- ".join(tag.GetDockerString() for tag in existing_tags))) _LogResourcesToDelete(docker_version, tags_to_delete) console_io.PromptContinue( message="\nThis operation will delete the above resources.", cancel_on_no=True) for tag in tags_to_delete: ar_requests.DeleteTag(client, messages, tag.GetTagName()) return ar_requests.DeleteVersion(client, messages, docker_version.GetVersionName())
def DeleteDockerImage(args): """Deletes a Docker digest or image. If input is an image, delete the image along with its resources. If input is an image identified by digest, delete the digest. If input is an image identified by tag, delete the digest and the tag. If --delete-tags is specified, delete all tags associated with the image digest. Args: args: user input arguments. Returns: The long-running operation from DeletePackage API call. """ image, version_or_tag = _ParseDockerImage(args.IMAGE, _INVALID_IMAGE_ERROR) client = ar_requests.GetClient() messages = ar_requests.GetMessages() if not version_or_tag: console_io.PromptContinue( message="\nThis operation will delete all tags and images for " + image.GetDockerString() + ".", cancel_on_no=True) return ar_requests.DeletePackage(client, messages, image.GetPackageName()) else: tags_to_delete = [] docker_version = version_or_tag if isinstance(version_or_tag, DockerTag): docker_version = DockerVersion( version_or_tag.image, ar_requests.GetVersionFromTag(client, messages, version_or_tag.GetTagName())) tags_to_delete.append(version_or_tag) if args.delete_tags: tags_to_delete.extend( _GetDockerVersionTags(client, messages, docker_version)) _LogResourcesToDelete(docker_version, tags_to_delete) console_io.PromptContinue( message="\nThis operation will delete the above resources.", cancel_on_no=True) for tag in tags_to_delete: ar_requests.DeleteTag(client, messages, tag.GetTagName()) return ar_requests.DeleteVersion(client, messages, docker_version.GetVersionName())
def _GetDockerDigest(version_or_tag): """Retrieves the docker digest information. Args: version_or_tag: an object of DockerVersion or DockerTag Returns: A dictionary of information about the given docker image. """ docker_version = version_or_tag try: if isinstance(version_or_tag, DockerVersion): # We have all the information about the docker digest. # Call the API to make sure it exists. ar_requests.GetVersion(ar_requests.GetClient(), ar_requests.GetMessages(), version_or_tag.GetVersionName()) elif isinstance(version_or_tag, DockerTag): digest = ar_requests.GetVersionFromTag(ar_requests.GetClient(), ar_requests.GetMessages(), version_or_tag.GetTagName()) docker_version = DockerVersion(version_or_tag.image, digest) else: raise ar_exceptions.InvalidInputValueError( _INVALID_DOCKER_IMAGE_ERROR) except api_exceptions.HttpNotFoundError: raise ar_exceptions.InvalidInputValueError(_DOCKER_IMAGE_NOT_FOUND) return { "digest": docker_version.digest, "fully_qualified_digest": docker_version.GetDockerString(), "registry": "{}-docker.pkg.dev".format(docker_version.image.docker_repo.location), "repository": docker_version.image.docker_repo.repo, }
def ListFiles(args): """Lists files in a given project. Args: args: User input arguments. Returns: List of files. """ client = ar_requests.GetClient() messages = ar_requests.GetMessages() project = GetProject(args) location = args.location or properties.VALUES.artifacts.location.Get() repo = GetRepo(args) package = args.package version = args.version tag = args.tag page_size = args.page_size arg_filters = "" # Parse fully qualified path in package argument if package: if re.match( r"projects\/.*\/locations\/.*\/repositories\/.*\/packages\/.*", package): params = package.replace("projects/", "", 1).replace( "/locations/", " ", 1).replace("/repositories/", " ", 1).replace("/packages/", " ", 1).split(" ") project, location, repo, package = [ params[i] for i in range(len(params)) ] # Escape slashes in package name if package: package = package.replace("/", "%2F") # Retrieve version from tag name if version and tag: raise ar_exceptions.InvalidInputValueError( "Specify either --version or --tag with --package argument.") if package and tag: tag_path = resources.Resource.RelativeName( resources.REGISTRY.Create( "artifactregistry.projects.locations.repositories.packages.tags", projectsId=project, locationsId=location, repositoriesId=repo, packagesId=package, tagsId=tag)) version = ar_requests.GetVersionFromTag(client, messages, tag_path) if package and version: version_path = resources.Resource.RelativeName( resources.REGISTRY.Create( "artifactregistry.projects.locations.repositories.packages.versions", projectsId=project, locationsId=location, repositoriesId=repo, packagesId=package, versionsId=version)) arg_filters = 'owner="{}"'.format(version_path) elif package: package_path = resources.Resource.RelativeName( resources.REGISTRY.Create( "artifactregistry.projects.locations.repositories.packages", projectsId=project, locationsId=location, repositoriesId=repo, packagesId=package)) arg_filters = 'owner="{}"'.format(package_path) elif version or tag: raise ar_exceptions.InvalidInputValueError( "Package name is required when specifying version or tag.") repo_path = resources.Resource.RelativeName( resources.REGISTRY.Create( "artifactregistry.projects.locations.repositories", projectsId=project, locationsId=location, repositoriesId=repo)) files = ar_requests.ListFiles(client, messages, repo_path, arg_filters, page_size) for file in files: file.name = resources.REGISTRY.ParseRelativeName( file.name, collection="artifactregistry.projects.locations.repositories.files" ).filesId.replace("%2F", "/") return files