Skip to content

Commit

Permalink
Adds test for Router Interface idempotence
Browse files Browse the repository at this point in the history
This patch adds a test to ensure router interface idempotence and
updates the router interface resource class to handle the case
when a router interface already exists when attempting to create
an identical one.

This patch also fixes a small bug in the router interface where
it was using the "subnet_name" key where it should have been
using a "subnet_id" key.  This was causing the unintended behavior
of never finding a matching port when checking for ports that may
have already been created, so it always tried to create the port
leading to conflicts.
  • Loading branch information
Ryan Brady committed May 13, 2020
1 parent af2bc6e commit 6e9fb74
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 3 deletions.
5 changes: 2 additions & 3 deletions os_migrate/plugins/module_utils/router_interface.py
Expand Up @@ -58,7 +58,7 @@ def create_or_update(self, conn):
# 1. ensure a port exists with the required `fixed_ips`
sdk_params = self._to_sdk_params(refs)
port = self._find_port_by_subnet_ips(conn, refs)

# try:
if port:
# port exists but is assigned to something else => fail
if ((port['device_owner'] and port['device_owner'] != 'network:router_interface')
Expand All @@ -81,7 +81,6 @@ def create_or_update(self, conn):
conn.network.add_interface_to_router(
refs['device_id'], port_id=port['id'])
changed = True

return changed

def _find_port_by_subnet_ips(self, conn, refs):
Expand Down Expand Up @@ -151,7 +150,7 @@ def _refs_from_ser(self, conn):
for fixed_ip in params['fixed_ips_names']:
refs['fixed_ips'].append({
'ip_address': fixed_ip['ip_address'],
'subnet_name': reference.subnet_id(conn, fixed_ip['subnet_name']),
'subnet_id': reference.subnet_id(conn, fixed_ip['subnet_name']),
})
refs['device_name'] = params['device_name']
refs['device_id'] = reference.router_id(conn, params['device_name'])
Expand Down
8 changes: 8 additions & 0 deletions tests/func/idempotence/all.yml
Expand Up @@ -36,3 +36,11 @@
tags:
- test_security_group_rule
tags: always

- name: Include router interface tasks
include_tasks: router_interface.yml
args:
apply:
tags:
- test_router_interface
tags: always
55 changes: 55 additions & 0 deletions tests/func/idempotence/router_interface.yml
@@ -0,0 +1,55 @@
### EXPORT IDEMPOTENCE ###

- include_role:
name: os_migrate.os_migrate.export_router_interfaces
vars:
export_routers_name_filter:
- regex: '^osm_'

- name: re-load resources for idempotency test
set_fact:
router_interface_resources_idem: "{{ (lookup('file',
os_migrate_data_dir +
'/router_interfaces.yml') | from_yaml)
['resources'] }}"

- name: verify that export file did not change
assert:
that:
- router_interface_resources_idem == router_interface_resources
fail_msg: |
router_interface_resources_idem:
{{ router_interface_resources_idem | to_nice_yaml }}
router_interface_resources:
{{ router_interface_resources | to_nice_yaml }}
### IMPORT IDEMPOTENCE ###

- name: look up osm_router dst cloud
os_migrate.os_migrate.os_routers_info:
auth: "{{ os_migrate_dst_auth }}"
auth_type: "{{ os_migrate_dst_auth_type|default(omit) }}"
region_name: "{{ os_migrate_dst_region_name|default(omit) }}"
register: ri_import_idem_before

- include_role:
name: os_migrate.os_migrate.import_router_interfaces

- name: look up osm_router in dst cloud again
os_migrate.os_migrate.os_routers_info:
auth: "{{ os_migrate_dst_auth }}"
auth_type: "{{ os_migrate_dst_auth_type|default(omit) }}"
region_name: "{{ os_migrate_dst_region_name|default(omit) }}"
register: ri_import_idem_after

- name: ensure updated_at for osm_router did not change
assert:
that:
- ri_import_idem_before['openstack_routers'][0].updated_at != None
- "ri_import_idem_before['openstack_routers'][0]['updated_at'] \
== ri_import_idem_after['openstack_routers'][0]['updated_at']"
fail_msg: |
ri_import_idem_before updated_at:
{{ ri_import_idem_before['openstack_routers'][0].updated_at }}
ri_import_idem_after updated_at:
{{ ri_import_idem_after['openstack_routers'][0].updated_at }}

0 comments on commit 6e9fb74

Please sign in to comment.