find($item->os_id); if (!$os) { throw new RuntimeException( "Không tìm thấy OS id={$item->os_id} trong OrderItem #{$item->id}. os_id không hợp lệ." ); } $chain = $this->activeProvider->resolveChain(); $host = $os->host ?? $chain['host']; $datacenter = $os->host?->datacenter ?? $chain['datacenter']; $network = $os->network ?? $chain['network']; $datastore = $os->datastore ?? $chain['datastore']; $folderId = $os->folder?->folder ?? $this->providerSettings->defaultFolder(); $resourcePoolId = $os->resourcePool?->resource_pool ?? $this->providerSettings->defaultResourcePool(); $this->logger->step('Infrastructure resolved from active chain', [ 'order_item_id' => $item->id, 'vcenter_id' => $chain['vcenter']->id, 'datacenter_id' => $chain['datacenter']->id, 'host_id' => $host->id, 'host_from_os' => $os->host !== null, 'datastore_id' => $datastore->id, 'datastore_from_os' => $os->datastore !== null, 'network_id' => $network->id, 'network_from_os' => $os->network !== null, 'folder_id' => $folderId, 'folder_from_os' => $os->folder !== null, 'resource_pool_id' => $resourcePoolId, 'resource_pool_from_os' => $os->resourcePool !== null, ]); $osGroupName = $os->osGroup?->name ?? ''; $isWindows = str_contains(strtolower($osGroupName), 'windows'); return new VmInfrastructureContext( os: $os, host: $host, datacenter: $datacenter, vcenter: $chain['vcenter'], template: $os->template_id, isWindows: $isWindows, vmUser: $isWindows ? 'administrator' : 'root', vmPort: $isWindows ? 3389 : 22, datastore: $datastore, network: $network, folderId: $folderId, resourcePoolId: $resourcePoolId, ); } }