######### # Copyright (c) 2014 GigaSpaces Technologies Ltd. All rights reserved # # 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 cloudify import ctx from cloudify.decorators import operation from cloudify.exceptions import NonRecoverableError from openstack_plugin_common import ( with_neutron_client, provider, is_external_relationship, is_external_relationship_not_conditionally_created, OPENSTACK_ID_PROPERTY ) from openstack_plugin_common.floatingip import ( use_external_floatingip, set_floatingip_runtime_properties, delete_floatingip, floatingip_creation_validation ) @operation @with_neutron_client def create(neutron_client, args, **kwargs): if use_external_floatingip(neutron_client, 'floating_ip_address', lambda ext_fip: ext_fip['floating_ip_address']): return floatingip = { # No defaults } floatingip.update(ctx.node.properties['floatingip'], **args) # Sugar: floating_network_name -> (resolve) -> floating_network_id if 'floating_network_name' in floatingip: floatingip['floating_network_id'] = neutron_client.cosmo_get_named( 'network', floatingip['floating_network_name'])['id'] del floatingip['floating_network_name'] elif 'floating_network_id' not in floatingip: provider_context = provider(ctx) ext_network = provider_context.ext_network if ext_network: floatingip['floating_network_id'] = ext_network['id'] else: raise NonRecoverableError( 'Missing floating network id, name or external network') fip = neutron_client.create_floatingip( {'floatingip': floatingip})['floatingip'] set_floatingip_runtime_properties(fip['id'], fip['floating_ip_address']) ctx.logger.info('Floating IP creation response: {0}'.format(fip)) @operation @with_neutron_client def delete(neutron_client, **kwargs): delete_floatingip(neutron_client) @operation @with_neutron_client def creation_validation(neutron_client, **kwargs): floatingip_creation_validation(neutron_client, 'floating_ip_address') @operation @with_neutron_client def connect_port(neutron_client, **kwargs): if is_external_relationship_not_conditionally_created(ctx): return port_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY] floating_ip_id = ctx.target.instance.runtime_properties[ OPENSTACK_ID_PROPERTY] fip = {'port_id': port_id} neutron_client.update_floatingip(floating_ip_id, {'floatingip': fip}) @operation @with_neutron_client def disconnect_port(neutron_client, **kwargs): if is_external_relationship(ctx): ctx.logger.info('Not disassociating floatingip and port since ' 'external floatingip and port are being used') return floating_ip_id = ctx.target.instance.runtime_properties[ OPENSTACK_ID_PROPERTY] fip = {'port_id': None} neutron_client.update_floatingip(floating_ip_id, {'floatingip': fip})