Browse Source

Adding oc_scale to lib_openshift.

Kenny Woodson 8 years ago
parent
commit
9b7a409745

File diff suppressed because it is too large
+ 1322 - 0
roles/lib_openshift/library/oc_scale.py


+ 29 - 0
roles/lib_openshift/src/ansible/oc_scale.py

@@ -0,0 +1,29 @@
+# pylint: skip-file
+# flake8: noqa
+
+def main():
+    '''
+    ansible oc module for scaling
+    '''
+
+    module = AnsibleModule(
+        argument_spec=dict(
+            kubeconfig=dict(default='/etc/origin/master/admin.kubeconfig', type='str'),
+            state=dict(default='present', type='str', choices=['present', 'list']),
+            debug=dict(default=False, type='bool'),
+            kind=dict(default='dc', choices=['dc', 'rc'], type='str'),
+            namespace=dict(default='default', type='str'),
+            replicas=dict(default=None, type='int'),
+            name=dict(default=None, type='str'),
+        ),
+        supports_check_mode=True,
+    )
+    rval = OCScale.run_ansible(params, module.check_mode)
+    if 'failed' in rval:
+        module.fail_json(**rval)
+
+    module.exit_json(**rval)
+
+
+if __name__ == '__main__':
+    main()

+ 104 - 0
roles/lib_openshift/src/class/oc_scale.py

@@ -0,0 +1,104 @@
+# pylint: skip-file
+# flake8: noqa
+
+# pylint: disable=too-many-instance-attributes
+class OCScale(OpenShiftCLI):
+    ''' Class to wrap the oc command line tools '''
+
+    # pylint allows 5
+    # pylint: disable=too-many-arguments
+    def __init__(self,
+                 resource_name,
+                 namespace,
+                 replicas,
+                 kind,
+                 kubeconfig='/etc/origin/master/admin.kubeconfig',
+                 verbose=False):
+        ''' Constructor for OCScale '''
+        super(OCScale, self).__init__(namespace, kubeconfig)
+        self.kind = kind
+        self.replicas = replicas
+        self.name = resource_name
+        self.namespace = namespace
+        self.kubeconfig = kubeconfig
+        self.verbose = verbose
+        self._resource = None
+
+    @property
+    def resource(self):
+        ''' property function for resource var '''
+        if not self._resource:
+            self.get()
+        return self._resource
+
+    @resource.setter
+    def resource(self, data):
+        ''' setter function for resource var '''
+        self._resource = data
+
+    def get(self):
+        '''return replicas information '''
+        vol = self._get(self.kind, self.name)
+        if vol['returncode'] == 0:
+            if self.kind == 'dc':
+                self.resource = DeploymentConfig(content=vol['results'][0])
+                vol['results'] = [self.resource.get_replicas()]
+            if self.kind == 'rc':
+                self.resource = ReplicationController(content=vol['results'][0])
+                vol['results'] = [self.resource.get_replicas()]
+
+        return vol
+
+    def put(self):
+        '''update replicas into dc '''
+        self.resource.update_replicas(self.replicas)
+        return self._replace_content(self.kind, self.name, self.resource.yaml_dict)
+
+    def needs_update(self):
+        ''' verify whether an update is needed '''
+        return self.resource.needs_update_replicas(self.replicas)
+
+    @staticmethod
+    def run_ansible(params, check_mode):
+        '''perform the idempotent ansible logic'''
+
+        oc_scale = OCScale(params['name'],
+                           params['namespace'],
+                           params['replicas'],
+                           params['kind'],
+                           params['kubeconfig'],
+                           verbose=params['debug'])
+
+        state = params['state']
+
+        api_rval = oc_scale.get()
+
+        #####
+        # Get
+        #####
+        if state == 'list':
+            return {'changed': False, 'result': api_rval['results'], 'state': 'list'}  # noqa: E501
+
+        elif state == 'present':
+            ########
+            # Update
+            ########
+            if oc_scale.needs_update():
+                if check_mode:
+                    return {'changed': True, 'result': 'CHECK_MODE: Would have updated.'}  # noqa: E501
+                api_rval = oc_scale.put()
+
+                if api_rval['returncode'] != 0:
+                    return {'failed': True, 'msg': api_rval}
+
+                # return the created object
+                api_rval = oc_scale.get()
+
+                if api_rval['returncode'] != 0:
+                    return {'failed': True, 'msg': api_rval}
+
+                return {'changed': True, 'result': api_rval['results'], 'state': 'present'}  # noqa: E501
+
+            return {'changed': False, 'result': api_rval['results'], 'state': 'present'}  # noqa: E501
+
+        return {'failed': True, 'msg': 'Unknown state passed. [{}]'.format(state)}

+ 70 - 0
roles/lib_openshift/src/doc/scale

@@ -0,0 +1,70 @@
+# flake8: noqa
+# pylint: skip-file
+
+DOCUMENTATION = '''
+---
+module: oc_scale
+short_description: Manage openshift services through the scale parameters
+description:
+  - Manage openshift services through scaling them.
+options:
+  state:
+    description:
+    - State represents whether to create, modify, delete, or list
+    required: true
+    default: present
+    choices: ["present", "absent", "list"]
+    aliases: []
+  kubeconfig:
+    description:
+    - The path for the kubeconfig file to use for authentication
+    required: false
+    default: /etc/origin/master/admin.kubeconfig
+    aliases: []
+  debug:
+    description:
+    - Turn on debug output.
+    required: false
+    default: False
+    aliases: []
+  name:
+    description:
+    - Name of the object that is being queried.
+    required: false
+    default: None
+    aliases: []
+  namespace:
+    description:
+    - The namespace where the object lives.
+    required: false
+    default: str
+    aliases: []
+  kind:
+    description:
+    - The kind of object to scale.
+    required: false
+    default: None
+    choices:
+    - rc
+    - dc
+    aliases: []
+author:
+- "Kenny Woodson <kwoodson@redhat.com>"
+extends_documentation_fragment: []
+'''
+
+EXAMPLES = '''
+- name: scale down a rc to 0
+  oc_scale:
+    name: my-replication-controller
+    kind: rc
+    namespace: openshift-infra
+    replicas: 0
+
+- name: scale up a deploymentconfig to 2
+  oc_scale:
+    name: php
+    kind: dc
+    namespace: my-php-app
+    replicas: 2
+'''

+ 9 - 0
roles/lib_openshift/src/sources.yml

@@ -27,6 +27,15 @@ oc_route.py:
 - lib/route.py
 - class/oc_route.py
 - ansible/oc_route.py
+oc_scale.py:
+- doc/generated
+- doc/license
+- lib/import.py
+- doc/scale
+- ../../lib_utils/src/class/yedit.py
+- lib/base.py
+- class/oc_scale.py
+- ansible/oc_scale.py
 oc_version.py:
 - doc/generated
 - doc/license

+ 19 - 0
roles/lib_openshift/src/test/integration/oc_scale.yml

@@ -0,0 +1,19 @@
+#!/usr/bin/ansible-playbook --module-path=../../../library/
+# ./oc_scale.yml -e "cli_master_test=$OPENSHIFT_MASTER
+---
+- hosts: "{{ cli_master_test }}"
+  gather_facts: no
+  user: root
+  tasks:
+  - 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: "scaleout.results.results[0]['metadata']['name'] == 'test'"
+      msg: route create failed