summaryrefslogtreecommitdiffstats
path: root/roles/lib_openshift
diff options
context:
space:
mode:
authorKenny Woodson <kwoodson@redhat.com>2017-01-23 17:09:19 -0500
committerKenny Woodson <kwoodson@redhat.com>2017-01-25 14:19:08 -0500
commit6beef83cd9c2d76c0b4bdff1208d64a41d17818e (patch)
tree0901bdd2941cafe84593cd037f7659ed2a92f2cc /roles/lib_openshift
parent9b7a409745abae6a837ff1e177e5220bcac4d938 (diff)
downloadopenshift-6beef83cd9c2d76c0b4bdff1208d64a41d17818e.tar.gz
openshift-6beef83cd9c2d76c0b4bdff1208d64a41d17818e.tar.bz2
openshift-6beef83cd9c2d76c0b4bdff1208d64a41d17818e.tar.xz
openshift-6beef83cd9c2d76c0b4bdff1208d64a41d17818e.zip
Adding integration test for oc_scale.
Diffstat (limited to 'roles/lib_openshift')
-rw-r--r--roles/lib_openshift/library/oc_edit.py5
-rw-r--r--roles/lib_openshift/library/oc_obj.py5
-rw-r--r--roles/lib_openshift/library/oc_route.py5
-rw-r--r--roles/lib_openshift/library/oc_scale.py357
-rw-r--r--roles/lib_openshift/library/oc_version.py5
-rw-r--r--roles/lib_openshift/src/ansible/oc_scale.py2
-rw-r--r--roles/lib_openshift/src/class/oc_scale.py1
-rw-r--r--roles/lib_openshift/src/lib/base.py5
-rw-r--r--roles/lib_openshift/src/lib/deploymentconfig.py337
-rw-r--r--roles/lib_openshift/src/lib/replicationcontroller.py14
-rw-r--r--roles/lib_openshift/src/sources.yml2
-rwxr-xr-xroles/lib_openshift/src/test/integration/oc_scale.yml79
12 files changed, 794 insertions, 23 deletions
diff --git a/roles/lib_openshift/library/oc_edit.py b/roles/lib_openshift/library/oc_edit.py
index 2338d5e8e..ad158e56a 100644
--- a/roles/lib_openshift/library/oc_edit.py
+++ b/roles/lib_openshift/library/oc_edit.py
@@ -842,12 +842,11 @@ class OpenShiftCLI(object):
cmd = ['get', resource]
if selector:
cmd.append('--selector=%s' % selector)
+ elif rname:
+ cmd.append(rname)
cmd.extend(['-o', 'json'])
- if rname:
- cmd.append(rname)
-
rval = self.openshift_cmd(cmd, output=True)
# Ensure results are retuned in an array
diff --git a/roles/lib_openshift/library/oc_obj.py b/roles/lib_openshift/library/oc_obj.py
index ac24c35ca..b5ccfe700 100644
--- a/roles/lib_openshift/library/oc_obj.py
+++ b/roles/lib_openshift/library/oc_obj.py
@@ -821,12 +821,11 @@ class OpenShiftCLI(object):
cmd = ['get', resource]
if selector:
cmd.append('--selector=%s' % selector)
+ elif rname:
+ cmd.append(rname)
cmd.extend(['-o', 'json'])
- if rname:
- cmd.append(rname)
-
rval = self.openshift_cmd(cmd, output=True)
# Ensure results are retuned in an array
diff --git a/roles/lib_openshift/library/oc_route.py b/roles/lib_openshift/library/oc_route.py
index f5d6c3dfe..fb51367fc 100644
--- a/roles/lib_openshift/library/oc_route.py
+++ b/roles/lib_openshift/library/oc_route.py
@@ -846,12 +846,11 @@ class OpenShiftCLI(object):
cmd = ['get', resource]
if selector:
cmd.append('--selector=%s' % selector)
+ elif rname:
+ cmd.append(rname)
cmd.extend(['-o', 'json'])
- if rname:
- cmd.append(rname)
-
rval = self.openshift_cmd(cmd, output=True)
# Ensure results are retuned in an array
diff --git a/roles/lib_openshift/library/oc_scale.py b/roles/lib_openshift/library/oc_scale.py
index d9a12e00c..39afa6ba8 100644
--- a/roles/lib_openshift/library/oc_scale.py
+++ b/roles/lib_openshift/library/oc_scale.py
@@ -782,12 +782,11 @@ class OpenShiftCLI(object):
cmd = ['get', resource]
if selector:
cmd.append('--selector=%s' % selector)
+ elif rname:
+ cmd.append(rname)
cmd.extend(['-o', 'json'])
- if rname:
- cmd.append(rname)
-
rval = self.openshift_cmd(cmd, output=True)
# Ensure results are retuned in an array
@@ -1192,6 +1191,355 @@ class OpenShiftCLIConfig(object):
return rval
+# pylint: disable=too-many-public-methods
+class DeploymentConfig(Yedit):
+ ''' Class to wrap the oc command line tools '''
+ default_deployment_config = '''
+apiVersion: v1
+kind: DeploymentConfig
+metadata:
+ name: default_dc
+ namespace: default
+spec:
+ replicas: 0
+ selector:
+ default_dc: default_dc
+ strategy:
+ resources: {}
+ rollingParams:
+ intervalSeconds: 1
+ maxSurge: 0
+ maxUnavailable: 25%
+ timeoutSeconds: 600
+ updatePercent: -25
+ updatePeriodSeconds: 1
+ type: Rolling
+ template:
+ metadata:
+ spec:
+ containers:
+ - env:
+ - name: default
+ value: default
+ image: default
+ imagePullPolicy: IfNotPresent
+ name: default_dc
+ ports:
+ - containerPort: 8000
+ hostPort: 8000
+ protocol: TCP
+ name: default_port
+ resources: {}
+ terminationMessagePath: /dev/termination-log
+ dnsPolicy: ClusterFirst
+ hostNetwork: true
+ nodeSelector:
+ type: compute
+ restartPolicy: Always
+ securityContext: {}
+ serviceAccount: default
+ serviceAccountName: default
+ terminationGracePeriodSeconds: 30
+ triggers:
+ - type: ConfigChange
+'''
+
+ replicas_path = "spec.replicas"
+ env_path = "spec.template.spec.containers[0].env"
+ volumes_path = "spec.template.spec.volumes"
+ container_path = "spec.template.spec.containers"
+ volume_mounts_path = "spec.template.spec.containers[0].volumeMounts"
+
+ def __init__(self, content=None):
+ ''' Constructor for OpenshiftOC '''
+ if not content:
+ content = DeploymentConfig.default_deployment_config
+
+ super(DeploymentConfig, self).__init__(content=content)
+
+ # pylint: disable=no-member
+ def add_env_value(self, key, value):
+ ''' add key, value pair to env array '''
+ rval = False
+ env = self.get_env_vars()
+ if env:
+ env.append({'name': key, 'value': value})
+ rval = True
+ else:
+ result = self.put(DeploymentConfig.env_path, {'name': key, 'value': value})
+ rval = result[0]
+
+ return rval
+
+ def exists_env_value(self, key, value):
+ ''' return whether a key, value pair exists '''
+ results = self.get_env_vars()
+ if not results:
+ return False
+
+ for result in results:
+ if result['name'] == key and result['value'] == value:
+ return True
+
+ return False
+
+ def exists_env_key(self, key):
+ ''' return whether a key, value pair exists '''
+ results = self.get_env_vars()
+ if not results:
+ return False
+
+ for result in results:
+ if result['name'] == key:
+ return True
+
+ return False
+
+ def get_env_vars(self):
+ '''return a environment variables '''
+ return self.get(DeploymentConfig.env_path) or []
+
+ def delete_env_var(self, keys):
+ '''delete a list of keys '''
+ if not isinstance(keys, list):
+ keys = [keys]
+
+ env_vars_array = self.get_env_vars()
+ modified = False
+ idx = None
+ for key in keys:
+ for env_idx, env_var in enumerate(env_vars_array):
+ if env_var['name'] == key:
+ idx = env_idx
+ break
+
+ if idx:
+ modified = True
+ del env_vars_array[idx]
+
+ if modified:
+ return True
+
+ return False
+
+ def update_env_var(self, key, value):
+ '''place an env in the env var list'''
+
+ env_vars_array = self.get_env_vars()
+ idx = None
+ for env_idx, env_var in enumerate(env_vars_array):
+ if env_var['name'] == key:
+ idx = env_idx
+ break
+
+ if idx:
+ env_vars_array[idx]['value'] = value
+ else:
+ self.add_env_value(key, value)
+
+ return True
+
+ def exists_volume_mount(self, volume_mount):
+ ''' return whether a volume mount exists '''
+ exist_volume_mounts = self.get_volume_mounts()
+
+ if not exist_volume_mounts:
+ return False
+
+ volume_mount_found = False
+ for exist_volume_mount in exist_volume_mounts:
+ if exist_volume_mount['name'] == volume_mount['name']:
+ volume_mount_found = True
+ break
+
+ return volume_mount_found
+
+ def exists_volume(self, volume):
+ ''' return whether a volume exists '''
+ exist_volumes = self.get_volumes()
+
+ volume_found = False
+ for exist_volume in exist_volumes:
+ if exist_volume['name'] == volume['name']:
+ volume_found = True
+ break
+
+ return volume_found
+
+ def find_volume_by_name(self, volume, mounts=False):
+ ''' return the index of a volume '''
+ volumes = []
+ if mounts:
+ volumes = self.get_volume_mounts()
+ else:
+ volumes = self.get_volumes()
+ for exist_volume in volumes:
+ if exist_volume['name'] == volume['name']:
+ return exist_volume
+
+ return None
+
+ def get_replicas(self):
+ ''' return replicas setting '''
+ return self.get(DeploymentConfig.replicas_path)
+
+ def get_volume_mounts(self):
+ '''return volume mount information '''
+ return self.get_volumes(mounts=True)
+
+ def get_volumes(self, mounts=False):
+ '''return volume mount information '''
+ if mounts:
+ return self.get(DeploymentConfig.volume_mounts_path) or []
+
+ return self.get(DeploymentConfig.volumes_path) or []
+
+ def delete_volume_by_name(self, volume):
+ '''delete a volume '''
+ modified = False
+ exist_volume_mounts = self.get_volume_mounts()
+ exist_volumes = self.get_volumes()
+ del_idx = None
+ for idx, exist_volume in enumerate(exist_volumes):
+ if exist_volume.has_key('name') and exist_volume['name'] == volume['name']:
+ del_idx = idx
+ break
+
+ if del_idx != None:
+ del exist_volumes[del_idx]
+ modified = True
+
+ del_idx = None
+ for idx, exist_volume_mount in enumerate(exist_volume_mounts):
+ if exist_volume_mount.has_key('name') and exist_volume_mount['name'] == volume['name']:
+ del_idx = idx
+ break
+
+ if del_idx != None:
+ del exist_volume_mounts[idx]
+ modified = True
+
+ return modified
+
+ def add_volume_mount(self, volume_mount):
+ ''' add a volume or volume mount to the proper location '''
+ exist_volume_mounts = self.get_volume_mounts()
+
+ if not exist_volume_mounts and volume_mount:
+ self.put(DeploymentConfig.volume_mounts_path, [volume_mount])
+ else:
+ exist_volume_mounts.append(volume_mount)
+
+ def add_volume(self, volume):
+ ''' add a volume or volume mount to the proper location '''
+ exist_volumes = self.get_volumes()
+ if not volume:
+ return
+
+ if not exist_volumes:
+ self.put(DeploymentConfig.volumes_path, [volume])
+ else:
+ exist_volumes.append(volume)
+
+ def update_replicas(self, replicas):
+ ''' update replicas value '''
+ self.put(DeploymentConfig.replicas_path, replicas)
+
+ def update_volume(self, volume):
+ '''place an env in the env var list'''
+ exist_volumes = self.get_volumes()
+
+ if not volume:
+ return False
+
+ # update the volume
+ update_idx = None
+ for idx, exist_vol in enumerate(exist_volumes):
+ if exist_vol['name'] == volume['name']:
+ update_idx = idx
+ break
+
+ if update_idx != None:
+ exist_volumes[update_idx] = volume
+ else:
+ self.add_volume(volume)
+
+ return True
+
+ def update_volume_mount(self, volume_mount):
+ '''place an env in the env var list'''
+ modified = False
+
+ exist_volume_mounts = self.get_volume_mounts()
+
+ if not volume_mount:
+ return False
+
+ # update the volume mount
+ for exist_vol_mount in exist_volume_mounts:
+ if exist_vol_mount['name'] == volume_mount['name']:
+ if exist_vol_mount.has_key('mountPath') and \
+ str(exist_vol_mount['mountPath']) != str(volume_mount['mountPath']):
+ exist_vol_mount['mountPath'] = volume_mount['mountPath']
+ modified = True
+ break
+
+ if not modified:
+ self.add_volume_mount(volume_mount)
+ modified = True
+
+ return modified
+
+ def needs_update_volume(self, volume, volume_mount):
+ ''' verify a volume update is needed '''
+ exist_volume = self.find_volume_by_name(volume)
+ exist_volume_mount = self.find_volume_by_name(volume, mounts=True)
+ results = []
+ results.append(exist_volume['name'] == volume['name'])
+
+ if volume.has_key('secret'):
+ results.append(exist_volume.has_key('secret'))
+ results.append(exist_volume['secret']['secretName'] == volume['secret']['secretName'])
+ results.append(exist_volume_mount['name'] == volume_mount['name'])
+ results.append(exist_volume_mount['mountPath'] == volume_mount['mountPath'])
+
+ elif volume.has_key('emptyDir'):
+ results.append(exist_volume_mount['name'] == volume['name'])
+ results.append(exist_volume_mount['mountPath'] == volume_mount['mountPath'])
+
+ elif volume.has_key('persistentVolumeClaim'):
+ pvc = 'persistentVolumeClaim'
+ results.append(exist_volume.has_key(pvc))
+ if results[-1]:
+ results.append(exist_volume[pvc]['claimName'] == volume[pvc]['claimName'])
+
+ if volume[pvc].has_key('claimSize'):
+ results.append(exist_volume[pvc]['claimSize'] == volume[pvc]['claimSize'])
+
+ elif volume.has_key('hostpath'):
+ results.append(exist_volume.has_key('hostPath'))
+ results.append(exist_volume['hostPath']['path'] == volume_mount['mountPath'])
+
+ return not all(results)
+
+ def needs_update_replicas(self, replicas):
+ ''' verify whether a replica update is needed '''
+ current_reps = self.get(DeploymentConfig.replicas_path)
+ return not current_reps == replicas
+
+# pylint: disable=too-many-public-methods
+class ReplicationController(DeploymentConfig):
+ ''' Class to wrap the oc command line tools '''
+ replicas_path = "spec.replicas"
+ env_path = "spec.template.spec.containers[0].env"
+ volumes_path = "spec.template.spec.volumes"
+ container_path = "spec.template.spec.containers"
+ volume_mounts_path = "spec.template.spec.containers[0].volumeMounts"
+
+ def __init__(self, content):
+ ''' Constructor for OpenshiftOC '''
+ super(ReplicationController, self).__init__(content=content)
+
# pylint: disable=too-many-instance-attributes
class OCScale(OpenShiftCLI):
''' Class to wrap the oc command line tools '''
@@ -1249,6 +1597,7 @@ class OCScale(OpenShiftCLI):
''' verify whether an update is needed '''
return self.resource.needs_update_replicas(self.replicas)
+ # pylint: disable=too-many-return-statements
@staticmethod
def run_ansible(params, check_mode):
'''perform the idempotent ansible logic'''
@@ -1311,7 +1660,7 @@ def main():
),
supports_check_mode=True,
)
- rval = OCScale.run_ansible(params, module.check_mode)
+ rval = OCScale.run_ansible(module.params, module.check_mode)
if 'failed' in rval:
module.fail_json(**rval)
diff --git a/roles/lib_openshift/library/oc_version.py b/roles/lib_openshift/library/oc_version.py
index 5ee3e9c9b..d74564352 100644
--- a/roles/lib_openshift/library/oc_version.py
+++ b/roles/lib_openshift/library/oc_version.py
@@ -766,12 +766,11 @@ class OpenShiftCLI(object):
cmd = ['get', resource]
if selector:
cmd.append('--selector=%s' % selector)
+ elif rname:
+ cmd.append(rname)
cmd.extend(['-o', 'json'])
- if rname:
- cmd.append(rname)
-
rval = self.openshift_cmd(cmd, output=True)
# Ensure results are retuned in an array
diff --git a/roles/lib_openshift/src/ansible/oc_scale.py b/roles/lib_openshift/src/ansible/oc_scale.py
index 58f5c2ee3..57f9902d6 100644
--- a/roles/lib_openshift/src/ansible/oc_scale.py
+++ b/roles/lib_openshift/src/ansible/oc_scale.py
@@ -18,7 +18,7 @@ def main():
),
supports_check_mode=True,
)
- rval = OCScale.run_ansible(params, module.check_mode)
+ rval = OCScale.run_ansible(module.params, module.check_mode)
if 'failed' in rval:
module.fail_json(**rval)
diff --git a/roles/lib_openshift/src/class/oc_scale.py b/roles/lib_openshift/src/class/oc_scale.py
index bd8f9da93..68dc6ffd4 100644
--- a/roles/lib_openshift/src/class/oc_scale.py
+++ b/roles/lib_openshift/src/class/oc_scale.py
@@ -58,6 +58,7 @@ class OCScale(OpenShiftCLI):
''' verify whether an update is needed '''
return self.resource.needs_update_replicas(self.replicas)
+ # pylint: disable=too-many-return-statements
@staticmethod
def run_ansible(params, check_mode):
'''perform the idempotent ansible logic'''
diff --git a/roles/lib_openshift/src/lib/base.py b/roles/lib_openshift/src/lib/base.py
index db5f4e890..8b5491d6b 100644
--- a/roles/lib_openshift/src/lib/base.py
+++ b/roles/lib_openshift/src/lib/base.py
@@ -111,12 +111,11 @@ class OpenShiftCLI(object):
cmd = ['get', resource]
if selector:
cmd.append('--selector=%s' % selector)
+ elif rname:
+ cmd.append(rname)
cmd.extend(['-o', 'json'])
- if rname:
- cmd.append(rname)
-
rval = self.openshift_cmd(cmd, output=True)
# Ensure results are retuned in an array
diff --git a/roles/lib_openshift/src/lib/deploymentconfig.py b/roles/lib_openshift/src/lib/deploymentconfig.py
new file mode 100644
index 000000000..c0e9af0a1
--- /dev/null
+++ b/roles/lib_openshift/src/lib/deploymentconfig.py
@@ -0,0 +1,337 @@
+# pylint: skip-file
+
+# pylint: disable=too-many-public-methods
+class DeploymentConfig(Yedit):
+ ''' Class to wrap the oc command line tools '''
+ default_deployment_config = '''
+apiVersion: v1
+kind: DeploymentConfig
+metadata:
+ name: default_dc
+ namespace: default
+spec:
+ replicas: 0
+ selector:
+ default_dc: default_dc
+ strategy:
+ resources: {}
+ rollingParams:
+ intervalSeconds: 1
+ maxSurge: 0
+ maxUnavailable: 25%
+ timeoutSeconds: 600
+ updatePercent: -25
+ updatePeriodSeconds: 1
+ type: Rolling
+ template:
+ metadata:
+ spec:
+ containers:
+ - env:
+ - name: default
+ value: default
+ image: default
+ imagePullPolicy: IfNotPresent
+ name: default_dc
+ ports:
+ - containerPort: 8000
+ hostPort: 8000
+ protocol: TCP
+ name: default_port
+ resources: {}
+ terminationMessagePath: /dev/termination-log
+ dnsPolicy: ClusterFirst
+ hostNetwork: true
+ nodeSelector:
+ type: compute
+ restartPolicy: Always
+ securityContext: {}
+ serviceAccount: default
+ serviceAccountName: default
+ terminationGracePeriodSeconds: 30
+ triggers:
+ - type: ConfigChange
+'''
+
+ replicas_path = "spec.replicas"
+ env_path = "spec.template.spec.containers[0].env"
+ volumes_path = "spec.template.spec.volumes"
+ container_path = "spec.template.spec.containers"
+ volume_mounts_path = "spec.template.spec.containers[0].volumeMounts"
+
+ def __init__(self, content=None):
+ ''' Constructor for OpenshiftOC '''
+ if not content:
+ content = DeploymentConfig.default_deployment_config
+
+ super(DeploymentConfig, self).__init__(content=content)
+
+ # pylint: disable=no-member
+ def add_env_value(self, key, value):
+ ''' add key, value pair to env array '''
+ rval = False
+ env = self.get_env_vars()
+ if env:
+ env.append({'name': key, 'value': value})
+ rval = True
+ else:
+ result = self.put(DeploymentConfig.env_path, {'name': key, 'value': value})
+ rval = result[0]
+
+ return rval
+
+ def exists_env_value(self, key, value):
+ ''' return whether a key, value pair exists '''
+ results = self.get_env_vars()
+ if not results:
+ return False
+
+ for result in results:
+ if result['name'] == key and result['value'] == value:
+ return True
+
+ return False
+
+ def exists_env_key(self, key):
+ ''' return whether a key, value pair exists '''
+ results = self.get_env_vars()
+ if not results:
+ return False
+
+ for result in results:
+ if result['name'] == key:
+ return True
+
+ return False
+
+ def get_env_vars(self):
+ '''return a environment variables '''
+ return self.get(DeploymentConfig.env_path) or []
+
+ def delete_env_var(self, keys):
+ '''delete a list of keys '''
+ if not isinstance(keys, list):
+ keys = [keys]
+
+ env_vars_array = self.get_env_vars()
+ modified = False
+ idx = None
+ for key in keys:
+ for env_idx, env_var in enumerate(env_vars_array):
+ if env_var['name'] == key:
+ idx = env_idx
+ break
+
+ if idx:
+ modified = True
+ del env_vars_array[idx]
+
+ if modified:
+ return True
+
+ return False
+
+ def update_env_var(self, key, value):
+ '''place an env in the env var list'''
+
+ env_vars_array = self.get_env_vars()
+ idx = None
+ for env_idx, env_var in enumerate(env_vars_array):
+ if env_var['name'] == key:
+ idx = env_idx
+ break
+
+ if idx:
+ env_vars_array[idx]['value'] = value
+ else:
+ self.add_env_value(key, value)
+
+ return True
+
+ def exists_volume_mount(self, volume_mount):
+ ''' return whether a volume mount exists '''
+ exist_volume_mounts = self.get_volume_mounts()
+
+ if not exist_volume_mounts:
+ return False
+
+ volume_mount_found = False
+ for exist_volume_mount in exist_volume_mounts:
+ if exist_volume_mount['name'] == volume_mount['name']:
+ volume_mount_found = True
+ break
+
+ return volume_mount_found
+
+ def exists_volume(self, volume):
+ ''' return whether a volume exists '''
+ exist_volumes = self.get_volumes()
+
+ volume_found = False
+ for exist_volume in exist_volumes:
+ if exist_volume['name'] == volume['name']:
+ volume_found = True
+ break
+
+ return volume_found
+
+ def find_volume_by_name(self, volume, mounts=False):
+ ''' return the index of a volume '''
+ volumes = []
+ if mounts:
+ volumes = self.get_volume_mounts()
+ else:
+ volumes = self.get_volumes()
+ for exist_volume in volumes:
+ if exist_volume['name'] == volume['name']:
+ return exist_volume
+
+ return None
+
+ def get_replicas(self):
+ ''' return replicas setting '''
+ return self.get(DeploymentConfig.replicas_path)
+
+ def get_volume_mounts(self):
+ '''return volume mount information '''
+ return self.get_volumes(mounts=True)
+
+ def get_volumes(self, mounts=False):
+ '''return volume mount information '''
+ if mounts:
+ return self.get(DeploymentConfig.volume_mounts_path) or []
+
+ return self.get(DeploymentConfig.volumes_path) or []
+
+ def delete_volume_by_name(self, volume):
+ '''delete a volume '''
+ modified = False
+ exist_volume_mounts = self.get_volume_mounts()
+ exist_volumes = self.get_volumes()
+ del_idx = None
+ for idx, exist_volume in enumerate(exist_volumes):
+ if exist_volume.has_key('name') and exist_volume['name'] == volume['name']:
+ del_idx = idx
+ break
+
+ if del_idx != None:
+ del exist_volumes[del_idx]
+ modified = True
+
+ del_idx = None
+ for idx, exist_volume_mount in enumerate(exist_volume_mounts):
+ if exist_volume_mount.has_key('name') and exist_volume_mount['name'] == volume['name']:
+ del_idx = idx
+ break
+
+ if del_idx != None:
+ del exist_volume_mounts[idx]
+ modified = True
+
+ return modified
+
+ def add_volume_mount(self, volume_mount):
+ ''' add a volume or volume mount to the proper location '''
+ exist_volume_mounts = self.get_volume_mounts()
+
+ if not exist_volume_mounts and volume_mount:
+ self.put(DeploymentConfig.volume_mounts_path, [volume_mount])
+ else:
+ exist_volume_mounts.append(volume_mount)
+
+ def add_volume(self, volume):
+ ''' add a volume or volume mount to the proper location '''
+ exist_volumes = self.get_volumes()
+ if not volume:
+ return
+
+ if not exist_volumes:
+ self.put(DeploymentConfig.volumes_path, [volume])
+ else:
+ exist_volumes.append(volume)
+
+ def update_replicas(self, replicas):
+ ''' update replicas value '''
+ self.put(DeploymentConfig.replicas_path, replicas)
+
+ def update_volume(self, volume):
+ '''place an env in the env var list'''
+ exist_volumes = self.get_volumes()
+
+ if not volume:
+ return False
+
+ # update the volume
+ update_idx = None
+ for idx, exist_vol in enumerate(exist_volumes):
+ if exist_vol['name'] == volume['name']:
+ update_idx = idx
+ break
+
+ if update_idx != None:
+ exist_volumes[update_idx] = volume
+ else:
+ self.add_volume(volume)
+
+ return True
+
+ def update_volume_mount(self, volume_mount):
+ '''place an env in the env var list'''
+ modified = False
+
+ exist_volume_mounts = self.get_volume_mounts()
+
+ if not volume_mount:
+ return False
+
+ # update the volume mount
+ for exist_vol_mount in exist_volume_mounts:
+ if exist_vol_mount['name'] == volume_mount['name']:
+ if exist_vol_mount.has_key('mountPath') and \
+ str(exist_vol_mount['mountPath']) != str(volume_mount['mountPath']):
+ exist_vol_mount['mountPath'] = volume_mount['mountPath']
+ modified = True
+ break
+
+ if not modified:
+ self.add_volume_mount(volume_mount)
+ modified = True
+
+ return modified
+
+ def needs_update_volume(self, volume, volume_mount):
+ ''' verify a volume update is needed '''
+ exist_volume = self.find_volume_by_name(volume)
+ exist_volume_mount = self.find_volume_by_name(volume, mounts=True)
+ results = []
+ results.append(exist_volume['name'] == volume['name'])
+
+ if volume.has_key('secret'):
+ results.append(exist_volume.has_key('secret'))
+ results.append(exist_volume['secret']['secretName'] == volume['secret']['secretName'])
+ results.append(exist_volume_mount['name'] == volume_mount['name'])
+ results.append(exist_volume_mount['mountPath'] == volume_mount['mountPath'])
+
+ elif volume.has_key('emptyDir'):
+ results.append(exist_volume_mount['name'] == volume['name'])
+ results.append(exist_volume_mount['mountPath'] == volume_mount['mountPath'])
+
+ elif volume.has_key('persistentVolumeClaim'):
+ pvc = 'persistentVolumeClaim'
+ results.append(exist_volume.has_key(pvc))
+ if results[-1]:
+ results.append(exist_volume[pvc]['claimName'] == volume[pvc]['claimName'])
+
+ if volume[pvc].has_key('claimSize'):
+ results.append(exist_volume[pvc]['claimSize'] == volume[pvc]['claimSize'])
+
+ elif volume.has_key('hostpath'):
+ results.append(exist_volume.has_key('hostPath'))
+ results.append(exist_volume['hostPath']['path'] == volume_mount['mountPath'])
+
+ return not all(results)
+
+ def needs_update_replicas(self, replicas):
+ ''' verify whether a replica update is needed '''
+ current_reps = self.get(DeploymentConfig.replicas_path)
+ return not current_reps == replicas
diff --git a/roles/lib_openshift/src/lib/replicationcontroller.py b/roles/lib_openshift/src/lib/replicationcontroller.py
new file mode 100644
index 000000000..7dafc60f1
--- /dev/null
+++ b/roles/lib_openshift/src/lib/replicationcontroller.py
@@ -0,0 +1,14 @@
+# pylint: skip-file
+
+# pylint: disable=too-many-public-methods
+class ReplicationController(DeploymentConfig):
+ ''' Class to wrap the oc command line tools '''
+ replicas_path = "spec.replicas"
+ env_path = "spec.template.spec.containers[0].env"
+ volumes_path = "spec.template.spec.volumes"
+ container_path = "spec.template.spec.containers"
+ volume_mounts_path = "spec.template.spec.containers[0].volumeMounts"
+
+ def __init__(self, content):
+ ''' Constructor for OpenshiftOC '''
+ super(ReplicationController, self).__init__(content=content)
diff --git a/roles/lib_openshift/src/sources.yml b/roles/lib_openshift/src/sources.yml
index 00543c64b..4623407bc 100644
--- a/roles/lib_openshift/src/sources.yml
+++ b/roles/lib_openshift/src/sources.yml
@@ -34,6 +34,8 @@ oc_scale.py:
- doc/scale
- ../../lib_utils/src/class/yedit.py
- lib/base.py
+- lib/deploymentconfig.py
+- lib/replicationcontroller.py
- class/oc_scale.py
- ansible/oc_scale.py
oc_version.py:
diff --git a/roles/lib_openshift/src/test/integration/oc_scale.yml b/roles/lib_openshift/src/test/integration/oc_scale.yml
index d272357e8..ccc3d05de 100755
--- a/roles/lib_openshift/src/test/integration/oc_scale.yml
+++ b/roles/lib_openshift/src/test/integration/oc_scale.yml
@@ -5,15 +5,88 @@
gather_facts: no
user: root
tasks:
- - name: list oc scale for default router dc
+# - name: list oc scale for default router dc
+# oc_scale:
+# state: list
+# name: router
+# namespace: default
+# kind: dc
+# register: scaleout
+# - debug: var=scaleout
+#
+# - assert:
+# that:
+# - "'result' in scaleout"
+# - scaleout.result > 0
+# msg: "Did not find 'result' in returned value or result not > 0."
+#
+# - name: get the rc for router
+# oc_obj:
+# state: list
+# kind: dc
+# namespace: default
+# selector: router=router
+# register: rcout
+# - debug:
+# msg: "{{ rcout.results.results[0]['items'][-1]['metadata']['name'] }}"
+
+ - name: scale dc to 1
oc_scale:
+ name: router
+ namespace: default
+ kind: dc
+ replicas: 1
+ register: scaleout
+ - debug: var=scaleout
+
+ # The preferred method here would be to let the module
+ # detect when its finished and time out
+ - name: let the scale happen
+ pause:
+ seconds: 10
+ when: scaleout.changed
+
+ - name: fetch the current router pods
+ oc_obj:
+ selector: router=router
+ namespace: default
+ kind: pod
state: list
+ register: pods
+ - debug: var=pods
+
+ - assert:
+ that:
+ - "'results' in pods and 'results' in pods.results"
+ - "{{ pods.results.results[0]['items']|length }} == 1"
+ msg: "Did not find 1 replica in scale results."
+
+ - name: scale dc to 2
+ oc_scale:
name: router
namespace: default
kind: dc
+ replicas: 2
register: scaleout
- debug: var=scaleout
+ # The preferred method here would be to let the module
+ # detect when its finished and time out
+ - name: let the scale happen
+ pause:
+ seconds: 30
+
+ - name: fetch the current router pods
+ oc_obj:
+ selector: router=router
+ namespace: default
+ kind: pod
+ state: list
+ register: pods
+ - debug: var=pods
+
- assert:
- that: "scaleout.results.results[0]['metadata']['name'] == 'test'"
- msg: route create failed
+ that:
+ - "'results' in pods and 'results' in pods.results"
+ - "{{ pods.results.results[0]['items']|length }} == 2"
+ msg: "Did not find 1 replica in scale results."