VMware: add serial port device

Add virtual serial port which sends console output to a configurable
service URI. At the service URI there will be a virtual serial port
concentrator (VSPC) that will collect console logs and save them on
the filesystem. The VSPC will be deployed along with nova-compute and
will provide both console log and serial console to VMware instances.

Reference: http://goo.gl/oMD2xx

DocImpact

Change-Id: Ib1aafce6ddc04cb7774e6b4921c9dbfcc25acc91
Partially Implements: blueprint vmware-console-log
This commit is contained in:
Radoslav Gerganov 2015-01-22 11:54:52 +02:00
parent 4a96b90623
commit ace11d39f3
2 changed files with 89 additions and 27 deletions

View File

@ -502,6 +502,38 @@ class VMwareVMUtilTestCase(test.NoDBTestCase):
def test_detach_virtual_disk_destroy_spec(self):
self._test_detach_virtual_disk_spec(destroy_disk=True)
def _create_vm_config_spec(self):
fake_factory = fake.FakeFactory()
spec = fake_factory.create('ns0:VirtualMachineConfigSpec')
spec.name = self._instance.uuid
spec.instanceUuid = self._instance.uuid
spec.deviceChange = []
spec.numCPUs = 2
spec.version = None
spec.memoryMB = 2048
spec.guestId = 'otherGuest'
spec.extraConfig = []
extra_config = fake_factory.create("ns0:OptionValue")
extra_config.value = self._instance.uuid
extra_config.key = 'nvp.vm-uuid'
spec.extraConfig.append(extra_config)
spec.files = fake_factory.create('ns0:VirtualMachineFileInfo')
spec.files.vmPathName = '[fake-datastore]'
spec.managedBy = fake_factory.create('ns0:ManagedByInfo')
spec.managedBy.extensionKey = 'org.openstack.compute'
spec.managedBy.type = 'instance'
spec.tools = fake_factory.create('ns0:ToolsConfigInfo')
spec.tools.afterPowerOn = True
spec.tools.afterResume = True
spec.tools.beforeGuestReboot = True
spec.tools.beforeGuestShutdown = True
spec.tools.beforeGuestStandby = True
return spec
def test_get_vm_create_spec(self):
extra_specs = vm_util.ExtraSpecs()
fake_factory = fake.FakeFactory()
@ -510,35 +542,28 @@ class VMwareVMUtilTestCase(test.NoDBTestCase):
'fake-datastore', [],
extra_specs)
expected = fake_factory.create('ns0:VirtualMachineConfigSpec')
expected.name = self._instance.uuid
expected.instanceUuid = self._instance.uuid
expected.deviceChange = []
expected.numCPUs = 2
expected = self._create_vm_config_spec()
self.assertEqual(expected, result)
expected.version = None
expected.memoryMB = 2048
expected.guestId = constants.DEFAULT_OS_TYPE
expected.extraConfig = []
extra_config = fake_factory.create("ns0:OptionValue")
extra_config.value = self._instance.uuid
extra_config.key = 'nvp.vm-uuid'
expected.extraConfig.append(extra_config)
expected.files = fake_factory.create('ns0:VirtualMachineFileInfo')
expected.files.vmPathName = '[fake-datastore]'
expected.managedBy = fake_factory.create('ns0:ManagedByInfo')
expected.managedBy.extensionKey = 'org.openstack.compute'
expected.managedBy.type = 'instance'
expected.tools = fake_factory.create('ns0:ToolsConfigInfo')
expected.tools.afterPowerOn = True
expected.tools.afterResume = True
expected.tools.beforeGuestReboot = True
expected.tools.beforeGuestShutdown = True
expected.tools.beforeGuestStandby = True
def test_get_vm_create_spec_with_serial_port(self):
extra_specs = vm_util.ExtraSpecs()
fake_factory = fake.FakeFactory()
self.flags(serial_port_service_uri='foobar', group='vmware')
self.flags(serial_port_proxy_uri='telnet://example.com:31337',
group='vmware')
result = vm_util.get_vm_create_spec(fake_factory,
self._instance,
'fake-datastore', [],
extra_specs)
serial_port_spec = vm_util.create_serial_port_spec(fake_factory)
expected = self._create_vm_config_spec()
expected.deviceChange = [serial_port_spec]
self.assertEqual(expected, result)
def test_get_vm_create_spec_with_allocations(self):

View File

@ -45,7 +45,15 @@ vmware_utils_opts = [
cfg.IntOpt('console_delay_seconds',
help='Set this value if affected by an increased network '
'latency causing repeated characters when typing in '
'a remote console.')
'a remote console.'),
cfg.StrOpt('serial_port_service_uri',
help='Identifies the remote system that serial port traffic '
'will be sent to. If this is not set, no serial ports '
'will be added to the created VMs.'),
cfg.StrOpt('serial_port_proxy_uri',
help='Identifies a proxy service that provides network access '
'to the serial_port_service_uri. This option is ignored '
'if serial_port_service_uri is not specified.'),
]
CONF = cfg.CONF
@ -246,14 +254,16 @@ def get_vm_create_spec(client_factory, instance, data_store_name,
client_factory, extra_specs.memory_limits,
'ns0:ResourceAllocationInfo')
vif_spec_list = []
devices = []
for vif_info in vif_infos:
vif_spec = _create_vif_spec(client_factory, vif_info)
vif_spec_list.append(vif_spec)
devices.append(vif_spec)
device_config_spec = vif_spec_list
serial_port_spec = create_serial_port_spec(client_factory)
if serial_port_spec:
devices.append(serial_port_spec)
config_spec.deviceChange = device_config_spec
config_spec.deviceChange = devices
# add vm-uuid and iface-id.x values for Neutron
extra_config = []
@ -288,6 +298,33 @@ def get_vm_create_spec(client_factory, instance, data_store_name,
return config_spec
def create_serial_port_spec(client_factory):
"""Creates config spec for serial port."""
if not CONF.vmware.serial_port_service_uri:
return
backing = client_factory.create('ns0:VirtualSerialPortURIBackingInfo')
backing.direction = "server"
backing.serviceURI = CONF.vmware.serial_port_service_uri
backing.proxyURI = CONF.vmware.serial_port_proxy_uri
connectable_spec = client_factory.create('ns0:VirtualDeviceConnectInfo')
connectable_spec.startConnected = True
connectable_spec.allowGuestControl = True
connectable_spec.connected = True
serial_port = client_factory.create('ns0:VirtualSerialPort')
serial_port.connectable = connectable_spec
serial_port.backing = backing
# we are using unique negative integers as temporary keys
serial_port.key = -2
serial_port.yieldOnPoll = True
dev_spec = client_factory.create('ns0:VirtualDeviceConfigSpec')
dev_spec.operation = "add"
dev_spec.device = serial_port
return dev_spec
def get_vm_boot_spec(client_factory, device):
"""Returns updated boot settings for the instance.