diff options
| author | Scott Dodson <sdodson@redhat.com> | 2017-05-31 09:36:30 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-05-31 09:36:30 -0400 | 
| commit | 15221b6943df7e54ff00db6271ee89eb5cbe0425 (patch) | |
| tree | b7b32d862c0b8ed3e037c26271a9f384493e07f8 /roles/lib_openshift/library | |
| parent | 61324060fde1435ff1c819858bb4271352458a68 (diff) | |
| parent | a1cfec9bbe43dd005ab16792c90cc949555cce12 (diff) | |
| download | openshift-15221b6943df7e54ff00db6271ee89eb5cbe0425.tar.gz openshift-15221b6943df7e54ff00db6271ee89eb5cbe0425.tar.bz2 openshift-15221b6943df7e54ff00db6271ee89eb5cbe0425.tar.xz openshift-15221b6943df7e54ff00db6271ee89eb5cbe0425.zip | |
Merge pull request #4091 from richm/oc_service-labels-externalIPs
add support for oc_service for labels, externalIPs
Diffstat (limited to 'roles/lib_openshift/library')
27 files changed, 649 insertions, 230 deletions
| diff --git a/roles/lib_openshift/library/oc_adm_ca_server_cert.py b/roles/lib_openshift/library/oc_adm_ca_server_cert.py index 7573c5b85..3974cc4dd 100644 --- a/roles/lib_openshift/library/oc_adm_ca_server_cert.py +++ b/roles/lib_openshift/library/oc_adm_ca_server_cert.py @@ -1405,7 +1405,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1419,18 +1418,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_adm_manage_node.py b/roles/lib_openshift/library/oc_adm_manage_node.py index bb3619081..320eac17e 100644 --- a/roles/lib_openshift/library/oc_adm_manage_node.py +++ b/roles/lib_openshift/library/oc_adm_manage_node.py @@ -1391,7 +1391,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1405,18 +1404,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_adm_policy_group.py b/roles/lib_openshift/library/oc_adm_policy_group.py index 358d4515b..f9658d6e1 100644 --- a/roles/lib_openshift/library/oc_adm_policy_group.py +++ b/roles/lib_openshift/library/oc_adm_policy_group.py @@ -1377,7 +1377,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1391,18 +1390,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_adm_policy_user.py b/roles/lib_openshift/library/oc_adm_policy_user.py index 5807f41a8..0bdfd0bad 100644 --- a/roles/lib_openshift/library/oc_adm_policy_user.py +++ b/roles/lib_openshift/library/oc_adm_policy_user.py @@ -1377,7 +1377,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1391,18 +1390,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_adm_registry.py b/roles/lib_openshift/library/oc_adm_registry.py index e1b79466e..0090cac12 100644 --- a/roles/lib_openshift/library/oc_adm_registry.py +++ b/roles/lib_openshift/library/oc_adm_registry.py @@ -1495,7 +1495,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1509,18 +1508,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval @@ -1995,7 +2004,8 @@ class ServiceConfig(object):                   cluster_ip=None,                   portal_ip=None,                   session_affinity=None, -                 service_type=None): +                 service_type=None, +                 external_ips=None):          ''' constructor for handling service options '''          self.name = sname          self.namespace = namespace @@ -2006,6 +2016,7 @@ class ServiceConfig(object):          self.portal_ip = portal_ip          self.session_affinity = session_affinity          self.service_type = service_type +        self.external_ips = external_ips          self.data = {}          self.create_dict() @@ -2018,8 +2029,9 @@ class ServiceConfig(object):          self.data['metadata']['name'] = self.name          self.data['metadata']['namespace'] = self.namespace          if self.labels: -            for lab, lab_value  in self.labels.items(): -                self.data['metadata'][lab] = lab_value +            self.data['metadata']['labels'] = {} +            for lab, lab_value in self.labels.items(): +                self.data['metadata']['labels'][lab] = lab_value          self.data['spec'] = {}          if self.ports: @@ -2041,6 +2053,10 @@ class ServiceConfig(object):          if self.service_type:              self.data['spec']['type'] = self.service_type +        if self.external_ips: +            self.data['spec']['externalIPs'] = self.external_ips + +  # pylint: disable=too-many-instance-attributes,too-many-public-methods  class Service(Yedit):      ''' Class to model the oc service object ''' @@ -2049,6 +2065,7 @@ class Service(Yedit):      cluster_ip = "spec.clusterIP"      selector_path = 'spec.selector'      kind = 'Service' +    external_ips = "spec.externalIPs"      def __init__(self, content):          '''Service constructor''' @@ -2110,6 +2127,53 @@ class Service(Yedit):          '''add cluster ip'''          self.put(Service.portal_ip, pip) +    def get_external_ips(self): +        ''' get a list of external_ips ''' +        return self.get(Service.external_ips) or [] + +    def add_external_ips(self, inc_external_ips): +        ''' add an external_ip to the external_ips list ''' +        if not isinstance(inc_external_ips, list): +            inc_external_ips = [inc_external_ips] + +        external_ips = self.get_external_ips() +        if not external_ips: +            self.put(Service.external_ips, inc_external_ips) +        else: +            external_ips.extend(inc_external_ips) + +        return True + +    def find_external_ips(self, inc_external_ip): +        ''' find a specific external IP ''' +        val = None +        try: +            idx = self.get_external_ips().index(inc_external_ip) +            val = self.get_external_ips()[idx] +        except ValueError: +            pass + +        return val + +    def delete_external_ips(self, inc_external_ips): +        ''' remove an external IP from a service ''' +        if not isinstance(inc_external_ips, list): +            inc_external_ips = [inc_external_ips] + +        external_ips = self.get(Service.external_ips) or [] + +        if not external_ips: +            return True + +        removed = False +        for inc_external_ip in inc_external_ips: +            external_ip = self.find_external_ips(inc_external_ip) +            if external_ip: +                external_ips.remove(external_ip) +                removed = True + +        return removed +  # -*- -*- -*- End included fragment: lib/service.py -*- -*- -*-  # -*- -*- -*- Begin included fragment: lib/volume.py -*- -*- -*- @@ -2350,7 +2414,7 @@ class Registry(OpenShiftCLI):      def prepare_registry(self):          ''' prepare a registry for instantiation ''' -        options = self.config.to_option_list() +        options = self.config.to_option_list(ascommalist='labels')          cmd = ['registry']          cmd.extend(options) @@ -2656,7 +2720,7 @@ def main():              kubeconfig=dict(default='/etc/origin/master/admin.kubeconfig', type='str'),              images=dict(default=None, type='str'),              latest_images=dict(default=False, type='bool'), -            labels=dict(default=None, type='list'), +            labels=dict(default=None, type='dict'),              ports=dict(default=['5000'], type='list'),              replicas=dict(default=1, type='int'),              selector=dict(default=None, type='str'), diff --git a/roles/lib_openshift/library/oc_adm_router.py b/roles/lib_openshift/library/oc_adm_router.py index e3b1bbcbc..98e80e001 100644 --- a/roles/lib_openshift/library/oc_adm_router.py +++ b/roles/lib_openshift/library/oc_adm_router.py @@ -1520,7 +1520,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1534,18 +1533,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval @@ -1568,7 +1577,8 @@ class ServiceConfig(object):                   cluster_ip=None,                   portal_ip=None,                   session_affinity=None, -                 service_type=None): +                 service_type=None, +                 external_ips=None):          ''' constructor for handling service options '''          self.name = sname          self.namespace = namespace @@ -1579,6 +1589,7 @@ class ServiceConfig(object):          self.portal_ip = portal_ip          self.session_affinity = session_affinity          self.service_type = service_type +        self.external_ips = external_ips          self.data = {}          self.create_dict() @@ -1591,8 +1602,9 @@ class ServiceConfig(object):          self.data['metadata']['name'] = self.name          self.data['metadata']['namespace'] = self.namespace          if self.labels: -            for lab, lab_value  in self.labels.items(): -                self.data['metadata'][lab] = lab_value +            self.data['metadata']['labels'] = {} +            for lab, lab_value in self.labels.items(): +                self.data['metadata']['labels'][lab] = lab_value          self.data['spec'] = {}          if self.ports: @@ -1614,6 +1626,10 @@ class ServiceConfig(object):          if self.service_type:              self.data['spec']['type'] = self.service_type +        if self.external_ips: +            self.data['spec']['externalIPs'] = self.external_ips + +  # pylint: disable=too-many-instance-attributes,too-many-public-methods  class Service(Yedit):      ''' Class to model the oc service object ''' @@ -1622,6 +1638,7 @@ class Service(Yedit):      cluster_ip = "spec.clusterIP"      selector_path = 'spec.selector'      kind = 'Service' +    external_ips = "spec.externalIPs"      def __init__(self, content):          '''Service constructor''' @@ -1683,6 +1700,53 @@ class Service(Yedit):          '''add cluster ip'''          self.put(Service.portal_ip, pip) +    def get_external_ips(self): +        ''' get a list of external_ips ''' +        return self.get(Service.external_ips) or [] + +    def add_external_ips(self, inc_external_ips): +        ''' add an external_ip to the external_ips list ''' +        if not isinstance(inc_external_ips, list): +            inc_external_ips = [inc_external_ips] + +        external_ips = self.get_external_ips() +        if not external_ips: +            self.put(Service.external_ips, inc_external_ips) +        else: +            external_ips.extend(inc_external_ips) + +        return True + +    def find_external_ips(self, inc_external_ip): +        ''' find a specific external IP ''' +        val = None +        try: +            idx = self.get_external_ips().index(inc_external_ip) +            val = self.get_external_ips()[idx] +        except ValueError: +            pass + +        return val + +    def delete_external_ips(self, inc_external_ips): +        ''' remove an external IP from a service ''' +        if not isinstance(inc_external_ips, list): +            inc_external_ips = [inc_external_ips] + +        external_ips = self.get(Service.external_ips) or [] + +        if not external_ips: +            return True + +        removed = False +        for inc_external_ip in inc_external_ips: +            external_ip = self.find_external_ips(inc_external_ip) +            if external_ip: +                external_ips.remove(external_ip) +                removed = True + +        return removed +  # -*- -*- -*- End included fragment: lib/service.py -*- -*- -*-  # -*- -*- -*- Begin included fragment: lib/deploymentconfig.py -*- -*- -*- @@ -2782,7 +2846,7 @@ class Router(OpenShiftCLI):              # No certificate was passed to us.  do not pass one to oc adm router              self.config.config_options['default_cert']['include'] = False -        options = self.config.to_option_list() +        options = self.config.to_option_list(ascommalist='labels')          cmd = ['router', self.config.name]          cmd.extend(options) @@ -3083,7 +3147,7 @@ def main():              key_file=dict(default=None, type='str'),              images=dict(default=None, type='str'), #'openshift3/ose-${component}:${version}'              latest_images=dict(default=False, type='bool'), -            labels=dict(default=None, type='list'), +            labels=dict(default=None, type='dict'),              ports=dict(default=['80:80', '443:443'], type='list'),              replicas=dict(default=1, type='int'),              selector=dict(default=None, type='str'), diff --git a/roles/lib_openshift/library/oc_clusterrole.py b/roles/lib_openshift/library/oc_clusterrole.py index 9f3e819a3..3ed0d65dc 100644 --- a/roles/lib_openshift/library/oc_clusterrole.py +++ b/roles/lib_openshift/library/oc_clusterrole.py @@ -1369,7 +1369,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1383,18 +1382,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_configmap.py b/roles/lib_openshift/library/oc_configmap.py index 3c0e82a09..5c8ed48d2 100644 --- a/roles/lib_openshift/library/oc_configmap.py +++ b/roles/lib_openshift/library/oc_configmap.py @@ -1375,7 +1375,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1389,18 +1388,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_edit.py b/roles/lib_openshift/library/oc_edit.py index 008ce6a12..f3b6d552d 100644 --- a/roles/lib_openshift/library/oc_edit.py +++ b/roles/lib_openshift/library/oc_edit.py @@ -1419,7 +1419,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1433,18 +1432,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_env.py b/roles/lib_openshift/library/oc_env.py index 824ad4cb3..c6421128a 100644 --- a/roles/lib_openshift/library/oc_env.py +++ b/roles/lib_openshift/library/oc_env.py @@ -1386,7 +1386,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1400,18 +1399,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_group.py b/roles/lib_openshift/library/oc_group.py index 7eacac38e..a791c29af 100644 --- a/roles/lib_openshift/library/oc_group.py +++ b/roles/lib_openshift/library/oc_group.py @@ -1359,7 +1359,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1373,18 +1372,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_image.py b/roles/lib_openshift/library/oc_image.py index 266f8fbcf..bbc123ce0 100644 --- a/roles/lib_openshift/library/oc_image.py +++ b/roles/lib_openshift/library/oc_image.py @@ -1378,7 +1378,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1392,18 +1391,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_label.py b/roles/lib_openshift/library/oc_label.py index 756d7db42..cd1afd0d2 100644 --- a/roles/lib_openshift/library/oc_label.py +++ b/roles/lib_openshift/library/oc_label.py @@ -1395,7 +1395,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1409,18 +1408,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_obj.py b/roles/lib_openshift/library/oc_obj.py index 88d4ac8ca..215723cc8 100644 --- a/roles/lib_openshift/library/oc_obj.py +++ b/roles/lib_openshift/library/oc_obj.py @@ -1398,7 +1398,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1412,18 +1411,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_objectvalidator.py b/roles/lib_openshift/library/oc_objectvalidator.py index 8e42083ca..358ef5130 100644 --- a/roles/lib_openshift/library/oc_objectvalidator.py +++ b/roles/lib_openshift/library/oc_objectvalidator.py @@ -1330,7 +1330,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1344,18 +1343,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_process.py b/roles/lib_openshift/library/oc_process.py index 15e9c606d..025b846c6 100644 --- a/roles/lib_openshift/library/oc_process.py +++ b/roles/lib_openshift/library/oc_process.py @@ -1387,7 +1387,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1401,18 +1400,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_project.py b/roles/lib_openshift/library/oc_project.py index b653d9018..05dfddab8 100644 --- a/roles/lib_openshift/library/oc_project.py +++ b/roles/lib_openshift/library/oc_project.py @@ -1384,7 +1384,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1398,18 +1397,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_pvc.py b/roles/lib_openshift/library/oc_pvc.py index bab67d499..d7de4964c 100644 --- a/roles/lib_openshift/library/oc_pvc.py +++ b/roles/lib_openshift/library/oc_pvc.py @@ -1379,7 +1379,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1393,18 +1392,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_route.py b/roles/lib_openshift/library/oc_route.py index 7831ec8a4..3090b4cad 100644 --- a/roles/lib_openshift/library/oc_route.py +++ b/roles/lib_openshift/library/oc_route.py @@ -1429,7 +1429,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1443,18 +1442,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_scale.py b/roles/lib_openshift/library/oc_scale.py index 133942e55..6a505fb6b 100644 --- a/roles/lib_openshift/library/oc_scale.py +++ b/roles/lib_openshift/library/oc_scale.py @@ -1373,7 +1373,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1387,18 +1386,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_secret.py b/roles/lib_openshift/library/oc_secret.py index 8c6877bb2..379670aee 100644 --- a/roles/lib_openshift/library/oc_secret.py +++ b/roles/lib_openshift/library/oc_secret.py @@ -1419,7 +1419,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1433,18 +1432,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_service.py b/roles/lib_openshift/library/oc_service.py index a482e13c1..308f45488 100644 --- a/roles/lib_openshift/library/oc_service.py +++ b/roles/lib_openshift/library/oc_service.py @@ -140,6 +140,13 @@ options:      - LoadBalancer      - ExternalName      aliases: [] +  externalips: +    description: +    - A list of the external IPs that are exposed for this service. +    - https://kubernetes.io/docs/concepts/services-networking/service/#external-ips +    required: false +    default: None +    aliases: []  author:  - "Kenny Woodson <kwoodson@redhat.com>"  extends_documentation_fragment: [] @@ -1425,7 +1432,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1439,18 +1445,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval @@ -1473,7 +1489,8 @@ class ServiceConfig(object):                   cluster_ip=None,                   portal_ip=None,                   session_affinity=None, -                 service_type=None): +                 service_type=None, +                 external_ips=None):          ''' constructor for handling service options '''          self.name = sname          self.namespace = namespace @@ -1484,6 +1501,7 @@ class ServiceConfig(object):          self.portal_ip = portal_ip          self.session_affinity = session_affinity          self.service_type = service_type +        self.external_ips = external_ips          self.data = {}          self.create_dict() @@ -1496,8 +1514,9 @@ class ServiceConfig(object):          self.data['metadata']['name'] = self.name          self.data['metadata']['namespace'] = self.namespace          if self.labels: -            for lab, lab_value  in self.labels.items(): -                self.data['metadata'][lab] = lab_value +            self.data['metadata']['labels'] = {} +            for lab, lab_value in self.labels.items(): +                self.data['metadata']['labels'][lab] = lab_value          self.data['spec'] = {}          if self.ports: @@ -1519,6 +1538,10 @@ class ServiceConfig(object):          if self.service_type:              self.data['spec']['type'] = self.service_type +        if self.external_ips: +            self.data['spec']['externalIPs'] = self.external_ips + +  # pylint: disable=too-many-instance-attributes,too-many-public-methods  class Service(Yedit):      ''' Class to model the oc service object ''' @@ -1527,6 +1550,7 @@ class Service(Yedit):      cluster_ip = "spec.clusterIP"      selector_path = 'spec.selector'      kind = 'Service' +    external_ips = "spec.externalIPs"      def __init__(self, content):          '''Service constructor''' @@ -1588,6 +1612,53 @@ class Service(Yedit):          '''add cluster ip'''          self.put(Service.portal_ip, pip) +    def get_external_ips(self): +        ''' get a list of external_ips ''' +        return self.get(Service.external_ips) or [] + +    def add_external_ips(self, inc_external_ips): +        ''' add an external_ip to the external_ips list ''' +        if not isinstance(inc_external_ips, list): +            inc_external_ips = [inc_external_ips] + +        external_ips = self.get_external_ips() +        if not external_ips: +            self.put(Service.external_ips, inc_external_ips) +        else: +            external_ips.extend(inc_external_ips) + +        return True + +    def find_external_ips(self, inc_external_ip): +        ''' find a specific external IP ''' +        val = None +        try: +            idx = self.get_external_ips().index(inc_external_ip) +            val = self.get_external_ips()[idx] +        except ValueError: +            pass + +        return val + +    def delete_external_ips(self, inc_external_ips): +        ''' remove an external IP from a service ''' +        if not isinstance(inc_external_ips, list): +            inc_external_ips = [inc_external_ips] + +        external_ips = self.get(Service.external_ips) or [] + +        if not external_ips: +            return True + +        removed = False +        for inc_external_ip in inc_external_ips: +            external_ip = self.find_external_ips(inc_external_ip) +            if external_ip: +                external_ips.remove(external_ip) +                removed = True + +        return removed +  # -*- -*- -*- End included fragment: lib/service.py -*- -*- -*-  # -*- -*- -*- Begin included fragment: class/oc_service.py -*- -*- -*- @@ -1610,13 +1681,15 @@ class OCService(OpenShiftCLI):                   ports,                   session_affinity,                   service_type, +                 external_ips,                   kubeconfig='/etc/origin/master/admin.kubeconfig',                   verbose=False):          ''' Constructor for OCVolume '''          super(OCService, self).__init__(namespace, kubeconfig, verbose)          self.namespace = namespace          self.config = ServiceConfig(sname, namespace, ports, selector, labels, -                                    cluster_ip, portal_ip, session_affinity, service_type) +                                    cluster_ip, portal_ip, session_affinity, service_type, +                                    external_ips)          self.user_svc = Service(content=self.config.data)          self.svc = None @@ -1685,6 +1758,7 @@ class OCService(OpenShiftCLI):                             params['ports'],                             params['session_affinity'],                             params['service_type'], +                           params['external_ips'],                             params['kubeconfig'],                             params['debug']) @@ -1786,6 +1860,7 @@ def main():              ports=dict(default=None, type='list'),              session_affinity=dict(default='None', type='str'),              service_type=dict(default='ClusterIP', type='str'), +            external_ips=dict(default=None, type='list'),          ),          supports_check_mode=True,      ) diff --git a/roles/lib_openshift/library/oc_serviceaccount.py b/roles/lib_openshift/library/oc_serviceaccount.py index 263398e3d..68c1fc51c 100644 --- a/roles/lib_openshift/library/oc_serviceaccount.py +++ b/roles/lib_openshift/library/oc_serviceaccount.py @@ -1371,7 +1371,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1385,18 +1384,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_serviceaccount_secret.py b/roles/lib_openshift/library/oc_serviceaccount_secret.py index cc7fda1b5..ebc5bf8a2 100644 --- a/roles/lib_openshift/library/oc_serviceaccount_secret.py +++ b/roles/lib_openshift/library/oc_serviceaccount_secret.py @@ -1371,7 +1371,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1385,18 +1384,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_user.py b/roles/lib_openshift/library/oc_user.py index 48ac28834..d1a20fddc 100644 --- a/roles/lib_openshift/library/oc_user.py +++ b/roles/lib_openshift/library/oc_user.py @@ -1431,7 +1431,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1445,18 +1444,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_version.py b/roles/lib_openshift/library/oc_version.py index 21dd5c3c9..548c9d8e0 100644 --- a/roles/lib_openshift/library/oc_version.py +++ b/roles/lib_openshift/library/oc_version.py @@ -1343,7 +1343,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1357,18 +1356,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval diff --git a/roles/lib_openshift/library/oc_volume.py b/roles/lib_openshift/library/oc_volume.py index be0944843..3826cd8e5 100644 --- a/roles/lib_openshift/library/oc_volume.py +++ b/roles/lib_openshift/library/oc_volume.py @@ -1420,7 +1420,6 @@ class Utils(object):  # pragma: no cover              print('returning true')          return True -  class OpenShiftCLIConfig(object):      '''Generic Config'''      def __init__(self, rname, namespace, kubeconfig, options): @@ -1434,18 +1433,28 @@ class OpenShiftCLIConfig(object):          ''' return config options '''          return self._options -    def to_option_list(self): -        '''return all options as a string''' -        return self.stringify() - -    def stringify(self): -        ''' return the options hash as cli params in a string ''' +    def to_option_list(self, ascommalist=''): +        '''return all options as a string +           if ascommalist is set to the name of a key, and +           the value of that key is a dict, format the dict +           as a list of comma delimited key=value pairs''' +        return self.stringify(ascommalist) + +    def stringify(self, ascommalist=''): +        ''' return the options hash as cli params in a string +            if ascommalist is set to the name of a key, and +            the value of that key is a dict, format the dict +            as a list of comma delimited key=value pairs '''          rval = []          for key in sorted(self.config_options.keys()):              data = self.config_options[key]              if data['include'] \                 and (data['value'] or isinstance(data['value'], int)): -                rval.append('--{}={}'.format(key.replace('_', '-'), data['value'])) +                if key == ascommalist: +                    val = ','.join(['{}={}'.format(kk, vv) for kk, vv in sorted(data['value'].items())]) +                else: +                    val = data['value'] +                rval.append('--{}={}'.format(key.replace('_', '-'), val))          return rval | 
