Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ovirt vnic profile fix backport #58058

Merged
merged 2 commits into from Jun 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelogs/fragments/57936-ovirt_vnic_profile_fix.yml
@@ -0,0 +1,2 @@
bugfixes:
- Update ovirt vnic profile module BZ(https://bugzilla.redhat.com/show_bug.cgi?id=1597537)
78 changes: 54 additions & 24 deletions lib/ansible/modules/cloud/ovirt/ovirt_vnic_profile.py
Expand Up @@ -66,6 +66,7 @@
pass_through:
description:
- "Enables passthrough to an SR-IOV-enabled host NIC."
- "When enabled C(qos) and C(network_filter) are automatically set to None and C(port_mirroring) to False."
choices: ['disabled', 'enabled']
migratable:
description:
Expand Down Expand Up @@ -160,45 +161,62 @@ class EntityVnicPorfileModule(BaseModule):
def __init__(self, *args, **kwargs):
super(EntityVnicPorfileModule, self).__init__(*args, **kwargs)

def __get_dcs_service(self):
def _get_dcs_service(self):
return self._connection.system_service().data_centers_service()

def __get_dcs_id(self):
return get_id_by_name(self.__get_dcs_service(), self.param('data_center'))
def _get_dcs_id(self):
return get_id_by_name(self._get_dcs_service(), self.param('data_center'))

def __get_network_id(self):
networks_service = self.__get_dcs_service().service(self.__get_dcs_id()).networks_service()
def _get_network_id(self):
networks_service = self._get_dcs_service().service(self._get_dcs_id()).networks_service()
return get_id_by_name(networks_service, self.param('network'))

def __get_qos_id(self):
qoss_service = self.__get_dcs_service().service(self.__get_dcs_id()).qoss_service()
def _get_qos_id(self):
qoss_service = self._get_dcs_service().service(self._get_dcs_id()).qoss_service()
return get_id_by_name(qoss_service, self.param('qos'))

def __get_network_filter_id(self):
def _get_network_filter_id(self):
nf_service = self._connection.system_service().network_filters_service()
return get_id_by_name(nf_service, self.param('network_filter')) if self.param('network_filter') else None

def _get_network_filter(self):
network_filter = None
if self.param('network_filter'):
network_filter = otypes.NetworkFilter(id=self._get_network_filter_id())
elif self.param('network_filter') == '' or self.param('pass_through') == 'enabled':
network_filter = otypes.NetworkFilter()
return network_filter

def _get_qos(self):
qos = None
if self.param('qos'):
qos = otypes.Qos(id=self._get_qos_id())
elif self.param('qos') == '' or self.param('pass_through') == 'enabled':
qos = otypes.Qos()
return qos

def _get_port_mirroring(self):
if self.param('pass_through') == 'enabled':
return False
return self.param('port_mirroring')

def build_entity(self):
return otypes.VnicProfile(
name=self.param('name'),
network=otypes.Network(id=self.__get_network_id()),
description=self.param('description')
if self.param('description') else None,
port_mirroring=self.param('port_mirroring'),
pass_through=otypes.VnicPassThrough(mode=otypes.VnicPassThroughMode(self.param('pass_through')))
if self.param('pass_through') else None,
migratable=self.param('migratable'),
network=otypes.Network(id=self._get_network_id()),
description=self.param('description') if self.param('description') else None,
pass_through=otypes.VnicPassThrough(mode=otypes.VnicPassThroughMode(self.param('pass_through'))) if self.param('pass_through') else None,
migratable=self.param('migratable') if self.param('migratable') else None,
custom_properties=[
otypes.CustomProperty(
name=cp.get('name'),
regexp=cp.get('regexp'),
value=str(cp.get('value')),
) for cp in self.param('custom_properties') if cp
] if self.param('custom_properties') is not None else None,
qos=otypes.Qos(id=self.__get_qos_id())
if self.param('qos') else None,
network_filter=otypes.NetworkFilter(id=self.__get_network_filter_id())
if self.param('network_filter') is not None else None
] if self.param('custom_properties') else None,
qos=self._get_qos(),
port_mirroring=self._get_port_mirroring(),
network_filter=self._get_network_filter()
)

def update_check(self, entity):
Expand All @@ -214,14 +232,23 @@ def check_custom_properties():
return (
check_custom_properties() and
equal(self.param('migratable'), getattr(entity, 'migratable', None)) and
equal(self.param('pass_through'), entity.pass_through.mode.name) and
equal(self.param('pass_through'), getattr(entity.pass_through.mode, 'name', None)) and
equal(self.param('description'), entity.description) and
equal(self.param('network_filter'), getattr(entity.network_filter, 'name', None)) and
equal(self.param('qos'), entity.qos.name) and
equal(self.param('port_mirroring'), getattr(entity, 'port_mirroring', None))
)


def get_entity(vnic_services, entitynics_module):
vnic_profiles = vnic_services.list()
network_id = entitynics_module._get_network_id()
for vnic in vnic_profiles:
# When vNIC already exist update it, when not create it
if vnic.name == entitynics_module.param('name') and network_id == vnic.network.id:
return vnic


def main():
argument_spec = ovirt_full_argument_spec(
state=dict(type='str', default='present', choices=['absent', 'present']),
Expand Down Expand Up @@ -254,11 +281,14 @@ def main():
service=vnic_services,
)
state = module.params['state']
entity = get_entity(vnic_services, entitynics_module)
if state == 'present':
ret = entitynics_module.create()
ret = entitynics_module.create(entity=entity, force_create=entity is None)
elif state == 'absent':
ret = entitynics_module.remove()

if entity is not None:
ret = entitynics_module.remove(entity=entity)
else:
raise Exception("Vnic profile '%s' in network '%s' was not found." % (module.params['name'], module.params['network']))
module.exit_json(**ret)
except Exception as e:
module.fail_json(msg=str(e), exception=traceback.format_exc())
Expand Down