Refactor handle_update to use prop_diff

Changes remaining resources(Router, NetworkGateway) to
use prop_diff in handle_update.

Also refactors some common stuff to prepare_update_properties.

Change-Id: I18f4ce78492779261b542ff6de8898eb729947b8
Closes-Bug: #1521836
This commit is contained in:
Rabi Mishra 2015-12-29 19:11:17 +05:30
parent 6c7e4e4b2f
commit d37cc18b1b
11 changed files with 44 additions and 71 deletions

View File

@ -130,8 +130,7 @@ class Firewall(neutron.NeutronResource):
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if prop_diff:
if self.VALUE_SPECS in prop_diff:
self.merge_value_specs(prop_diff)
self.prepare_update_properties(prop_diff)
self.client().update_firewall(
self.resource_id, {'firewall': prop_diff})

View File

@ -170,6 +170,7 @@ class Net(neutron.NeutronResource):
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if prop_diff:
self.prepare_update_properties(prop_diff)
if self.DHCP_AGENT_IDS in prop_diff:
dhcp_agent_ids = prop_diff.pop(self.DHCP_AGENT_IDS, [])
self._replace_dhcp_agents(dhcp_agent_ids)
@ -178,12 +179,6 @@ class Net(neutron.NeutronResource):
prop_diff[
'qos_policy_id'] = self.client_plugin().get_qos_policy_id(
qos_policy) if qos_policy else None
if self.VALUE_SPECS in prop_diff:
self.merge_value_specs(prop_diff)
if (self.NAME in prop_diff and
prop_diff[self.NAME] is None):
prop_diff[self.NAME] = self.physical_resource_name()
if prop_diff:
self.client().update_network(self.resource_id,
{'network': prop_diff})

View File

@ -223,22 +223,22 @@ class NetworkGateway(neutron.NeutronResource):
return True
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
props = self.prepare_update_properties(json_snippet)
connections = props.pop(self.CONNECTIONS)
connections = None
if self.CONNECTIONS in prop_diff:
connections = prop_diff.pop(self.CONNECTIONS)
if self.DEVICES in prop_diff:
self.handle_delete()
self.properties.data.update(props)
self.properties.data.update(prop_diff)
self.handle_create()
return
else:
props.pop(self.DEVICES, None)
if self.NAME in prop_diff:
if prop_diff:
self.prepare_update_properties(prop_diff)
self.client().update_network_gateway(
self.resource_id, {'network_gateway': props})
self.resource_id, {'network_gateway': prop_diff})
if self.CONNECTIONS in prop_diff:
if connections:
for connection in self.properties[self.CONNECTIONS]:
with self.client_plugin().ignore_not_found:
self.client_plugin().resolve_network(

View File

@ -75,24 +75,16 @@ class NeutronResource(resource.Resource):
value_spec_props = props.pop('value_specs')
props.update(value_spec_props)
def prepare_update_properties(self, definition):
"""Prepares the property values for correct Neutron update call.
def prepare_update_properties(self, prop_diff):
"""Prepares prop_diff values for correct neutron update call.
Prepares the property values so that they can be passed directly to
the Neutron update call.
Removes any properties which are not update_allowed, then processes
as for prepare_properties.
1. Merges value_specs
2. Defaults resource name to physical resource name if None
"""
p = definition.properties(self.properties_schema, self.context)
update_props = dict((k, v) for k, v in p.items()
if p.props.get(k).schema.update_allowed and
k not in self.update_exclude_properties)
props = self.prepare_properties(
update_props,
self.physical_resource_name())
return props
if 'value_specs' in prop_diff and prop_diff['value_specs']:
NeutronResource.merge_value_specs(prop_diff)
if 'name' in prop_diff and prop_diff['name'] is None:
prop_diff['name'] = self.physical_resource_name()
@staticmethod
def is_built(attributes):

View File

@ -475,15 +475,11 @@ class Port(neutron.NeutronResource):
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if prop_diff:
if self.VALUE_SPECS in prop_diff:
self.merge_value_specs(prop_diff)
self.prepare_update_properties(prop_diff)
if self.QOS_POLICY in prop_diff:
qos_policy = prop_diff.pop(self.QOS_POLICY)
prop_diff['qos_policy_id'] = self.client_plugin(
).get_qos_policy_id(qos_policy) if qos_policy else None
if (self.NAME in prop_diff and
prop_diff[self.NAME] is None):
prop_diff[self.NAME] = self.physical_resource_name()
self._prepare_port_properties(prop_diff, prepare_for_update=True)
LOG.debug('updating port with %s' % prop_diff)
self.client().update_port(self.resource_id, {'port': prop_diff})

View File

@ -138,9 +138,7 @@ class ProviderNet(net.Net):
"""
if prop_diff:
ProviderNet.prepare_provider_properties(prop_diff)
if (self.NAME in prop_diff and
prop_diff[self.NAME] is None):
prop_diff[self.NAME] = self.physical_resource_name()
self.prepare_update_properties(prop_diff)
self.client().update_network(self.resource_id,
{'network': prop_diff})

View File

@ -94,10 +94,10 @@ class QoSPolicy(neutron.NeutronResource):
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if prop_diff:
props = self.prepare_update_properties(json_snippet)
self.prepare_update_properties(prop_diff)
self.client().update_qos_policy(
self.resource_id,
{'policy': props})
{'policy': prop_diff})
def _show_resource(self):
return self.client().show_qos_policy(

View File

@ -209,8 +209,7 @@ class Router(neutron.NeutronResource):
if subnet_net == external_gw_net:
deps += (self, res)
def prepare_properties(self, properties, name):
props = super(Router, self).prepare_properties(properties, name)
def _resolve_gateway(self, props):
gateway = props.get(self.EXTERNAL_GATEWAY)
if gateway:
self.client_plugin().resolve_network(
@ -231,7 +230,7 @@ class Router(neutron.NeutronResource):
props = self.prepare_properties(
self.properties,
self.physical_resource_name())
self._resolve_gateway(props)
l3_agent_ids = self._get_l3_agent_list(props)
router = self.client().create_router({'router': props})['router']
@ -257,19 +256,17 @@ class Router(neutron.NeutronResource):
return True
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
props = self.prepare_update_properties(json_snippet)
l3_agent_ids = self._get_l3_agent_list(props)
if l3_agent_ids:
if self.EXTERNAL_GATEWAY in prop_diff:
self._resolve_gateway(prop_diff)
if self.L3_AGENT_IDS in prop_diff or self.L3_AGENT_ID in prop_diff:
l3_agent_ids = self._get_l3_agent_list(prop_diff)
self._replace_agent(l3_agent_ids)
if self.L3_AGENT_IDS in prop_diff:
del prop_diff[self.L3_AGENT_IDS]
if self.L3_AGENT_ID in prop_diff:
del prop_diff[self.L3_AGENT_ID]
if len(prop_diff) > 0:
if prop_diff:
self.prepare_update_properties(prop_diff)
self.client().update_router(
self.resource_id, {'router': props})
self.resource_id, {'router': prop_diff})
def _replace_agent(self, l3_agent_ids=None):
ret = self.client().list_l3_agent_hosting_routers(

View File

@ -221,7 +221,6 @@ class SecurityGroup(neutron.NeutronResource):
self.client_plugin().ignore_not_found(ex)
def handle_delete(self):
if self.resource_id is None:
return
@ -230,18 +229,20 @@ class SecurityGroup(neutron.NeutronResource):
self.client().delete_security_group(self.resource_id)
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
props = self.prepare_update_properties(json_snippet)
rules = props.pop(self.RULES, [])
self.client().update_security_group(
self.resource_id, {'security_group': props})
# handle rules changes by:
# * deleting all rules
# * restoring the default egress rules
# * creating new rules
self._delete_rules()
self._create_rules(self.default_egress_rules)
rules = None
if self.RULES in prop_diff:
rules = prop_diff.pop(self.RULES)
self._delete_rules()
self._create_rules(self.default_egress_rules)
if prop_diff:
self.prepare_update_properties(prop_diff)
self.client().update_security_group(
self.resource_id, {'security_group': prop_diff})
if rules:
self._create_rules(rules)

View File

@ -349,14 +349,10 @@ class Subnet(neutron.NeutronResource):
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if prop_diff:
if self.VALUE_SPECS in prop_diff:
self.merge_value_specs(prop_diff)
self.prepare_update_properties(prop_diff)
if (self.ALLOCATION_POOLS in prop_diff and
prop_diff[self.ALLOCATION_POOLS] is None):
prop_diff[self.ALLOCATION_POOLS] = []
if (self.NAME in prop_diff and
prop_diff[self.NAME] is None):
prop_diff[self.NAME] = self.physical_resource_name()
# If the new value is '', set to None
self._null_gateway_ip(prop_diff)

View File

@ -835,12 +835,11 @@ class NeutronRouterTest(common.HeatTestCase):
neutronclient.Client.update_router(
'3e46229d-8fce-4733-819a-b5fe630550f8',
{'router': {
"name": "Test Router",
"external_gateway_info": {
'network_id': '91e47a57-7508-46fe-afc9-fc454e8580e1',
'enable_snat': False
},
"admin_state_up": True}}
}}
).AndReturn(None)
neutronclient.Client.show_router(