summaryrefslogtreecommitdiffstats
path: root/roles/lib_openshift/src/class/oc_edit.py
blob: 629e5a007b2acb806476a67f68356a15839ee0cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# pylint: skip-file
# flake8: noqa

class Edit(OpenShiftCLI):
    ''' Class to wrap the oc command line tools
    '''
    # pylint: disable=too-many-arguments
    def __init__(self,
                 kind,
                 namespace,
                 resource_name=None,
                 kubeconfig='/etc/origin/master/admin.kubeconfig',
                 separator='.',
                 verbose=False):
        ''' Constructor for OpenshiftOC '''
        super(Edit, self).__init__(namespace, kubeconfig=kubeconfig, verbose=verbose)
        self.kind = kind
        self.name = resource_name
        self.separator = separator

    def get(self):
        '''return a secret by name '''
        return self._get(self.kind, self.name)

    def update(self, file_name, content, force=False, content_type='yaml'):
        '''run update '''
        if file_name:
            if content_type == 'yaml':
                data = yaml.load(open(file_name))
            elif content_type == 'json':
                data = json.loads(open(file_name).read())

            changes = []
            yed = Yedit(filename=file_name, content=data, separator=self.separator)
            for key, value in content.items():
                changes.append(yed.put(key, value))

            if any([not change[0] for change in changes]):
                return {'returncode': 0, 'updated': False}

            yed.write()

            atexit.register(Utils.cleanup, [file_name])

            return self._replace(file_name, force=force)

        return self._replace_content(self.kind, self.name, content, force=force, sep=self.separator)

    @staticmethod
    def run_ansible(params, check_mode):
        '''run the ansible idempotent code'''

        ocedit = Edit(params['kind'],
                      params['namespace'],
                      params['name'],
                      kubeconfig=params['kubeconfig'],
                      separator=params['separator'],
                      verbose=params['debug'])

        api_rval = ocedit.get()

        ########
        # Create
        ########
        if not Utils.exists(api_rval['results'], params['name']):
            return {"failed": True, 'msg': api_rval}

        ########
        # Update
        ########
        if check_mode:
            return {'changed': True, 'msg': 'CHECK_MODE: Would have performed edit'}

        api_rval = ocedit.update(params['file_name'],
                                 params['content'],
                                 params['force'],
                                 params['file_format'])

        if api_rval['returncode'] != 0:
            return {"failed": True, 'msg': api_rval}

        if 'updated' in api_rval and not api_rval['updated']:
            return {"changed": False, 'results': api_rval, 'state': 'present'}

        # return the created object
        api_rval = ocedit.get()

        if api_rval['returncode'] != 0:
            return {"failed": True, 'msg': api_rval}

        return {"changed": True, 'results': api_rval, 'state': 'present'}