diff options
Diffstat (limited to 'roles/openshift_cli')
| -rw-r--r-- | roles/openshift_cli/defaults/main.yml | 2 | ||||
| -rw-r--r-- | roles/openshift_cli/library/openshift_container_binary_sync.py | 205 | ||||
| -rw-r--r-- | roles/openshift_cli/meta/main.yml | 1 | ||||
| -rw-r--r-- | roles/openshift_cli/tasks/main.yml | 10 | 
4 files changed, 8 insertions, 210 deletions
| diff --git a/roles/openshift_cli/defaults/main.yml b/roles/openshift_cli/defaults/main.yml index 631a0455e..9faec639f 100644 --- a/roles/openshift_cli/defaults/main.yml +++ b/roles/openshift_cli/defaults/main.yml @@ -8,4 +8,4 @@ system_images_registry: "{{ system_images_registry_dict[openshift_deployment_typ  openshift_use_crio_only: False  l_is_system_container_image: "{{ openshift_use_master_system_container | default(openshift_use_system_containers | default(False)) | bool }}" -l_use_cli_atomic_image: "{{ openshift_use_crio_only or l_is_system_container_image }}" +l_use_cli_atomic_image: "{{ (openshift_use_crio_only | bool) or (l_is_system_container_image | bool) }}" diff --git a/roles/openshift_cli/library/openshift_container_binary_sync.py b/roles/openshift_cli/library/openshift_container_binary_sync.py deleted file mode 100644 index 440b8ec28..000000000 --- a/roles/openshift_cli/library/openshift_container_binary_sync.py +++ /dev/null @@ -1,205 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# pylint: disable=missing-docstring,invalid-name - -import random -import tempfile -import shutil -import os.path - -# pylint: disable=redefined-builtin,wildcard-import,unused-wildcard-import -from ansible.module_utils.basic import *  # noqa: F403 - - -DOCUMENTATION = ''' ---- -module: openshift_container_binary_sync -short_description: Copies OpenShift binaries out of the given image tag to host system. -''' - - -class BinarySyncError(Exception): -    def __init__(self, msg): -        super(BinarySyncError, self).__init__(msg) -        self.msg = msg - - -# pylint: disable=too-few-public-methods,too-many-instance-attributes -class BinarySyncer(object): -    """ -    Syncs the openshift, oc, and kubectl binaries/symlinks out of -    a container onto the host system. -    """ - -    def __init__(self, module, image, tag, backend): -        self.module = module -        self.changed = False -        self.output = [] -        self.bin_dir = '/usr/local/bin' -        self._image = image -        self.tag = tag -        self.backend = backend -        self.temp_dir = None  # TBD - -    def sync(self): -        if self.backend == 'atomic': -            return self._sync_atomic() - -        return self._sync_docker() - -    def _sync_atomic(self): -        self.temp_dir = tempfile.mkdtemp() -        temp_dir_mount = tempfile.mkdtemp() -        try: -            image_spec = '%s:%s' % (self.image, self.tag) -            rc, stdout, stderr = self.module.run_command(['atomic', 'mount', -                                                          '--storage', "ostree", -                                                          image_spec, temp_dir_mount]) -            if rc: -                raise BinarySyncError("Error mounting image. stdout=%s, stderr=%s" % -                                      (stdout, stderr)) -            for i in ["openshift", "oc"]: -                src_file = os.path.join(temp_dir_mount, "usr/bin", i) -                shutil.copy(src_file, self.temp_dir) - -            self._sync_binaries() -        finally: -            self.module.run_command(['atomic', 'umount', temp_dir_mount]) -            shutil.rmtree(temp_dir_mount) -            shutil.rmtree(self.temp_dir) - -    def _sync_docker(self): -        container_name = "openshift-cli-%s" % random.randint(1, 100000) -        rc, stdout, stderr = self.module.run_command(['docker', 'create', '--name', -                                                      container_name, '%s:%s' % (self.image, self.tag)]) -        if rc: -            raise BinarySyncError("Error creating temporary docker container. stdout=%s, stderr=%s" % -                                  (stdout, stderr)) -        self.output.append(stdout) -        try: -            self.temp_dir = tempfile.mkdtemp() -            self.output.append("Using temp dir: %s" % self.temp_dir) - -            rc, stdout, stderr = self.module.run_command(['docker', 'cp', "%s:/usr/bin/openshift" % container_name, -                                                          self.temp_dir]) -            if rc: -                raise BinarySyncError("Error copying file from docker container: stdout=%s, stderr=%s" % -                                      (stdout, stderr)) - -            rc, stdout, stderr = self.module.run_command(['docker', 'cp', "%s:/usr/bin/oc" % container_name, -                                                          self.temp_dir]) -            if rc: -                raise BinarySyncError("Error copying file from docker container: stdout=%s, stderr=%s" % -                                      (stdout, stderr)) - -            self._sync_binaries() -        finally: -            shutil.rmtree(self.temp_dir) -            self.module.run_command(['docker', 'rm', container_name]) - -    def _sync_binaries(self): -        self._sync_binary('openshift') - -        # In older versions, oc was a symlink to openshift: -        if os.path.islink(os.path.join(self.temp_dir, 'oc')): -            self._sync_symlink('oc', 'openshift') -        else: -            self._sync_binary('oc') - -        # Ensure correct symlinks created: -        self._sync_symlink('kubectl', 'openshift') - -        # Remove old oadm binary -        if os.path.exists(os.path.join(self.bin_dir, 'oadm')): -            os.remove(os.path.join(self.bin_dir, 'oadm')) - -    def _sync_symlink(self, binary_name, link_to): -        """ Ensure the given binary name exists and links to the expected binary. """ - -        # The symlink we are creating: -        link_path = os.path.join(self.bin_dir, binary_name) - -        # The expected file we should be linking to: -        link_dest = os.path.join(self.bin_dir, link_to) - -        if not os.path.exists(link_path) or \ -                not os.path.islink(link_path) or \ -                os.path.realpath(link_path) != os.path.realpath(link_dest): -            if os.path.exists(link_path): -                os.remove(link_path) -            os.symlink(link_to, os.path.join(self.bin_dir, binary_name)) -            self.output.append("Symlinked %s to %s." % (link_path, link_dest)) -            self.changed = True - -    def _sync_binary(self, binary_name): -        src_path = os.path.join(self.temp_dir, binary_name) -        dest_path = os.path.join(self.bin_dir, binary_name) -        incoming_checksum = self.module.run_command(['sha256sum', src_path])[1] -        if not os.path.exists(dest_path) or self.module.run_command(['sha256sum', dest_path])[1] != incoming_checksum: - -            # See: https://github.com/openshift/openshift-ansible/issues/4965 -            if os.path.islink(dest_path): -                os.unlink(dest_path) -                self.output.append('Removed old symlink {} before copying binary.'.format(dest_path)) -            shutil.move(src_path, dest_path) -            self.output.append("Moved %s to %s." % (src_path, dest_path)) -            self.changed = True - -    @property -    def raw_image(self): -        """ -        Returns the image as it was originally passed in to the instance. - -        .. note:: -           This image string will only work directly with the atomic command. - -        :returns: The original image passed in. -        :rtype: str -        """ -        return self._image - -    @property -    def image(self): -        """ -        Returns the image without atomic prefixes used to map to skopeo args. - -        :returns: The image string without prefixes -        :rtype: str -        """ -        image = self._image -        for remove in ('oci:', 'http:', 'https:'): -            if image.startswith(remove): -                image = image.replace(remove, '') -        return image - - -def main(): -    module = AnsibleModule(  # noqa: F405 -        argument_spec=dict( -            image=dict(required=True), -            tag=dict(required=True), -            backend=dict(required=True), -        ), -        supports_check_mode=True -    ) - -    image = module.params['image'] -    tag = module.params['tag'] -    backend = module.params['backend'] - -    if backend not in ["docker", "atomic"]: -        module.fail_json(msg="unknown backend") - -    binary_syncer = BinarySyncer(module, image, tag, backend) - -    try: -        binary_syncer.sync() -    except BinarySyncError as ex: -        module.fail_json(msg=ex.msg) - -    return module.exit_json(changed=binary_syncer.changed, -                            output=binary_syncer.output) - - -if __name__ == '__main__': -    main() diff --git a/roles/openshift_cli/meta/main.yml b/roles/openshift_cli/meta/main.yml index 5d2b6abed..e531543b9 100644 --- a/roles/openshift_cli/meta/main.yml +++ b/roles/openshift_cli/meta/main.yml @@ -13,3 +13,4 @@ galaxy_info:    - cloud  dependencies:  - role: openshift_facts +- role: lib_utils diff --git a/roles/openshift_cli/tasks/main.yml b/roles/openshift_cli/tasks/main.yml index 68d82e436..ae8d1ace0 100644 --- a/roles/openshift_cli/tasks/main.yml +++ b/roles/openshift_cli/tasks/main.yml @@ -1,7 +1,7 @@  ---  - name: Install clients    package: name={{ openshift_service_type }}-clients{{ openshift_pkg_version | default('') }} state=present -  when: not openshift.common.is_containerized | bool +  when: not openshift_is_containerized | bool    register: result    until: result is succeeded @@ -12,13 +12,14 @@      register: pull_result      changed_when: "'Downloaded newer image' in pull_result.stdout" +  # openshift_container_binary_sync is a custom module in lib_utils    - name: Copy client binaries/symlinks out of CLI image for use on the host      openshift_container_binary_sync:        image: "{{ openshift_cli_image }}"        tag: "{{ openshift_image_tag }}"        backend: "docker"    when: -  - openshift.common.is_containerized | bool +  - openshift_is_containerized | bool    - not l_use_cli_atomic_image | bool  - block: @@ -28,13 +29,14 @@      register: pull_result      changed_when: "'Pulling layer' in pull_result.stdout" +  # openshift_container_binary_sync is a custom module in lib_utils    - name: Copy client binaries/symlinks out of CLI image for use on the host      openshift_container_binary_sync:        image: "{{ '' if system_images_registry == 'docker' else system_images_registry + '/' }}{{ openshift_cli_image }}"        tag: "{{ openshift_image_tag }}"        backend: "atomic"    when: -  - openshift.common.is_containerized | bool +  - openshift_is_containerized | bool    - l_use_cli_atomic_image | bool  - name: Reload facts to pick up installed OpenShift version @@ -42,6 +44,6 @@  - name: Install bash completion for oc tools    package: name=bash-completion state=present -  when: not openshift.common.is_containerized | bool +  when: not openshift_is_containerized | bool    register: result    until: result is succeeded | 
