Note: This bug is displayed in read-only format because the product is no longer active in Red Hat Bugzilla.

Bug 1590359

Summary: [ovn-provider] wrong message when posting a Subnet with no default gateway
Product: [oVirt] ovirt-engine Reporter: Roni <reliezer>
Component: BLL.NetworkAssignee: Miguel Duarte Barroso <mduarted>
Status: CLOSED CURRENTRELEASE QA Contact: Roni <reliezer>
Severity: low Docs Contact:
Priority: low    
Version: 4.2.4.1CC: bugs, mburman, mduarted, mmirecki
Target Milestone: ovirt-4.2.6Flags: rule-engine: ovirt-4.2+
rule-engine: ovirt-4.3+
Target Release: ---   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: ovirt-provider-ovn-1.2.14 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2018-09-03 15:11:00 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: Network RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Attachments:
Description Flags
python_script_to_simulate_the_error none

Description Roni 2018-06-12 13:27:32 UTC
Created attachment 1450517 [details]
python_script_to_simulate_the_error

Description of problem:
ovn-provider is trying to read an IP address from 'None' object instead
of raising an error message for missing default gateway IP

Version-Release number of selected component (if applicable):
4.2.4.2-0.1.el7_3

How reproducible:
100%

Steps to Reproduce:
NOTE: the attached script can simulate below steps
by commenting the line 344: "gateway_ip": "1.1.1.254"

1. Enable ovn-provider
2. Create Network using REST and get it's ID
3. Add Subnet using REST as followed:
   e.g.: {
           "name": "SUBNET_NAME",
           "cidr": "1.1.1.0/24",
           "enable_dhcp": True,
           "ip_version": 4,
           "network_id": (use above ID),
          }
4. Add Router using REST
   e.g.: {
         "name": ROUTER_NAME,
         "external_gateway_info":
            {
                "network_id": str(get the ID from #2 above),
                "enable_snat": False,
                "external_fixed_ips": [
                    {
                        "subnet_id": (get the ID from #3 above),
                        "ip_address": 1.1.1.1
                    }]}
           }

Actual results:
 got an error: "root failed to detect a valid IP address from None"

Expected results:
 "subnet can not be used as external_gateway, it does not have a default_gatway 
 definded"


Additional info:
to eliminate the error add: 
"gateway_ip": "1.1.1.254"
to the Subnet dictionary


See logs and Marcin comments at the chat below:

Error at the /var/log/ovirt-provider-ovn.log:

<reliezer> 2018-06-12 11:30:48,764 root From: 10.35.206.28:54072 Request: POST /v2.0/routers
<reliezer> 2018-06-12 11:30:48,764 root Request body:
<reliezer> {"router": {"external_gateway_info": {"network_id": "90245b55-b0cc-422d-ac96-3f0810b1ab0b", "enable_snat": false, "external_fixed_ips": [{"subnet_id": "d03accc6-aec0-443f-901c-c1095681d66b", "ip_address": "1.1.1.111"}]}, "name": "ovn_router_test_3"}}
<reliezer> 2018-06-12 11:30:48,764 root failed to detect a valid IP address from None
<reliezer> Traceback (most recent call last):
<reliezer>   File "/usr/share/ovirt-provider-ovn/handlers/base_handler.py", line 133, in _handle_request
<reliezer>     method, path_parts, content)
<reliezer>   File "/usr/share/ovirt-provider-ovn/handlers/selecting_handler.py", line 175, in handle_request
<reliezer>     return self.call_response_handler(handler, content, parameters)
<reliezer>   File "/usr/share/ovirt-provider-ovn/handlers/neutron.py", line 36, in call_response_handler
<reliezer>     return response_handler(ovn_north, content, parameters)
<reliezer>   File "/usr/share/ovirt-provider-ovn/handlers/neutron_responses.py", line 205, in post_routers
<reliezer>     router = nb_db.add_router(received_router)
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north_mappers.py", line 69, in wrapper
<reliezer>     else f(wrapped_self, rest_data))
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north_mappers.py", line 52, in wrapper
<reliezer>     return cls.rest2row(wrapped_self, f, rest_data, entity_id)
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north_mappers.py", line 561, in rest2row
<reliezer>     gateway_ip=ip
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north_mappers.py", line 76, in wrapper
<reliezer>     data = f(wrapped_self, *args, **kwargs)
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north.py", line 779, in add_router
<reliezer>     name, enabled, network_id, gateway_subnet, gateway_ip
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north.py", line 734, in _add_router
<reliezer>     gateway_ip, gateway_subnet_id, network_id, router_id
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north.py", line 750, in _add_external_gateway_to_router
<reliezer>     self._add_default_route_to_router(router_id, subnet)
<reliezer>   File "/usr/share/ovirt-provider-ovn/ovndb/ovn_north.py", line 768, in _add_default_route_to_router
<reliezer>     default_gateway
<reliezer>   File "/usr/lib/python2.7/site-packages/ovsdbapp/schema/ovn_northbound/impl_idl.py", line 140, in lr_route_add
<reliezer>     policy, may_exist)
<reliezer>   File "/usr/lib/python2.7/site-packages/ovsdbapp/schema/ovn_northbound/commands.py", line 653, in __init__
<reliezer>     nexthop = str(netaddr.IPAddress(nexthop))
<reliezer>   File "/usr/lib/python2.7/site-packages/netaddr/ip/__init__.py", line 306, in __init__
<reliezer>     'address from %r' % addr)
<reliezer> AddrFormatError: failed to detect a valid IP address from None
<reliezer> 2018-06-12 11:34:32,875 requests.packages.urllib3.connectionpool Starting new HTTPS connection (1): network-ge-1.scl.lab.tlv.redhat.com
<reliezer> 2018-06-12 11:34:33,035 requests.packages.urllib3.connectionpool Starting new HTTPS connection (1): network-ge-1.scl.lab.tlv.redhat.com
<reliezer> 2018-06-12 11:34:33,163 requests.packages.urllib3.connectionpool Starting new HTTPS connection (1): network-ge-1.scl.lab.tlv.redhat.com


<mmirecki> can you please send me the output for: ovn-nbctl list dhcp-options
<mmirecki> if you could fpaste it please
<reliezer> [root@network-ge-1 ~]# ovn-nbctl dhcp-options-list
<reliezer> d03accc6-aec0-443f-901c-c1095681d66b
<reliezer> [root@network-ge-1 ~]# 
<reliezer> [root@network-ge-1 ~]# ovn-nbctl list dhcp-options
<reliezer> _uuid               : d03accc6-aec0-443f-901c-c1095681d66b
<reliezer> cidr                : "1.1.1.0/24"
<reliezer> external_ids        : {ovirt_name="roni_subnet_test_3", ovirt_network_id="90245b55-b0cc-422d-ac96-3f0810b1ab0b"}
<reliezer> options             : {lease_time="86400", mtu="1442", server_id="1.1.1.0", server_mac="02:00:00:00:00:00"}


mmirecki> we create a router with a external_gatway to subnet "roni_subnet_test_3"
<mmirecki> so the port connecting to this subnet is the default route for the router
<mmirecki> we must set a default static route for this, which is:
<mmirecki> network: cidr of subnet
<mmirecki> nexthop: default gateway of subnet
<mmirecki> but: the default gateway of the subnet is not set, it is None
<mmirecki> so when trying to set it, we get: AddrFormatError: failed to detect a valid IP address from None
<mmirecki>  
<mmirecki> expected outcome should be: 
<mmirecki> (something like): Validation error: subnet can not be used as external_gateway, it does not have a default_gatway definded
<mmirecki> although the best thing to do would be to check what neutron does in this case

<mmirecki> but, this is a bug
<mmirecki> we should handle this condition
<mmirecki> so please open a BZ for this
<mmirecki> you can copy paste the expected results

Comment 1 Roni 2018-08-07 06:50:38 UTC
Verified: 4.2.6-0.1.el7ev

Info:
The new message:

'{\n  "error": {\n    "message": "Subnet 0855835a-79d6-409f-93af-8d97ce4f7232 cannot be used as external gateway, since it does not have a default gateway defined",\n    "code": 400,\n    "title": "Bad Request"\n  }\n}\n'