def test_add_network_create_some_ports_fail(self, log_mock): object_utils.create_test_port( self.context, node_id=self.node.id, uuid=uuidutils.generate_uuid(), address='52:54:55:cf:2d:32', extra={'vif_port_id': uuidutils.generate_uuid()} ) self.client_mock.create_port.side_effect = [ {'port': self.neutron_port}, neutron_client_exc.ConnectionFailed] with task_manager.acquire(self.context, self.node.uuid) as task: neutron.add_ports_to_network(task, self.network_uuid) self.assertIn("Could not create neutron port for node's", log_mock.warning.call_args_list[0][0][0]) self.assertIn("Some errors were encountered when updating", log_mock.warning.call_args_list[1][0][0])
def test_add_network_fail_create_some_ports_empty(self, create_mock, rollback_mock, log_mock): port2 = object_utils.create_test_port( self.context, node_id=self.node.id, uuid=uuidutils.generate_uuid(), address='52:54:55:cf:2d:32', extra={'vif_port_id': uuidutils.generate_uuid()} ) create_mock.side_effect = [{'port': self.neutron_port}, {}] with task_manager.acquire(self.context, self.node.uuid) as task: neutron.add_ports_to_network(task, self.network_uuid) self.assertIn(str(port2.uuid), # Call #0, argument #1 log_mock.warning.call_args[0][1]['ports']) self.assertFalse(rollback_mock.called)
def _test_add_ports_to_flat_network(self, is_client_id): port = self.ports[0] if is_client_id: extra = port.extra extra['client-id'] = self._CLIENT_ID port.extra = extra port.save() expected_body = { 'port': { 'network_id': self.network_uuid, 'admin_state_up': True, 'binding:vnic_type': 'baremetal', 'device_owner': 'baremetal:none', 'device_id': self.node.uuid, 'mac_address': port.address, 'binding:profile': { 'local_link_information': [port.local_link_connection] } } } if is_client_id: expected_body['port']['extra_dhcp_opts'] = ( [{'opt_name': 'client-id', 'opt_value': self._CLIENT_ID}]) # Ensure we can create ports self.client_mock.create_port.return_value = { 'port': self.neutron_port} expected = {port.uuid: self.neutron_port['id']} with task_manager.acquire(self.context, self.node.uuid) as task: ports = neutron.add_ports_to_network(task, self.network_uuid, is_flat=True) self.assertEqual(expected, ports) self.client_mock.create_port.assert_called_once_with( expected_body)
def test_add_ports_to_vlan_network_instance_uuid(self, create_mock): self.node.instance_uuid = uuidutils.generate_uuid() self.node.save() port = self.ports[0] expected_body = { 'port': { 'network_id': self.network_uuid, 'admin_state_up': True, 'binding:vnic_type': 'baremetal', 'device_owner': 'baremetal:none', 'binding:host_id': self.node.uuid, 'device_id': self.node.instance_uuid, 'mac_address': port.address, 'binding:profile': { 'local_link_information': [port.local_link_connection] } } } # Ensure we can create ports create_mock.return_value = {'port': self.neutron_port} expected = {port.uuid: self.neutron_port['id']} with task_manager.acquire(self.context, self.node.uuid) as task: ports = neutron.add_ports_to_network(task, self.network_uuid) self.assertEqual(expected, ports) create_mock.assert_called_once_with(expected_body)
def test_add_ports_to_network_instance_uuid(self, vpi_mock): self.node.instance_uuid = uuidutils.generate_uuid() self.node.network_interface = 'neutron' self.node.save() port = self.ports[0] expected_body = { 'port': { 'network_id': self.network_uuid, 'admin_state_up': True, 'binding:vnic_type': 'baremetal', 'device_owner': 'baremetal:none', 'binding:host_id': self.node.uuid, 'device_id': self.node.instance_uuid, 'mac_address': port.address, 'binding:profile': { 'local_link_information': [port.local_link_connection] } } } vpi_mock.return_value = True # Ensure we can create ports self.client_mock.create_port.return_value = {'port': self.neutron_port} expected = {port.uuid: self.neutron_port['id']} with task_manager.acquire(self.context, self.node.uuid) as task: ports = neutron.add_ports_to_network(task, self.network_uuid) self.assertEqual(expected, ports) self.client_mock.create_port.assert_called_once_with(expected_body) self.assertTrue(vpi_mock.called)
def add_cleaning_network(self, task): """Add the cleaning network to a node. :param task: A TaskManager instance. :returns: a dictionary in the form {port.uuid: neutron_port['id']} :raises: NetworkError, InvalidParameterValue """ if not uuidutils.is_uuid_like(CONF.neutron.cleaning_network_uuid): raise exception.InvalidParameterValue( _( "You must provide a valid cleaning network UUID in " "[neutron]cleaning_network_uuid configuration option." ) ) # If we have left over ports from a previous cleaning, remove them neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid) LOG.info(_LI("Adding cleaning network to node %s"), task.node.uuid) vifs = neutron.add_ports_to_network(task, CONF.neutron.cleaning_network_uuid, is_flat=True) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info["cleaning_vif_port_id"] = vifs[port.uuid] port.internal_info = internal_info port.save() return vifs
def _add_service_network(self, task, network, process): # If we have left over ports from a previous process, remove them neutron.rollback_ports(task, network) LOG.info('Adding %s network to node %s', process, task.node.uuid) vifs = neutron.add_ports_to_network(task, network) field = '%s_vif_port_id' % process for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info[field] = vifs[port.uuid] port.internal_info = internal_info port.save() return vifs
def _test_add_ports_to_vlan_network(self, is_client_id, security_groups=None): # Ports will be created only if pxe_enabled is True self.node.network_interface = 'neutron' self.node.save() object_utils.create_test_port(self.context, node_id=self.node.id, uuid=uuidutils.generate_uuid(), address='52:54:00:cf:2d:22', pxe_enabled=False) port = self.ports[0] if is_client_id: extra = port.extra extra['client-id'] = self._CLIENT_ID port.extra = extra port.save() expected_body = { 'port': { 'network_id': self.network_uuid, 'admin_state_up': True, 'binding:vnic_type': 'baremetal', 'device_owner': 'baremetal:none', 'binding:host_id': self.node.uuid, 'device_id': self.node.uuid, 'mac_address': port.address, 'binding:profile': { 'local_link_information': [port.local_link_connection] } } } if security_groups: expected_body['port']['security_groups'] = security_groups if is_client_id: expected_body['port']['extra_dhcp_opts'] = ([{ 'opt_name': 'client-id', 'opt_value': self._CLIENT_ID }]) # Ensure we can create ports self.client_mock.create_port.return_value = {'port': self.neutron_port} expected = {port.uuid: self.neutron_port['id']} with task_manager.acquire(self.context, self.node.uuid) as task: ports = neutron.add_ports_to_network( task, self.network_uuid, security_groups=security_groups) self.assertEqual(expected, ports) self.client_mock.create_port.assert_called_once_with(expected_body)
def add_provisioning_network(self, task): """Add the provisioning network to a node. :param task: A TaskManager instance. :raises: NetworkError """ LOG.info(_LI('Adding provisioning network to node %s'), task.node.uuid) vifs = neutron.add_ports_to_network( task, CONF.neutron.provisioning_network_uuid) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['provisioning_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save()
def _test_add_ports_to_network(self, is_client_id, security_groups=None): # Ports will be created only if pxe_enabled is True self.node.network_interface = 'neutron' self.node.save() object_utils.create_test_port( self.context, node_id=self.node.id, uuid=uuidutils.generate_uuid(), address='52:54:00:cf:2d:22', pxe_enabled=False ) port = self.ports[0] if is_client_id: extra = port.extra extra['client-id'] = self._CLIENT_ID port.extra = extra port.save() expected_body = { 'port': { 'network_id': self.network_uuid, 'admin_state_up': True, 'binding:vnic_type': 'baremetal', 'device_owner': 'baremetal:none', 'binding:host_id': self.node.uuid, 'device_id': self.node.uuid, 'mac_address': port.address, 'binding:profile': { 'local_link_information': [port.local_link_connection] } } } if security_groups: expected_body['port']['security_groups'] = security_groups if is_client_id: expected_body['port']['extra_dhcp_opts'] = ( [{'opt_name': 'client-id', 'opt_value': self._CLIENT_ID}]) # Ensure we can create ports self.client_mock.create_port.return_value = { 'port': self.neutron_port} expected = {port.uuid: self.neutron_port['id']} with task_manager.acquire(self.context, self.node.uuid) as task: ports = neutron.add_ports_to_network( task, self.network_uuid, security_groups=security_groups) self.assertEqual(expected, ports) self.client_mock.create_port.assert_called_once_with( expected_body)
def add_cleaning_network(self, task): """Add the cleaning network to a node. :param task: A TaskManager instance. :returns: a dictionary in the form {port.uuid: neutron_port['id']} :raises: NetworkError, InvalidParameterValue """ # If we have left over ports from a previous cleaning, remove them neutron.rollback_ports(task, self.get_cleaning_network_uuid()) LOG.info(_LI('Adding cleaning network to node %s'), task.node.uuid) vifs = neutron.add_ports_to_network( task, self.get_cleaning_network_uuid()) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['cleaning_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save() return vifs
def add_cleaning_network(self, task): """Create neutron ports for each port on task.node to boot the ramdisk. :param task: a TaskManager instance. :raises: NetworkError :returns: a dictionary in the form {port.uuid: neutron_port['id']} """ # If we have left over ports from a previous cleaning, remove them neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid) LOG.info(_LI('Adding cleaning network to node %s'), task.node.uuid) vifs = neutron.add_ports_to_network(task, CONF.neutron.cleaning_network_uuid) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['cleaning_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save() return vifs
def add_cleaning_network(self, task): """Add the cleaning network to a node. :param task: A TaskManager instance. :returns: a dictionary in the form {port.uuid: neutron_port['id']} :raises: NetworkError, InvalidParameterValue """ # If we have left over ports from a previous cleaning, remove them neutron.rollback_ports(task, self.get_cleaning_network_uuid()) LOG.info('Adding cleaning network to node %s', task.node.uuid) vifs = neutron.add_ports_to_network( task, self.get_cleaning_network_uuid()) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['cleaning_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save() return vifs
def add_provisioning_network(self, task): """Add the provisioning network to a node. :param task: A TaskManager instance. :raises: NetworkError """ # If we have left over ports from a previous provision attempt, remove # them neutron.rollback_ports(task, self.get_provisioning_network_uuid()) LOG.info(_LI('Adding provisioning network to node %s'), task.node.uuid) vifs = neutron.add_ports_to_network( task, self.get_provisioning_network_uuid(), security_groups=CONF.neutron.provisioning_network_security_groups) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['provisioning_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save()
def add_provisioning_network(self, task): """Add the provisioning network to a node. :param task: A TaskManager instance. :raises: NetworkError """ # If we have left over ports from a previous provision attempt, remove # them neutron.rollback_ports(task, self.get_provisioning_network_uuid()) LOG.info('Adding provisioning network to node %s', task.node.uuid) vifs = neutron.add_ports_to_network( task, self.get_provisioning_network_uuid(), security_groups=CONF.neutron.provisioning_network_security_groups) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['provisioning_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save()
def add_rescuing_network(self, task): """Create neutron ports for each port to boot the rescue ramdisk. :param task: a TaskManager instance. :returns: a dictionary in the form {port.uuid: neutron_port['id']} """ # If we have left over ports from a previous rescue, remove them neutron.rollback_ports(task, self.get_rescuing_network_uuid(task)) LOG.info('Adding rescuing network to node %s', task.node.uuid) security_groups = CONF.neutron.rescuing_network_security_groups vifs = neutron.add_ports_to_network( task, self.get_rescuing_network_uuid(task), security_groups=security_groups) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['rescuing_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save() return vifs
def add_cleaning_network(self, task): """Add the cleaning network to a node. :param task: A TaskManager instance. :returns: a dictionary in the form {port.uuid: neutron_port['id']} :raises: NetworkError, InvalidParameterValue """ if not uuidutils.is_uuid_like(CONF.neutron.cleaning_network_uuid): raise exception.InvalidParameterValue(_( 'You must provide a valid cleaning network UUID in ' '[neutron]cleaning_network_uuid configuration option.')) # If we have left over ports from a previous cleaning, remove them neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid) LOG.info(_LI('Adding cleaning network to node %s'), task.node.uuid) vifs = neutron.add_ports_to_network( task, CONF.neutron.cleaning_network_uuid, is_flat=True) for port in task.ports: if port.uuid in vifs: internal_info = port.internal_info internal_info['cleaning_vif_port_id'] = vifs[port.uuid] port.internal_info = internal_info port.save() return vifs