97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
# 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.
|
|
import contextlib
|
|
import re
|
|
import six
|
|
import sys
|
|
import tarfile
|
|
|
|
import docker
|
|
from docker import errors
|
|
from oslo_utils import encodeutils
|
|
|
|
from zun.common import exception
|
|
import zun.conf
|
|
|
|
CONF = zun.conf.CONF
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def docker_client():
|
|
client_kwargs = dict()
|
|
if not CONF.docker.api_insecure:
|
|
client_kwargs['ca_cert'] = CONF.docker.ca_file
|
|
client_kwargs['client_key'] = CONF.docker.key_file
|
|
client_kwargs['client_cert'] = CONF.docker.key_file
|
|
|
|
try:
|
|
yield DockerHTTPClient(
|
|
CONF.docker.api_url,
|
|
CONF.docker.docker_remote_api_version,
|
|
CONF.docker.default_timeout,
|
|
**client_kwargs
|
|
)
|
|
except errors.APIError as e:
|
|
desired_exc = exception.DockerError(error_msg=six.text_type(e))
|
|
six.reraise(type(desired_exc), desired_exc, sys.exc_info()[2])
|
|
|
|
|
|
class DockerHTTPClient(docker.APIClient):
|
|
def __init__(self, url=CONF.docker.api_url,
|
|
ver=CONF.docker.docker_remote_api_version,
|
|
timeout=CONF.docker.default_timeout,
|
|
ca_cert=None,
|
|
client_key=None,
|
|
client_cert=None):
|
|
|
|
if ca_cert and client_key and client_cert:
|
|
ssl_config = docker.tls.TLSConfig(
|
|
client_cert=(client_cert, client_key),
|
|
verify=ca_cert,
|
|
assert_hostname=False,
|
|
)
|
|
else:
|
|
ssl_config = False
|
|
|
|
super(DockerHTTPClient, self).__init__(
|
|
base_url=url,
|
|
version=ver,
|
|
timeout=timeout,
|
|
tls=ssl_config
|
|
)
|
|
|
|
def list_instances(self, inspect=False):
|
|
"""List all containers."""
|
|
res = []
|
|
for container in self.containers(all=True):
|
|
info = self.inspect_container(container['Id'])
|
|
if not info:
|
|
continue
|
|
if inspect:
|
|
res.append(info)
|
|
else:
|
|
res.append(info['Config'].get('Hostname'))
|
|
return res
|
|
|
|
def list_containers(self):
|
|
return self.containers(all=True, filters={'name': 'zun-'})
|
|
|
|
def read_tar_image(self, image_path=None):
|
|
with tarfile.open(image_path, 'r') as fil:
|
|
fest = fil.extractfile('manifest.json')
|
|
data = fest.read()
|
|
find_repotag = re.search('\"RepoTags\":\[\"(.+?)\"\]',
|
|
encodeutils.safe_decode(data))
|
|
if find_repotag:
|
|
repo, tag = find_repotag.group(1).split(":")
|
|
return repo, tag
|