# coding=utf-8
#
# Copyright 2014-2017 F5 Networks Inc.
#
# 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.
#
"""BIG-IP® Global Traffic Manager™ (GTM®) pool module.
REST URI
``http://localhost/mgmt/tm/gtm/wideip``
GUI Path
``DNS --> GSLB : Wide IPs``
REST Kind
``tm:gtm:pools:*``
"""
from distutils.version import LooseVersion
from f5.bigip.resource import Collection
from f5.bigip.resource import OrganizingCollection
from f5.bigip.resource import Resource
[docs]class Wideips(object):
"""BIG-IP® GTM WideIP factory
The GTM WideIP factory object is used to provide a consistent user
experience across the SDK, while supporting the breaking changes in
the BIG-IP APIs.
Between the 11.x and 12.x releases of BIG-IP, the REST endpoint for
WideIP changed from a Collection to an OrganizingCollection. The result
is that breaking changes occurred in the API.
This breakage led to a discussion on naming conventions because there
appeared to be a conflict now. For example, depending on your version,
only one of the following would work.
For 11.x,
tm.gtm.wideips.wideip.load(name='foo')
For 12.x,
tm.gtm.wideips.a_s.a.load(name='foo')
but not both. To stick with a consistent user experience, we decided
to override the __new__ method to support both examples above. The SDK
automatically detects which one to use based on the BIG-IP you are
communicating with.
"""
def __new__(cls, container):
tmos_v = container._meta_data['bigip']._meta_data['tmos_version']
if LooseVersion(tmos_v) < LooseVersion('12.0.0'):
return WideipCollection(container)
else:
return WideipOrganizingCollection(container)
[docs]class WideipOrganizingCollection(OrganizingCollection):
"""v12.x GTM WideIP is an OC."""
def __init__(self, gtm):
self.__class__.__name__ = 'Wideip'
super(WideipOrganizingCollection, self).__init__(gtm)
self._meta_data['allowed_lazy_attributes'] = [
A_s,
Aaaas,
Cnames,
Mxs,
Naptrs,
Srvs,
]
[docs]class A_s(Collection):
"""v12.x BIG-IP® A wideip collection.
Class name needed changing due to
'as' being reserved python keyword
"""
def __init__(self, wideip):
super(A_s, self).__init__(wideip)
self._meta_data['allowed_lazy_attributes'] = [A]
self._meta_data['attribute_registry'] = \
{'tm:gtm:wideip:a:astate': A}
[docs]class A(Resource):
"""v12.x BIG-IP®A wideip resource"""
def __init__(self, _as):
super(A, self).__init__(_as)
self._meta_data['required_json_kind'] = \
'tm:gtm:wideip:a:astate'
[docs]class Aaaas(Collection):
"""v12.x BIG-IP® AAAA wideip collection"""
def __init__(self, wideip):
super(Aaaas, self).__init__(wideip)
self._meta_data['allowed_lazy_attributes'] = [Aaaa]
self._meta_data['attribute_registry'] = \
{'tm:gtm:wideip:aaaa:aaaastate': Aaaa}
[docs]class Aaaa(Resource):
"""v12.x BIG-IP® AAAA wideip resource"""
def __init__(self, aaaas):
super(Aaaa, self).__init__(aaaas)
self._meta_data['required_json_kind'] = \
'tm:gtm:wideip:aaaa:aaaastate'
[docs]class Cnames(Collection):
"""v12.x BIG-IP® CNAME wideip collection"""
def __init__(self, wideip):
super(Cnames, self).__init__(wideip)
self._meta_data['allowed_lazy_attributes'] = [Cname]
self._meta_data['attribute_registry'] = \
{'tm:gtm:wideip:cname:cnamestate': Cname}
[docs]class Cname(Resource):
"""v12.x BIG-IP® CNAME wideip resource"""
def __init__(self, cnames):
super(Cname, self).__init__(cnames)
self._meta_data['required_json_kind'] = \
'tm:gtm:wideip:cname:cnamestate'
[docs]class Mxs(Collection):
"""v12.x BIG-IP® MX wideip collection."""
def __init__(self, wideip):
super(Mxs, self).__init__(wideip)
self._meta_data['allowed_lazy_attributes'] = [Mx]
self._meta_data['attribute_registry'] = \
{'tm:gtm:wideip:mx:mxstate': Mx}
[docs]class Mx(Resource):
"""v12.x BIG-IP® MX wideip resource"""
def __init__(self, mxs):
super(Mx, self).__init__(mxs)
self._meta_data['required_json_kind'] = \
'tm:gtm:wideip:mx:mxstate'
[docs]class Naptrs(Collection):
"""v12.x BIG-IP® NAPTR wideip collection"""
def __init__(self, wideip):
super(Naptrs, self).__init__(wideip)
self._meta_data['allowed_lazy_attributes'] = [Naptr]
self._meta_data['attribute_registry'] = \
{'tm:gtm:wideip:naptr:naptrstate': Naptr}
[docs]class Naptr(Resource):
"""v12.x BIG-IP® NAPTR wideip resource"""
def __init__(self, naptrs):
super(Naptr, self).__init__(naptrs)
self._meta_data['required_json_kind'] = \
'tm:gtm:wideip:naptr:naptrstate'
[docs]class Srvs(Collection):
"""v12.x BIG-IP® SRV wideip collection"""
def __init__(self, wideip):
super(Srvs, self).__init__(wideip)
self._meta_data['allowed_lazy_attributes'] = [Srv]
self._meta_data['attribute_registry'] = \
{'tm:gtm:wideip:srv:srvstate': Srv}
[docs]class Srv(Resource):
"""v12.x BIG-IP® SRV wideip resource"""
def __init__(self, naptrs):
super(Srv, self).__init__(naptrs)
self._meta_data['required_json_kind'] = \
'tm:gtm:wideip:srv:srvstate'
[docs]class WideipCollection(Collection):
"""v11.x BIG-IP® GTM wideip collection"""
def __init__(self, gtm):
self.__class__.__name__ = 'Wideips'
super(WideipCollection, self).__init__(gtm)
self._meta_data['allowed_lazy_attributes'] = [Wideip]
self._meta_data['attribute_registry'] = \
{'tm:gtm:wideip:wideipstate': Wideip}
[docs]class Wideip(Resource):
"""v11.x BIG-IP® GTM pool resource"""
def __init__(self, wideips):
super(Wideip, self).__init__(wideips)
self._meta_data['required_json_kind'] = 'tm:gtm:wideip:wideipstate'