#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

from oslo_versionedobjects import base
from oslo_versionedobjects import fields

from os_vif.objects import base as osv_base


@base.VersionedObjectRegistry.register
class Route(osv_base.VersionedObject):
    """Represents a route."""
    # Version 1.0: Initial version
    VERSION = '1.0'

    fields = {
        'cidr': fields.IPNetworkField(),
        'gateway': fields.IPAddressField(),
        'interface': fields.StringField(),
    }


@base.VersionedObjectRegistry.register
class RouteList(osv_base.VersionedObject, base.ObjectListBase):
    # Version 1.0: Initial version
    VERSION = '1.0'

    fields = {
        'objects': fields.ListOfObjectsField('Route'),
    }

#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

from oslo_versionedobjects import base
from oslo_versionedobjects import fields

from os_vif.objects import base as osv_base


@base.VersionedObjectRegistry.register
class Route(osv_base.VersionedObject):
    """Represents a route."""
    # Version 1.0: Initial version
    VERSION = '1.0'

    fields = {
        'cidr': fields.IPNetworkField(),
        'gateway': fields.IPAddressField(),
        # TODO(mriedem): This field is never set by Nova, remove it in v2.0
        # of this object.
        'interface': fields.StringField(),
    }


@base.VersionedObjectRegistry.register
class RouteList(osv_base.VersionedObject, base.ObjectListBase):
    # Version 1.0: Initial version
    VERSION = '1.0'

    fields = {
        'objects': fields.ListOfObjectsField('Route'),
    }

Add a reminder to remove Route.interface field
Add a reminder to remove Route.interface field

Nova never sets the Route.interface value to anything but
None which fails with an error:

"ValueError: Fieldinterface' cannot be None"

This looks like a carry-over from the nova.network.model.Route
class which has an interface field which is set to None by default
but that field is never set to anything else in Nova, neither
for nova-network or Neutron.

Furthermore, it looks like 'interface' is not something that's
in the Route data model in Neutron either.

We don't hit this in the gate because the subnets we're testing
with don't have host_routes set.

The ValueError was fixed in Nova by not setting the attribute:

1d57c1fd53e930b02c3ce0e9914f95ef68dd1f87

This change adds a TODO to remove it in version 2.0 of the Route object.

Change-Id: Ib25a79514fe4335f4df222c02fefc9da62fe04ce
Closes-Bug: #1612812
