Updated stack tests to only use an admin user when necessary.
[snaps.git] / snaps / openstack / utils / settings_utils.py
index 80dfc84..e43f8f5 100644 (file)
@@ -17,35 +17,33 @@ import uuid
 from snaps import file_utils
 from snaps.config.flavor import FlavorConfig
 from snaps.config.keypair import KeypairConfig
+from snaps.config.network import SubnetConfig, PortConfig, NetworkConfig
 from snaps.config.router import RouterConfig
+from snaps.config.security_group import (
+    SecurityGroupRuleConfig, SecurityGroupConfig)
+from snaps.config.vm_inst import VmInstanceConfig, FloatingIpConfig
 from snaps.config.volume import VolumeConfig
 from snaps.config.volume_type import (
     ControlLocation,  VolumeTypeEncryptionConfig, VolumeTypeConfig)
-from snaps.openstack.create_instance import (
-    VmInstanceSettings, FloatingIpSettings)
-from snaps.openstack.create_network import (
-    PortSettings, SubnetSettings, NetworkSettings)
-from snaps.openstack.create_security_group import (
-    SecurityGroupSettings, SecurityGroupRuleSettings)
 from snaps.openstack.utils import (
     neutron_utils, nova_utils, heat_utils, glance_utils)
 
 
-def create_network_settings(neutron, network):
+def create_network_config(neutron, network):
     """
-    Returns a NetworkSettings object
+    Returns a NetworkConfig object
     :param neutron: the neutron client
     :param network: a SNAPS-OO Network domain object
     :return:
     """
-    return NetworkSettings(
+    return NetworkConfig(
         name=network.name, network_type=network.type,
-        subnet_settings=create_subnet_settings(neutron, network))
+        subnet_settings=create_subnet_config(neutron, network))
 
 
-def create_security_group_settings(neutron, security_group):
+def create_security_group_config(neutron, security_group):
     """
-    Returns a NetworkSettings object
+    Returns a SecurityGroupConfig object
     :param neutron: the neutron client
     :param security_group: a SNAPS-OO SecurityGroup domain object
     :return:
@@ -54,7 +52,7 @@ def create_security_group_settings(neutron, security_group):
 
     rule_settings = list()
     for rule in rules:
-        rule_settings.append(SecurityGroupRuleSettings(
+        rule_settings.append(SecurityGroupRuleConfig(
             sec_grp_name=security_group.name, description=rule.description,
             direction=rule.direction, ethertype=rule.ethertype,
             port_range_min=rule.port_range_min,
@@ -62,14 +60,14 @@ def create_security_group_settings(neutron, security_group):
             remote_group_id=rule.remote_group_id,
             remote_ip_prefix=rule.remote_ip_prefix))
 
-    return SecurityGroupSettings(
+    return SecurityGroupConfig(
         name=security_group.name, description=security_group.description,
         rule_settings=rule_settings)
 
 
-def create_subnet_settings(neutron, network):
+def create_subnet_config(neutron, network):
     """
-    Returns a list of SubnetSettings objects for a given network
+    Returns a list of SubnetConfig objects for a given network
     :param neutron: the OpenStack neutron client
     :param network: the SNAPS-OO Network domain object
     :return: a list
@@ -90,11 +88,11 @@ def create_subnet_settings(neutron, network):
         kwargs['host_routes'] = subnet.host_routes
         kwargs['ipv6_ra_mode'] = subnet.ipv6_ra_mode
         kwargs['ipv6_address_mode'] = subnet.ipv6_address_mode
-        out.append(SubnetSettings(**kwargs))
+        out.append(SubnetConfig(**kwargs))
     return out
 
 
-def create_router_settings(neutron, router):
+def create_router_config(neutron, router):
     """
     Returns a RouterConfig object
     :param neutron: the neutron client
@@ -109,7 +107,7 @@ def create_router_settings(neutron, router):
         if network:
             ext_net_name = network.name
 
-    ports_tuple_list = list()
+    out_ports = list()
     if router.port_subnets:
         for port, subnets in router.port_subnets:
             network = neutron_utils.get_network_by_id(
@@ -123,19 +121,13 @@ def create_router_settings(neutron, router):
                             ip_addrs.append(ext_fixed_ips['ip_address'])
             else:
                 for ip in port.ips:
-                    ip_addrs.append(ip)
+                    ip_addrs.append(ip['ip_address'])
 
-            ip_list = list()
-            if len(ip_addrs) > 0:
-                for ip_addr in ip_addrs:
-                    if isinstance(ip_addr, dict):
-                        ip_list.append(ip_addr['ip_address'])
-                    else:
-                        ip_list.append(ip_addr)
+            ports = neutron_utils.get_ports(neutron, network, ip_addrs)
+            for out_port in ports:
+                out_ports.append(out_port)
 
-            ports_tuple_list.append((network, ip_list))
-
-    port_settings = __create_port_settings(neutron, ports_tuple_list)
+    port_settings = __create_port_configs(neutron, out_ports)
 
     filtered_settings = list()
     for port_setting in port_settings:
@@ -150,7 +142,7 @@ def create_router_settings(neutron, router):
 
 def create_volume_config(volume):
     """
-    Returns a VolumeSettings object
+    Returns a VolumeConfig object
     :param volume: a SNAPS-OO Volume object
     """
 
@@ -163,7 +155,7 @@ def create_volume_config(volume):
 
 def create_volume_type_config(volume_type):
     """
-    Returns a VolumeTypeSettings object
+    Returns a VolumeTypeConfig object
     :param volume_type: a SNAPS-OO VolumeType object
     """
 
@@ -175,12 +167,15 @@ def create_volume_type_config(volume_type):
         else:
             control = ControlLocation.back_end
 
-    encrypt_settings = VolumeTypeEncryptionConfig(
-        name=volume_type.encryption.__class__,
-        provider_class=volume_type.encryption.provider,
-        control_location=control,
-        cipher=volume_type.encryption.cipher,
-        key_size=volume_type.encryption.key_size)
+    if volume_type and volume_type.encryption:
+        encrypt_settings = VolumeTypeEncryptionConfig(
+            name=volume_type.encryption.__class__,
+            provider_class=volume_type.encryption.provider,
+            control_location=control,
+            cipher=volume_type.encryption.cipher,
+            key_size=volume_type.encryption.key_size)
+    else:
+        encrypt_settings = None
 
     qos_spec_name = None
     if volume_type.qos_spec:
@@ -193,8 +188,8 @@ def create_volume_type_config(volume_type):
 
 def create_flavor_config(flavor):
     """
-    Returns a VolumeSettings object
-    :param flavor: a SNAPS-OO Volume object
+    Returns a FlavorConfig object
+    :param flavor: a FlavorConfig object
     """
     return FlavorConfig(
         name=flavor.name, flavor_id=flavor.id, ram=flavor.ram,
@@ -203,7 +198,7 @@ def create_flavor_config(flavor):
         is_public=flavor.is_public)
 
 
-def create_keypair_settings(heat_cli, stack, keypair, pk_output_key):
+def create_keypair_config(heat_cli, stack, keypair, pk_output_key):
     """
     Instantiates a KeypairConfig object from a Keypair domain objects
     :param heat_cli: the heat client
@@ -229,12 +224,16 @@ def create_keypair_settings(heat_cli, stack, keypair, pk_output_key):
     return KeypairConfig(name=keypair.name)
 
 
-def create_vm_inst_settings(nova, neutron, server):
+def create_vm_inst_config(nova, keystone, neutron, server, project_name):
     """
-    Returns a NetworkSettings object
+    Returns a VmInstanceConfig object
+    note: if the server instance is not active, the PortSettings objects will
+    not be generated resulting in an invalid configuration
     :param nova: the nova client
+    :param keystone: the keystone client
     :param neutron: the neutron client
     :param server: a SNAPS-OO VmInst domain object
+    :param project_name: the associated project name
     :return:
     """
 
@@ -244,62 +243,54 @@ def create_vm_inst_settings(nova, neutron, server):
     kwargs['name'] = server.name
     kwargs['flavor'] = flavor_name
 
-    net_tuples = list()
-    for net_name, ips in server.networks.items():
-        network = neutron_utils.get_network(neutron, network_name=net_name)
-        if network:
-            net_tuples.append((network, ips))
-
-    kwargs['port_settings'] = __create_port_settings(
-        neutron, net_tuples)
+    kwargs['port_settings'] = __create_port_configs(neutron, server.ports)
     kwargs['security_group_names'] = server.sec_grp_names
-    kwargs['floating_ip_settings'] = __create_floatingip_settings(
-        neutron, kwargs['port_settings'])
+    kwargs['floating_ip_settings'] = __create_floatingip_config(
+        neutron, keystone, kwargs['port_settings'], project_name)
 
-    return VmInstanceSettings(**kwargs)
+    return VmInstanceConfig(**kwargs)
 
 
-def __create_port_settings(neutron, networks):
+def __create_port_configs(neutron, ports):
     """
-    Returns a list of port settings based on the networks parameter
+    Returns a list of PortConfig objects based on the networks parameter
     :param neutron: the neutron client
-    :param networks: a list of tuples where #1 is the SNAPS Network domain
-                     object and #2 is a list of IP addresses
+    :param ports: a list of SNAPS-OO Port domain objects
     :return:
     """
     out = list()
 
-    for network, ips in networks:
-        ports = neutron_utils.get_ports(neutron, network, ips)
-        for port in ports:
-            if port.device_owner != 'network:dhcp':
-                ip_addrs = list()
-                for ip_dict in port.ips:
-                    subnet = neutron_utils.get_subnet_by_id(
-                        neutron, ip_dict['subnet_id'])
-                    ip_addrs.append({'subnet_name': subnet.name,
-                                     'ip': ip_dict['ip_address']})
-
-                kwargs = dict()
-                if port.name:
-                    kwargs['name'] = port.name
-                kwargs['network_name'] = network.name
-                kwargs['mac_address'] = port.mac_address
-                kwargs['allowed_address_pairs'] = port.allowed_address_pairs
-                kwargs['admin_state_up'] = port.admin_state_up
-                kwargs['ip_addrs'] = ip_addrs
-                out.append(PortSettings(**kwargs))
+    for port in ports:
+        if port.device_owner != 'network:dhcp':
+            ip_addrs = list()
+            for ip_dict in port.ips:
+                subnet = neutron_utils.get_subnet_by_id(
+                    neutron, ip_dict['subnet_id'])
+                ip_addrs.append({'subnet_name': subnet.name,
+                                 'ip': ip_dict['ip_address']})
+
+            network = neutron_utils.get_network_by_id(neutron, port.network_id)
+            kwargs = dict()
+            if port.name:
+                kwargs['name'] = port.name
+            kwargs['network_name'] = network.name
+            kwargs['mac_address'] = port.mac_address
+            kwargs['allowed_address_pairs'] = port.allowed_address_pairs
+            kwargs['admin_state_up'] = port.admin_state_up
+            kwargs['ip_addrs'] = ip_addrs
+            out.append(PortConfig(**kwargs))
 
     return out
 
 
-def __create_floatingip_settings(neutron, port_settings):
+def __create_floatingip_config(neutron, keystone, port_settings, project_name):
     """
-    Returns a list of FloatingIPSettings objects as they pertain to an
+    Returns a list of FloatingIpConfig objects as they pertain to an
     existing deployed server instance
     :param neutron: the neutron client
-    :param port_settings: list of SNAPS-OO PortSettings objects
-    :return: a list of FloatingIPSettings objects or an empty list if no
+    :param keystone: the keystone client
+    :param port_settings: list of SNAPS-OO PortConfig objects
+    :return: a list of FloatingIpConfig objects or an empty list if no
              floating IPs have been created
     """
     base_fip_name = 'fip-'
@@ -308,10 +299,11 @@ def __create_floatingip_settings(neutron, port_settings):
 
     fip_ports = list()
     for port_setting in port_settings:
-        setting_port = neutron_utils.get_port(neutron, port_setting)
+        setting_port = neutron_utils.get_port(
+            neutron, keystone, port_setting, project_name=project_name)
         if setting_port:
             network = neutron_utils.get_network(
-                neutron, network_name=port_setting.network_name)
+                neutron, keystone, network_name=port_setting.network_name)
             network_ports = neutron_utils.get_ports(neutron, network)
             if network_ports:
                 for setting_port in network_ports:
@@ -319,7 +311,7 @@ def __create_floatingip_settings(neutron, port_settings):
                         fip_ports.append((port_setting.name, setting_port))
                         break
 
-    floating_ips = neutron_utils.get_floating_ips(neutron, fip_ports)
+    floating_ips = neutron_utils.get_port_floating_ips(neutron, fip_ports)
 
     for port_id, floating_ip in floating_ips:
         router = neutron_utils.get_router_by_id(neutron, floating_ip.router_id)
@@ -341,7 +333,7 @@ def __create_floatingip_settings(neutron, port_settings):
                     if subnet:
                         kwargs['subnet_name'] = subnet.name
 
-        out.append(FloatingIpSettings(**kwargs))
+        out.append(FloatingIpConfig(**kwargs))
 
         fip_ctr += 1