Source code for tenable.cs.uploads

'''
uploads
=======

The uploads methods are abstractions to make uploading an image into Container
Security easier for the user.

Methods available on ``cs.uploads``:

.. rst-class:: hide-signature
.. autoclass:: UploadAPI

    .. automethod:: docker_push
'''
from .base import CSEndpoint
from tenable.errors import PackageMissingError

[docs]class UploadAPI(CSEndpoint):
[docs] def docker_push(self, name, tag=None, cs_name=None, cs_tag=None): ''' Uploads an image into Tenable.io Container Security using docker. Args: name (str): The name of the local docker image. tag (str, optional): The tag for the local docker image. Default is `latest`. cs_name (str, optional): The repository and name for the image in Container Security. If nothing is specified, the default is `library/{name}` cs_tag (str, optional): The tag to apply to the image in Container Security. If nothing is specified, then we will use the current setting of the tag parameter instead. Return: str: The image identifier. ''' # as we may not need to perform this action, we will import and initiate # the docker environment at the time of the push. try: import docker except ImportError: raise PackageMissingError( 'The python package docker is required to use cs.uploads.docker_push') d = docker.from_env(version='auto') self._check('name', name, str) self._check('tag', tag, str) self._check('cs_name', cs_name, str) self._check('cs_tag', cs_tag, str) if not cs_name: cs_name = 'library/{}'.format(name) if not cs_tag: if not tag: cs_tag = tag else: cs_tag = 'latest' # get the image from the docker daemon. image = d.images.get('{}:{}'.format(name, tag) if tag else name) # build the remote tag remote = '{}/{}'.format(self._api._registry, cs_name) # upload the image to CS image.tag(remote, tag=cs_tag) d.images.push(remote, tag=cs_tag, auth_config={ 'username': self._api._access_key, 'password': self._api._secret_key }) d.images.remove('{}:{}'.format(remote, cs_tag)) # return the image id return image.id.split(':')[1][:12]