summaryrefslogtreecommitdiffstats
path: root/roles/lib_openshift/library/oc_adm_router.py
diff options
context:
space:
mode:
authorScott Dodson <sdodson@redhat.com>2017-02-23 09:02:28 -0500
committerGitHub <noreply@github.com>2017-02-23 09:02:28 -0500
commitc8e8a798a5c1695fd497833f4dcd263ff9414e87 (patch)
tree0759f476a1253f39529abd27d1e31815a87b8a48 /roles/lib_openshift/library/oc_adm_router.py
parenta395b2b4d6cfd65e1a2fb45a75d72a0c1d9c65bc (diff)
parenta3603a5187839e25e9d8a51de70fea0b68439839 (diff)
downloadopenshift-c8e8a798a5c1695fd497833f4dcd263ff9414e87.tar.gz
openshift-c8e8a798a5c1695fd497833f4dcd263ff9414e87.tar.bz2
openshift-c8e8a798a5c1695fd497833f4dcd263ff9414e87.tar.xz
openshift-c8e8a798a5c1695fd497833f4dcd263ff9414e87.zip
Merge pull request #3416 from detiber/combinedTest
lib_openshift - handle cases where oc binary is not in path
Diffstat (limited to 'roles/lib_openshift/library/oc_adm_router.py')
-rw-r--r--roles/lib_openshift/library/oc_adm_router.py39
1 files changed, 34 insertions, 5 deletions
diff --git a/roles/lib_openshift/library/oc_adm_router.py b/roles/lib_openshift/library/oc_adm_router.py
index 445279ed1..a9e76a92e 100644
--- a/roles/lib_openshift/library/oc_adm_router.py
+++ b/roles/lib_openshift/library/oc_adm_router.py
@@ -898,6 +898,32 @@ class OpenShiftCLIError(Exception):
pass
+ADDITIONAL_PATH_LOOKUPS = ['/usr/local/bin', os.path.expanduser('~/bin')]
+
+
+def locate_oc_binary():
+ ''' Find and return oc binary file '''
+ # https://github.com/openshift/openshift-ansible/issues/3410
+ # oc can be in /usr/local/bin in some cases, but that may not
+ # be in $PATH due to ansible/sudo
+ paths = os.environ.get("PATH", os.defpath).split(os.pathsep) + ADDITIONAL_PATH_LOOKUPS
+
+ oc_binary = 'oc'
+
+ # Use shutil.which if it is available, otherwise fallback to a naive path search
+ try:
+ which_result = shutil.which(oc_binary, path=os.pathsep.join(paths))
+ if which_result is not None:
+ oc_binary = which_result
+ except AttributeError:
+ for path in paths:
+ if os.path.exists(os.path.join(path, oc_binary)):
+ oc_binary = os.path.join(path, oc_binary)
+ break
+
+ return oc_binary
+
+
# pylint: disable=too-few-public-methods
class OpenShiftCLI(object):
''' Class to wrap the command line tools '''
@@ -911,6 +937,7 @@ class OpenShiftCLI(object):
self.verbose = verbose
self.kubeconfig = Utils.create_tmpfile_copy(kubeconfig)
self.all_namespaces = all_namespaces
+ self.oc_binary = locate_oc_binary()
# Pylint allows only 5 arguments to be passed.
# pylint: disable=too-many-arguments
@@ -1112,11 +1139,10 @@ class OpenShiftCLI(object):
# pylint: disable=too-many-arguments,too-many-branches
def openshift_cmd(self, cmd, oadm=False, output=False, output_type='json', input_data=None):
'''Base command for oc '''
- cmds = []
+ cmds = [self.oc_binary]
+
if oadm:
- cmds = ['oadm']
- else:
- cmds = ['oc']
+ cmds.append('adm')
if self.all_namespaces:
cmds.extend(['--all-namespaces'])
@@ -1132,7 +1158,10 @@ class OpenShiftCLI(object):
if self.verbose:
print(' '.join(cmds))
- returncode, stdout, stderr = self._run(cmds, input_data)
+ try:
+ returncode, stdout, stderr = self._run(cmds, input_data)
+ except OSError as ex:
+ returncode, stdout, stderr = 1, '', 'Failed to execute {}: {}'.format(subprocess.list2cmdline(cmds), ex)
rval = {"returncode": returncode,
"results": results,