Skip to content

Commit

Permalink
Merge pull request #215 from edarzins/metadata-1
Browse files Browse the repository at this point in the history
Add metadata to LTM resources
  • Loading branch information
russokj committed Mar 13, 2018
2 parents bb728ae + 654e322 commit a2bc189
Show file tree
Hide file tree
Showing 15 changed files with 106 additions and 29 deletions.
4 changes: 3 additions & 1 deletion f5_cccl/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def __init__(self, bigip, partition, user_agent=None, prefix=None,
# Set user-agent for ICR session
if user_agent is not None:
bigip.icrs.append_user_agent(user_agent)
self._user_agent = user_agent

self._bigip_proxy = BigIPProxy(bigip,
partition,
Expand All @@ -80,7 +81,8 @@ def apply_ltm_config(self, services):
:return: True if successful, otherwise an exception is thrown.
"""
return self._service_manager.apply_ltm_config(services)
return self._service_manager.apply_ltm_config(services,
self._user_agent)

def apply_net_config(self, services):
"""Apply NET service configurations to the BIG-IP partition.
Expand Down
7 changes: 6 additions & 1 deletion f5_cccl/resource/ltm/irule.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,18 @@ class IRule(Resource):
properties = dict(
name=None,
partition=None,
apiAnonymous=None
apiAnonymous=None,
metadata=list()
)

def __init__(self, name, partition, **data):
"""Create the iRule"""
super(IRule, self).__init__(name, partition)

self._data['metadata'] = data.get(
'metadata',
self.properties.get('metadata')
)
self._data['apiAnonymous'] = data.get(
'apiAnonymous',
self.properties.get('apiAnonymous')
Expand Down
1 change: 1 addition & 0 deletions f5_cccl/resource/ltm/policy/test/bigip_policy.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"status": "legacy",
"generation": 2600,
"metadata": [],
"rulesReference": {
"isSubcollection": true,
"link": "https://localhost/mgmt/tm/ltm/policy/~Test~wrapper_policy/rules?ver=12.1.1",
Expand Down
6 changes: 4 additions & 2 deletions f5_cccl/resource/ltm/policy/test/test_policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ def policy_0():
'name': "my_policy",
'partition': "Test",
'strategy': "/Common/first-match",
'rules': []
'rules': [],
'metadata': []
}
return Policy(**data)

Expand All @@ -87,7 +88,8 @@ def test_create_policy():
'name': "my_policy",
'partition': "Test",
'strategy': "/Common/first-match",
'rules': []
'rules': [],
'metadata': []
}
policy = Policy(**data)

Expand Down
3 changes: 2 additions & 1 deletion f5_cccl/resource/ltm/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ class Pool(Resource):
loadBalancingMode="round-robin",
description=None,
monitor="default",
membersReference={})
membersReference={},
metadata=list())

def __init__(self, name, partition, members=None, **properties):
u"""Create a Pool instance from CCCL poolType."""
Expand Down
12 changes: 10 additions & 2 deletions f5_cccl/resource/ltm/test/test_irule.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,12 @@
cfg_test = {
'name': 'ssl_redirect',
'partition': 'my_partition',
'apiAnonymous': ssl_redirect_irule_1
'apiAnonymous': ssl_redirect_irule_1,
'metadata': [{
'name': 'user_agent',
'persist': 'true',
'value': 'some-controller-v.1.4.0'
}]
}

class FakeObj: pass
Expand All @@ -50,7 +55,10 @@ def test_create_irule():

# verify all cfg items
for k,v in cfg_test.items():
assert irule.data[k] == v.strip()
if type(v) is not list:
assert irule.data[k] == v.strip()
else:
assert irule.data[k] == v


def test_hash():
Expand Down
15 changes: 13 additions & 2 deletions f5_cccl/resource/ltm/test/test_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,12 @@
'description': None}
]
},
'name': u'pool1'
'name': u'pool1',
'metadata': [{
'name': 'user_agent',
'persist': 'true',
'value': 'some-controller-v.1.4.0'
}]
},
{'description': None,
'partition': 'Common',
Expand All @@ -65,7 +70,12 @@
{"address": "172.16.0.100%0", "port": 8080},
{"address": "172.16.0.101%0", "port": 8080}
],
"monitors": ["/Common/http"]
"monitors": ["/Common/http"],
'metadata': [{
'name': 'user_agent',
'persist': 'true',
'value': 'some-controller-v.1.4.0'
}]
},
{ "name": "pool2",
"members": [
Expand Down Expand Up @@ -167,6 +177,7 @@ def test_create_pool(cccl_pool1):
assert pool.data['loadBalancingMode'] == "round-robin"
assert not pool.data['description']
assert pool.data['monitor'] == "/Common/http"
assert 'metadata' in pool.data

assert len(pool) == 2

Expand Down
14 changes: 12 additions & 2 deletions f5_cccl/resource/ltm/test/test_virtual.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,12 @@
"sourceAddressTranslation": {
"type": "snat",
"pool": "/Test/snatpool1"
}
},
'metadata': [{
'name': 'user_agent',
'persist': 'true',
'value': 'some-controller-v.1.4.0'
}]
}


Expand Down Expand Up @@ -335,7 +340,12 @@ def test_ipv6_destination():
"sourceAddressTranslation": {
"type": "snat",
"pool": "/Test/snatpool1"
}
},
'metadata': [{
'name': 'user_agent',
'persist': 'true',
'value': 'some-controller-v.1.4.0'
}]
}


Expand Down
8 changes: 7 additions & 1 deletion f5_cccl/resource/ltm/test/test_virtual_address.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,12 @@
"autoDelete": "true",
"enabled": "yes",
"description": "Test virutal address resource",
"trafficGroup": "/Common/traffic-group-local-only"
"trafficGroup": "/Common/traffic-group-local-only",
'metadata': [{
'name': 'user_agent',
'persist': 'true',
'value': 'some-controller-v.1.4.0'
}]
}

@pytest.fixture
Expand Down Expand Up @@ -74,6 +79,7 @@ def test_update_virtual_address():
va = VirtualAddress(**va_cfg)

assert 'address' in va.data
assert 'metadata' in va.data

# Verify that immutable 'address' is not passed to parent method
with patch.object(Resource, 'update') as mock_method:
Expand Down
3 changes: 2 additions & 1 deletion f5_cccl/resource/ltm/virtual.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ class VirtualServer(Resource):
pool=None,
policies=list(),
profiles=list(),
rules=list())
rules=list(),
metadata=list())

def __init__(self, name, partition, default_route_domain, **properties):
"""Create a Virtual server instance."""
Expand Down
3 changes: 2 additions & 1 deletion f5_cccl/resource/ltm/virtual_address.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ class VirtualAddress(Resource):
autoDelete="false",
enabled=None,
description=None,
trafficGroup="/Common/traffic-group-1")
trafficGroup="/Common/traffic-group-1",
metadata=list())

def __init__(self, name, partition, default_route_domain, **properties):
"""Create a VirtualAddress instance."""
Expand Down
29 changes: 23 additions & 6 deletions f5_cccl/service/config_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def __init__(self, partition):
self._partition = partition

def _create_config_item(self, resource_type, obj,
default_route_domain=None):
default_route_domain=None, user_agent=None):
"""Create an API resource object and handle exceptions.
This is a factory method to create resource objects in
Expand All @@ -66,6 +66,18 @@ def _create_config_item(self, resource_type, obj,
:raises: f5_cccl.exceptions.F5CcclConfigurationReadError
"""
config_resource = None

# Update the object with metadata
if user_agent is not None:
metadata = {
'metadata': [{
'name': 'user_agent',
'persist': 'true',
'value': user_agent
}]
}
obj.update(metadata)

try:
if default_route_domain is not None:
config_resource = resource_type(
Expand All @@ -87,7 +99,8 @@ def _create_config_item(self, resource_type, obj,
return config_resource

# pylint: disable=too-many-locals
def read_ltm_config(self, service_config, default_route_domain):
def read_ltm_config(self, service_config, default_route_domain,
user_agent):
"""Read the LTM service configuration and save as resource object."""
config_dict = dict()
config_dict['http_monitors'] = dict()
Expand All @@ -101,28 +114,32 @@ def read_ltm_config(self, service_config, default_route_domain):
virtuals = service_config.get('virtualServers', list())
config_dict['virtuals'] = {
v['name']: self._create_config_item(ApiVirtualServer, v,
default_route_domain)
default_route_domain,
user_agent=user_agent)
for v in virtuals
}

# Get the list of explicitly defined virtual addresses.
virtual_addresses = service_config.get('virtualAddresses', list())
config_dict['virtual_addresses'] = {
va['name']: self._create_config_item(ApiVirtualAddress, va,
default_route_domain)
default_route_domain,
user_agent=user_agent)
for va in virtual_addresses
}

pools = service_config.get('pools', list())
config_dict['pools'] = {
p['name']: self._create_config_item(ApiPool, p,
default_route_domain)
default_route_domain,
user_agent=user_agent)
for p in pools
}

irules = service_config.get('iRules', list())
config_dict['irules'] = {
p['name']: self._create_config_item(ApiIRule, p)
p['name']: self._create_config_item(ApiIRule, p,
user_agent=user_agent)
for p in irules
}

Expand Down
4 changes: 2 additions & 2 deletions f5_cccl/service/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ def get_partition(self):
"""Get the name of the managed partition."""
return self._partition

def apply_ltm_config(self, service_config):
def apply_ltm_config(self, service_config, user_agent):
"""Apply the desired LTM service configuration.
Args:
service_config: The desired configuration state of the managed
Expand All @@ -522,7 +522,7 @@ def apply_ltm_config(self, service_config):

# Read in the configuration
desired_config = self._config_reader.read_ltm_config(
service_config, default_route_domain)
service_config, default_route_domain, user_agent)

# Deploy the service desired configuration.
retval = self._service_deployer.deploy_ltm(
Expand Down
6 changes: 4 additions & 2 deletions f5_cccl/service/test/test_config_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ def test_create_reader(self):

def test_get_config(self):
reader = ServiceConfigReader(self.partition)
config = reader.read_ltm_config(self.ltm_service, 0)
config = reader.read_ltm_config(self.ltm_service, 0,
'marathon-bigip-ctlr-v1.2.1')

assert len(config.get('virtuals')) == 1
assert len(config.get('pools')) == 1
Expand All @@ -70,4 +71,5 @@ def test_create_config_item_exception(self):
with patch.object(ApiVirtualServer, '__init__', side_effect=ValueError("test exception")):
reader = ServiceConfigReader(self.partition)
with pytest.raises(F5CcclConfigurationReadError) as e:
reader.read_ltm_config(self.ltm_service, 0)
reader.read_ltm_config(self.ltm_service, 0,
'marathon-bigip-ctlr-v1.2.1')

0 comments on commit a2bc189

Please sign in to comment.