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:
parent
6c7e4e4b2f
commit
d37cc18b1b
|
@ -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})
|
||||
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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})
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue