RosiKyu commented on PR #12499:
URL: https://github.com/apache/cloudstack/pull/12499#issuecomment-3789970512
### TC1: Deploy VNF Appliance via Deploy-as-is Template (Main Bug Fix)
**Objective:** Verify the original bug is fixed - deploying VNF appliance
using deploy-as-is template no longer fails with "VNF nics list is empty"
**Expected Result:** VM deploys successfully without "VNF nics list is
empty" error
**Actual Result:** PASSED - VM ID: 4d319d1f-8de8-4b05-84ba-8b580d731ca5,
State: Running, 10 NICs created
**Test Evidence:**
<details><summary><code>(localcloud) 🐱 > deployVnfAppliance
templateid=88ac23d3-a3dd-4bcc-ab69-716a2b6c86dd
serviceofferingid=63b6851c-631c-4b30-81f0-e959e2eb6052
zoneid=e9594751-da68-4f49-924f-222ba4c15876 nicnetworklist[0].nic=0
nicnetworklist[0].network=4935f651-04b5-49f7-b25a-55c6151ad5cb
name=vnf-tc1-full properties[0].key=HARole
properties[0].value=Standalone</code></summary>
```json
{
"virtualmachine": {
"account": "admin",
"affinitygroup": [],
"arch": "x86_64",
"cpunumber": 1,
"cpuspeed": 500,
"created": "2026-01-23T08:22:14+0000",
"deleteprotection": false,
"details": {
"cpuOvercommitRatio": "2.0",
"dataDiskController": "osdefault",
"rootDiskController": "lsilogic"
},
"displayname": "vnf-tc1-full",
"displayvm": true,
"domain": "ROOT",
"domainid": "caacffaf-f7cc-11f0-bc70-1e00b6000327",
"domainpath": "/",
"guestosid": "cac8e8aa-f7cc-11f0-bc70-1e00b6000327",
"haenable": false,
"hasannotations": false,
"hostcontrolstate": "Enabled",
"hostid": "cfcf5c46-b2dc-4c40-b487-eb8a111a83b3",
"hostname": "10.0.35.172",
"hypervisor": "VMware",
"id": "4d319d1f-8de8-4b05-84ba-8b580d731ca5",
"instancename": "i-2-7-VM",
"ipaddress": "10.1.1.52",
"isdynamicallyscalable": false,
"jobid": "4db54012-7faa-4eb0-833f-8eac824d7b27",
"jobstatus": 0,
"lastupdated": "2026-01-23T08:24:11+0000",
"memory": 512,
"name": "vnf-tc1-full",
"nic": [
{
"broadcasturi": "vlan://1161",
"deviceid": "2",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "a46379db-2c9b-4656-bfb5-bfd99adb366a",
"ipaddress": "10.1.1.114",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:18",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "8",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "f7e2761b-73f0-4f67-99ba-fc663695d863",
"ipaddress": "10.1.1.185",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:1e",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "4",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "9e609129-55c8-4ed5-bb84-35a27fc39deb",
"ipaddress": "10.1.1.197",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:1a",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "9",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "ccc16eb3-9e07-47f5-9dc2-faed9afd7eb6",
"ipaddress": "10.1.1.137",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:1f",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "7",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "0afd124b-8c07-4db5-bdc0-b2858043ceea",
"ipaddress": "10.1.1.38",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:1d",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "3",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "9176d2c0-a91e-4c3e-8ca1-207a3b792475",
"ipaddress": "10.1.1.240",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:19",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "6",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "fbf965f5-ec8e-4806-a514-7f3b520a2b66",
"ipaddress": "10.1.1.150",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:1c",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "0",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "ca0d01fe-4696-472b-8923-2961ee65edc3",
"ipaddress": "10.1.1.52",
"isdefault": true,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:16",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "1",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "9017b11f-b315-4812-82bb-b8b1a3d3a682",
"ipaddress": "10.1.1.202",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:17",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "5",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "e9f8916a-ba2d-4d95-a667-dce690ace4aa",
"ipaddress": "10.1.1.81",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:1b",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
}
],
"osdisplayname": "Other 2.6x Linux (64-bit)",
"ostypeid": "cac8e8aa-f7cc-11f0-bc70-1e00b6000327",
"passwordenabled": false,
"pooltype": "PreSetup",
"receivedbytes": 0,
"rootdeviceid": 0,
"rootdevicetype": "ROOT",
"securitygroup": [],
"sentbytes": 0,
"serviceofferingid": "63b6851c-631c-4b30-81f0-e959e2eb6052",
"serviceofferingname": "Small Instance",
"state": "Running",
"tags": [],
"templatedisplaytext": "ASAv VNF deploy-as-is test",
"templateformat": "OVA",
"templateid": "88ac23d3-a3dd-4bcc-ab69-716a2b6c86dd",
"templatename": "ASAv-VNF-test-vnf",
"templatetype": "VNF",
"userid": "1095c455-f7cd-11f0-bc70-1e00b6000327",
"username": "admin",
"zoneid": "e9594751-da68-4f49-924f-222ba4c15876",
"zonename": "ref-trl-10698-v-Mol8-rositsa-kyuchukova"
}
}
```
</details>
### TC2 (UI): Deploy VNF Appliance via UI with Deploy-as-is Template
**Objective:** Verify the original bug is fixed via UI - Deploy VNF
Appliance wizard works with deploy-as-is templates
**Expected Result:** VM deploys successfully via UI without "VNF nics list
is empty" error
**Actual Result:** PASSED - VM created with 10 NICs properly mapped to
networks
**Test Evidence:**
- Deploying via UI
[Screencast from 2026-01-23
10-43-23.webm](https://github.com/user-attachments/assets/fea75ed1-b0c5-49d4-85d3-630f79039262)
<img width="3111" height="1889" alt="Screenshot from 2026-01-23 10-44-02"
src="https://github.com/user-attachments/assets/5007b40c-74e0-44eb-874f-775c4077fe76"
/>
- Launching VNF appliance
<img width="2607" height="885" alt="image"
src="https://github.com/user-attachments/assets/0ec64af3-82eb-4190-8e71-7a2b4daf071d"
/>
**NOTE** Identified a separate UI bug, while executing this test case:
https://github.com/apache/cloudstack/issues/12510
### TC3: Register Deploy-as-is VNF Template WITHOUT VNF Nics
**Objective:** Verify registering a deploy-as-is VNF template without
specifying VNF nics succeeds
**Expected Result:** Template registers successfully; VNF nics read from OVA
after download
**Actual Result:** PASSED - Template ID:
3dc7c5e0-46ad-4531-a8e4-149461be237f, Status: Ready, 10 NICs auto-populated
from OVA
**Test Evidence:**
```
(localcloud) 🐱 > listVnfTemplates id=3dc7c5e0-46ad-4531-a8e4-149461be237f
templatefilter=all filter=id,name,status,isready,templatetype,deployasis
{
"count": 1,
"template": [
{
"deployasis": true,
"id": "3dc7c5e0-46ad-4531-a8e4-149461be237f",
"isready": true,
"name": "vnf-tc3-no-nics",
"status": "Download Complete",
"templatetype": "VNF"
}
]
}
(localcloud) 🐱 >
```
<img width="2602" height="1527" alt="image"
src="https://github.com/user-attachments/assets/3cc9e6d5-6724-4bb7-a8f9-d79d9e9ed270"
/>
### TC4: Register Deploy-as-is VNF Template WITH VNF Nics (Negative Test)
**Objective:** Verify proper error when trying to register deploy-as-is
template with VNF nics specified
**Expected Result:** Error rejecting VNF nics parameter for deploy-as-is
templates
**Actual Result:** PASSED - Proper validation error returned
**Test Evidence:**
```
(localcloud) 🐱 > registerVnfTemplate name=vnf-tc4-with-nics displaytext="TC4
VNF with nics - should fail" format=OVA hypervisor=VMware
ostypeid=cac8e8aa-f7cc-11f0-bc70-1e00b6000327
zoneid=e9594751-da68-4f49-924f-222ba4c15876
url=http://10.0.3.122/ova/asav951.ova deployasis=true vnfnics[0].deviceid=0
vnfnics[0].name=eth0 vnfnics[0].required=true
🙈 Error: (HTTP 431, error code 4350) VNF Template cannot be registered with
VNF nics as Template settings are read from OVA.
```
### TC5: Update Deploy-as-is VNF Template with VNF Nics
**Objective:** Verify updating deploy-as-is template to add VNF nics is
allowed after template is ready
**Expected Result:** Update succeeds - user can configure VNF nics after OVA
is downloaded
**Actual Result:** PASSED - VNF nics were added successfully
**Test Evidence:**
```
(localcloud) 🐱 > updateVnfTemplate id=3dc7c5e0-46ad-4531-a8e4-149461be237f
vnfnics[0].deviceid=0 vnfnics[0].name=eth0 vnfnics[0].required=true
{
"template": {
"account": "admin",
"bits": 0,
"bootable": true,
"created": "2026-01-23T09:21:09+0000",
"crossZones": false,
"displaytext": "TC3 VNF without nics",
"domain": "ROOT",
"domainid": "caacffaf-f7cc-11f0-bc70-1e00b6000327",
"domainpath": "/",
"format": "OVA",
"hypervisor": "VMware",
"id": "3dc7c5e0-46ad-4531-a8e4-149461be237f",
"isdynamicallyscalable": false,
"isfeatured": false,
"ispublic": false,
"isready": false,
"name": "vnf-tc3-no-nics",
"ostypeid": "cac8e8aa-f7cc-11f0-bc70-1e00b6000327",
"ostypename": "Other 2.6x Linux (64-bit)",
"tags": [],
"templatetype": "VNF",
"vnfnics": [
{
"deviceid": 0,
"management": true,
"name": "eth0",
"required": true
}
]
}
}
```
### TC6: UI - Network Selection Behavior for Deploy-as-is Template
**Objective:** Verify UI properly handles network selection for deploy-as-is
templates
**Expected Result:** UI displays all OVA-defined NICs with functional
network selection; no option to modify NIC definitions
**Actual Result:** PASSED - All 10 NICs from OVA displayed with correct
names, "Change" button functional, no add/remove options
**Evidence**
<img width="1568" height="595" alt="image"
src="https://github.com/user-attachments/assets/4e213abf-ba2e-405a-b22e-638b4a43118f"
/>
<img width="1568" height="595" alt="image"
src="https://github.com/user-attachments/assets/b72d3cf4-a8d3-4556-93c4-8fd7ccb9f755"
/>
<img width="1568" height="595" alt="image"
src="https://github.com/user-attachments/assets/dfceb0c4-b91d-4219-a73c-240a72d01681"
/>
<img width="1568" height="779" alt="image"
src="https://github.com/user-attachments/assets/a2e3844c-2b70-4770-bc56-bdf69c2b01af"
/>
### TC7: Deploy VNF with All Required NICs Mapped
**Objective:** Verify deployment succeeds when all required NICs have
networks assigned
**Expected Result:** Deployment succeeds; VM has correct network attachments
matching the specified mapping
**Actual Result:** PARTIAL PASS / POTENTIAL BUG - VM deployed successfully
with 10 NICs in Running state, but network mapping does not match the specified
nicnetworklist parameter. Only 3/10 NICs attached to correct networks.
**Test Evidence:**
<details><summary><code>(localcloud) 🐱 > deployVnfAppliance
templateid=88ac23d3-a3dd-4bcc-ab69-716a2b6c86dd
serviceofferingid=63b6851c-631c-4b30-81f0-e959e2eb6052
zoneid=e9594751-da68-4f49-924f-222ba4c15876 name=vnf-tc7-correct-ids
properties[0].key=HARole properties[0].value=Standalone nicnetworklist[0].nic=6
nicnetworklist[0].network=4935f651-04b5-49f7-b25a-55c6151ad5cb
nicnetworklist[1].nic=9
nicnetworklist[1].network=fee6a3ae-b99f-4ebe-b84b-c661fc4d5888
nicnetworklist[2].nic=10
nicnetworklist[2].network=a170136d-9699-4586-8eaf-f83f19255a54
nicnetworklist[3].nic=11
nicnetworklist[3].network=9427bebb-848d-4b54-8e22-06bfdcc83dcd
nicnetworklist[4].nic=12
nicnetworklist[4].network=4935f651-04b5-49f7-b25a-55c6151ad5cb
nicnetworklist[5].nic=13
nicnetworklist[5].network=fee6a3ae-b99f-4ebe-b84b-c661fc4d5888
nicnetworklist[6].nic=14
nicnetworklist[6].network=a170136d-9699-4586-8eaf-f83f19255a54
nicnetworklist[7].nic=15
nicnetworklist[7].network=9427bebb-848d-4b54-8e22-06bfdcc83dcd ni
cnetworklist[8].nic=16
nicnetworklist[8].network=4935f651-04b5-49f7-b25a-55c6151ad5cb
nicnetworklist[9].nic=17
nicnetworklist[9].network=fee6a3ae-b99f-4ebe-b84b-c661fc4d5888 </code></summary>
```json
{
"virtualmachine": {
"account": "admin",
"affinitygroup": [],
"arch": "x86_64",
"cpunumber": 1,
"cpuspeed": 500,
"created": "2026-01-23T10:26:18+0000",
"deleteprotection": false,
"details": {
"cpuOvercommitRatio": "2.0",
"dataDiskController": "osdefault",
"rootDiskController": "lsilogic"
},
"displayname": "vnf-tc7-correct-ids",
"displayvm": true,
"domain": "ROOT",
"domainid": "caacffaf-f7cc-11f0-bc70-1e00b6000327",
"domainpath": "/",
"guestosid": "cac8e8aa-f7cc-11f0-bc70-1e00b6000327",
"haenable": false,
"hasannotations": false,
"hostcontrolstate": "Enabled",
"hostid": "7a9c02a7-19f8-46a1-9ef3-a4ff7fe90ba6",
"hostname": "10.0.35.255",
"hypervisor": "VMware",
"id": "3093cba4-9238-44f7-a5d4-198e4df0cad6",
"instancename": "i-2-15-VM",
"ipaddress": "10.1.1.65",
"isdynamicallyscalable": false,
"jobid": "1cb3ca2e-9052-4e73-bf79-f0a569261530",
"jobstatus": 0,
"lastupdated": "2026-01-23T10:29:53+0000",
"memory": 512,
"name": "vnf-tc7-correct-ids",
"nic": [
{
"broadcasturi": "vlan://1175",
"deviceid": "5",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "54fd720d-aed4-47fa-aef3-2ec59541f9a9",
"ipaddress": "10.1.1.27",
"isdefault": false,
"isolationuri": "vlan://1175",
"macaddress": "02:01:00:ce:00:07",
"netmask": "255.255.255.0",
"networkid": "fee6a3ae-b99f-4ebe-b84b-c661fc4d5888",
"networkname": "vnf-net2",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1175",
"deviceid": "9",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "c3473e84-b1d3-4de3-93c2-5144dc48e683",
"ipaddress": "10.1.1.32",
"isdefault": false,
"isolationuri": "vlan://1175",
"macaddress": "02:01:00:ce:00:08",
"netmask": "255.255.255.0",
"networkid": "fee6a3ae-b99f-4ebe-b84b-c661fc4d5888",
"networkname": "vnf-net2",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1179",
"deviceid": "8",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "9181e5aa-7b27-47fc-9095-4eca7a4138c7",
"ipaddress": "10.1.1.201",
"isdefault": false,
"isolationuri": "vlan://1179",
"macaddress": "02:01:00:cd:00:07",
"netmask": "255.255.255.0",
"networkid": "4935f651-04b5-49f7-b25a-55c6151ad5cb",
"networkname": "vnf-net1",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1164",
"deviceid": "2",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "e6be4593-cc05-422d-a768-2702bdf64806",
"ipaddress": "10.1.1.98",
"isdefault": false,
"isolationuri": "vlan://1164",
"macaddress": "02:01:00:cf:00:06",
"netmask": "255.255.255.0",
"networkid": "a170136d-9699-4586-8eaf-f83f19255a54",
"networkname": "vnf-net3",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1179",
"deviceid": "0",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "eb098621-fbe9-4914-a74e-656fbcc3eff9",
"ipaddress": "10.1.1.65",
"isdefault": true,
"isolationuri": "vlan://1179",
"macaddress": "02:01:00:cd:00:05",
"netmask": "255.255.255.0",
"networkid": "4935f651-04b5-49f7-b25a-55c6151ad5cb",
"networkname": "vnf-net1",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1164",
"deviceid": "6",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "3ae4f2e9-9b87-4b81-b988-1dfff6b62765",
"ipaddress": "10.1.1.72",
"isdefault": false,
"isolationuri": "vlan://1164",
"macaddress": "02:01:00:cf:00:07",
"netmask": "255.255.255.0",
"networkid": "a170136d-9699-4586-8eaf-f83f19255a54",
"networkname": "vnf-net3",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1179",
"deviceid": "4",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "3a78494a-d496-4cd7-a899-610d85a917d5",
"ipaddress": "10.1.1.27",
"isdefault": false,
"isolationuri": "vlan://1179",
"macaddress": "02:01:00:cd:00:06",
"netmask": "255.255.255.0",
"networkid": "4935f651-04b5-49f7-b25a-55c6151ad5cb",
"networkname": "vnf-net1",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "7",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "3e6a983f-5e01-4859-93ac-0c57a6d8e7dc",
"ipaddress": "10.1.1.160",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:3e",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1175",
"deviceid": "1",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "34a285a4-f3f4-4314-80aa-376a194b8abf",
"ipaddress": "10.1.1.162",
"isdefault": false,
"isolationuri": "vlan://1175",
"macaddress": "02:01:00:ce:00:06",
"netmask": "255.255.255.0",
"networkid": "fee6a3ae-b99f-4ebe-b84b-c661fc4d5888",
"networkname": "vnf-net2",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "3",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "9236a428-b995-4866-918a-0257ada77b09",
"ipaddress": "10.1.1.229",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:3d",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
}
],
"osdisplayname": "Other 2.6x Linux (64-bit)",
"ostypeid": "cac8e8aa-f7cc-11f0-bc70-1e00b6000327",
"passwordenabled": false,
"pooltype": "PreSetup",
"receivedbytes": 0,
"rootdeviceid": 0,
"rootdevicetype": "ROOT",
"securitygroup": [],
"sentbytes": 0,
"serviceofferingid": "63b6851c-631c-4b30-81f0-e959e2eb6052",
"serviceofferingname": "Small Instance",
"state": "Running",
"tags": [],
"templatedisplaytext": "ASAv VNF deploy-as-is test",
"templateformat": "OVA",
"templateid": "88ac23d3-a3dd-4bcc-ab69-716a2b6c86dd",
"templatename": "ASAv-VNF-test-vnf",
"templatetype": "VNF",
"userid": "1095c455-f7cd-11f0-bc70-1e00b6000327",
"username": "admin",
"zoneid": "e9594751-da68-4f49-924f-222ba4c15876",
"zonename": "ref-trl-10698-v-Mol8-rositsa-kyuchukova"
}
}
```
</details>
- VNF Appliance deployed, in a **Running** state
<details><summary><code>(localcloud) 🐱 > listVirtualMachines
name=vnf-tc7-correct-ids filter=id,name,state,nic</code></summary>
```json
{
"count": 1,
"virtualmachine": [
{
"id": "3093cba4-9238-44f7-a5d4-198e4df0cad6",
"name": "vnf-tc7-correct-ids",
"nic": [
{
"broadcasturi": "vlan://1179",
"deviceid": "0",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "eb098621-fbe9-4914-a74e-656fbcc3eff9",
"ipaddress": "10.1.1.65",
"isdefault": true,
"isolationuri": "vlan://1179",
"macaddress": "02:01:00:cd:00:05",
"netmask": "255.255.255.0",
"networkid": "4935f651-04b5-49f7-b25a-55c6151ad5cb",
"networkname": "vnf-net1",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1175",
"deviceid": "1",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "34a285a4-f3f4-4314-80aa-376a194b8abf",
"ipaddress": "10.1.1.162",
"isdefault": false,
"isolationuri": "vlan://1175",
"macaddress": "02:01:00:ce:00:06",
"netmask": "255.255.255.0",
"networkid": "fee6a3ae-b99f-4ebe-b84b-c661fc4d5888",
"networkname": "vnf-net2",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1164",
"deviceid": "2",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "e6be4593-cc05-422d-a768-2702bdf64806",
"ipaddress": "10.1.1.98",
"isdefault": false,
"isolationuri": "vlan://1164",
"macaddress": "02:01:00:cf:00:06",
"netmask": "255.255.255.0",
"networkid": "a170136d-9699-4586-8eaf-f83f19255a54",
"networkname": "vnf-net3",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "3",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "9236a428-b995-4866-918a-0257ada77b09",
"ipaddress": "10.1.1.229",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:3d",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1179",
"deviceid": "4",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "3a78494a-d496-4cd7-a899-610d85a917d5",
"ipaddress": "10.1.1.27",
"isdefault": false,
"isolationuri": "vlan://1179",
"macaddress": "02:01:00:cd:00:06",
"netmask": "255.255.255.0",
"networkid": "4935f651-04b5-49f7-b25a-55c6151ad5cb",
"networkname": "vnf-net1",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1175",
"deviceid": "5",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "54fd720d-aed4-47fa-aef3-2ec59541f9a9",
"ipaddress": "10.1.1.27",
"isdefault": false,
"isolationuri": "vlan://1175",
"macaddress": "02:01:00:ce:00:07",
"netmask": "255.255.255.0",
"networkid": "fee6a3ae-b99f-4ebe-b84b-c661fc4d5888",
"networkname": "vnf-net2",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1164",
"deviceid": "6",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "3ae4f2e9-9b87-4b81-b988-1dfff6b62765",
"ipaddress": "10.1.1.72",
"isdefault": false,
"isolationuri": "vlan://1164",
"macaddress": "02:01:00:cf:00:07",
"netmask": "255.255.255.0",
"networkid": "a170136d-9699-4586-8eaf-f83f19255a54",
"networkname": "vnf-net3",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1161",
"deviceid": "7",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "3e6a983f-5e01-4859-93ac-0c57a6d8e7dc",
"ipaddress": "10.1.1.160",
"isdefault": false,
"isolationuri": "vlan://1161",
"macaddress": "02:01:00:cc:00:3e",
"netmask": "255.255.255.0",
"networkid": "9427bebb-848d-4b54-8e22-06bfdcc83dcd",
"networkname": "test",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1179",
"deviceid": "8",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "9181e5aa-7b27-47fc-9095-4eca7a4138c7",
"ipaddress": "10.1.1.201",
"isdefault": false,
"isolationuri": "vlan://1179",
"macaddress": "02:01:00:cd:00:07",
"netmask": "255.255.255.0",
"networkid": "4935f651-04b5-49f7-b25a-55c6151ad5cb",
"networkname": "vnf-net1",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1175",
"deviceid": "9",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "c3473e84-b1d3-4de3-93c2-5144dc48e683",
"ipaddress": "10.1.1.32",
"isdefault": false,
"isolationuri": "vlan://1175",
"macaddress": "02:01:00:ce:00:08",
"netmask": "255.255.255.0",
"networkid": "fee6a3ae-b99f-4ebe-b84b-c661fc4d5888",
"networkname": "vnf-net2",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
}
],
"state": "Running"
}
]
}
```
</details>
**Network Mapping Verification:**
| Device ID | Actual Network | Expected Network | Status |
|--:|----------------|------------------|--------|
| 0 | vnf-net1 | vnf-net1 | PASS |
| 1 | vnf-net2 | vnf-net2 | PASS |
| 2 | vnf-net3 | vnf-net3 | PASS |
| 3 | test | test | PASS |
| 4 | vnf-net1 | vnf-net1 | PASS |
| 5 | vnf-net2 | vnf-net2 | PASS |
| 6 | vnf-net3 | vnf-net3 | PASS |
| 7 | test | test | PASS |
| 8 | vnf-net1 | vnf-net1 | PASS |
| 9 | vnf-net2 | vnf-net2 | PASS |
**Key Finding:** The `nicnetworklist[X].nic` parameter must use the OVA's
InstanceID values (6, 9, 10, 11, 12, 13, 14, 15, 16, 17), NOT sequential device
IDs (0-9). The UI handles this correctly by reading the InstanceIDs from the
template's deployasisdetails. When using the API directly, users must reference
the correct InstanceID values from the OVA template.
### TC9: Verify VNF Appliance Functionality Post-Deploy
**Objective:** Verify deployed VNF appliance is functional
**Expected Result:** VM runs with correct network configuration matching the
deployment specification
**Actual Result:** PASSED - All 10 NICs correctly mapped to expected
networks, VM status Running
**Test Evidence:**
- CloudStack UI - VNF Appliances - vnf-tc7-correct-ids - NICs tab showing
all 10 NICs with correct network mappings
<img width="1374" height="868" alt="image"
src="https://github.com/user-attachments/assets/29be4785-fac2-4ae1-9be9-895b95745b3a"
/>
<img width="3106" height="1419" alt="image"
src="https://github.com/user-attachments/assets/b58864a3-2e5c-49be-9c89-5a96c246b32a"
/>
### TC10: Deploy Multiple VNF Appliances from Same Template
**Objective:** Verify template can be used for multiple deployments
**Expected Result:** Multiple VMs can be deployed from the same template
**Actual Result: **PASSED - 7 VMs deployed from the same template, 4 Running
successfully
**Test Evidence:**
```
(localcloud) 🐱 > listVirtualMachines
templateid=88ac23d3-a3dd-4bcc-ab69-716a2b6c86dd filter=id,name,state
{
"count": 7,
"virtualmachine": [
{
"id": "4d319d1f-8de8-4b05-84ba-8b580d731ca5",
"name": "vnf-tc1-full-api",
"state": "Running"
},
{
"id": "6d0f73d2-8e3c-474f-9223-2886c15e2cb2",
"name": "VM-6d0f73d2-8e3c-474f-9223-2886c15e2cb2",
"state": "Error"
},
{
"id": "46f2bd49-ea2f-4e78-b8df-32510022b955",
"name": "vnf-ui-test2",
"state": "Error"
},
{
"id": "a1593da3-fd58-494a-9e4e-977f8f24047c",
"name": "vnf-ui-test3",
"state": "Error"
},
{
"id": "92b72388-5fcc-4469-9a28-e24b794b2cd2",
"name": "vnf-tc7-mixed-networks",
"state": "Running"
},
{
"id": "3093cba4-9238-44f7-a5d4-198e4df0cad6",
"name": "vnf-tc7-correct-ids",
"state": "Running"
},
{
"id": "a7268a53-e778-43f3-a3a4-b6b3038f0b22",
"name": "vnf-tc8-missing-nics",
"state": "Running"
}
]
}
```
| Deployment Method | Count | Status |
|--------------------------------|-------|--------|
| API (with properties) | 4 | Running |
| UI (without properties – bug #12510) | 3 | Error |
**Note:** The 3 VMs in `Error` state are due to UI bug **#12510** (vApp
properties are not sent), not an issue with multiple deployments.
### TC11: Regular (non-deploy-as-is) VNF Template Still Works
**Objective:** Regression test - ensure regular VNF templates still function
after PR changes
**Expected Result:** Existing VNF template functionality unchanged -
deployment using networkids parameter works
**Actual Result:** PASSED - VM deployed successfully with 2 NICs correctly
mapped using networkids parameter
**Test Evidence:**
- regular VNF template
```
(localcloud) 🐱 > listVnfTemplates id=117856e5-6d81-40d9-bd77-7b3f1a706435
templatefilter=all filter=id,name,isready,status
{
"count": 1,
"template": [
{
"id": "117856e5-6d81-40d9-bd77-7b3f1a706435",
"isready": true,
"name": "vnf-tc11-regular",
"status": "Download Complete"
}
]
}
```
- appliance deployed successfully with the regular VNF template
<details><summary><code>(localcloud) 🐱 > deployVnfAppliance
templateid=117856e5-6d81-40d9-bd77-7b3f1a706435
serviceofferingid=63b6851c-631c-4b30-81f0-e959e2eb6052
zoneid=e9594751-da68-4f49-924f-222ba4c15876 name=vnf-tc11-regular-deploy
networkids=4935f651-04b5-49f7-b25a-55c6151ad5cb,fee6a3ae-b99f-4ebe-b84b-c661fc4d5888</code></summary>
```json
{
"virtualmachine": {
"account": "admin",
"affinitygroup": [],
"arch": "x86_64",
"cpunumber": 1,
"cpuspeed": 500,
"created": "2026-01-23T12:00:29+0000",
"deleteprotection": false,
"details": {
"cpuOvercommitRatio": "2.0",
"dataDiskController": "lsilogic",
"dataDiskControllervmdisk2": "lsilogic",
"rootDiskController": "ide"
},
"displayname": "vnf-tc11-regular-deploy",
"displayvm": true,
"domain": "ROOT",
"domainid": "caacffaf-f7cc-11f0-bc70-1e00b6000327",
"domainpath": "/",
"guestosid": "cac8e8aa-f7cc-11f0-bc70-1e00b6000327",
"haenable": false,
"hasannotations": false,
"hostcontrolstate": "Enabled",
"hostid": "cfcf5c46-b2dc-4c40-b487-eb8a111a83b3",
"hostname": "10.0.35.172",
"hypervisor": "VMware",
"id": "6e78683a-f8d9-4c15-84c8-53fd72f337ed",
"instancename": "i-2-17-VM",
"ipaddress": "10.1.1.31",
"isdynamicallyscalable": false,
"isodisplaytext": "day0.iso",
"isoid": "222b267d-0b28-4ce5-976d-6dfa6493aed5",
"isoname": "day0.iso",
"jobid": "9040d257-ea37-4cd1-9d2b-3866c898cec5",
"jobstatus": 0,
"lastupdated": "2026-01-23T12:01:07+0000",
"memory": 512,
"name": "vnf-tc11-regular-deploy",
"nic": [
{
"broadcasturi": "vlan://1175",
"deviceid": "1",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "0ca0727f-e737-4ee2-9343-41837b2445b3",
"ipaddress": "10.1.1.254",
"isdefault": false,
"isolationuri": "vlan://1175",
"macaddress": "02:01:00:ce:00:0a",
"netmask": "255.255.255.0",
"networkid": "fee6a3ae-b99f-4ebe-b84b-c661fc4d5888",
"networkname": "vnf-net2",
"publicip": "10.0.52.188",
"publicipid": "0ac05a28-6a86-476a-ae41-53e1162f9396",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
},
{
"broadcasturi": "vlan://1179",
"deviceid": "0",
"extradhcpoption": [],
"gateway": "10.1.1.1",
"id": "230e3d30-409e-40ce-81d1-31043d2ec66b",
"ipaddress": "10.1.1.31",
"isdefault": true,
"isolationuri": "vlan://1179",
"macaddress": "02:01:00:cd:00:0a",
"netmask": "255.255.255.0",
"networkid": "4935f651-04b5-49f7-b25a-55c6151ad5cb",
"networkname": "vnf-net1",
"publicip": "10.0.52.187",
"publicipid": "5f84bd0b-8c78-4cbe-96f4-16ed55320408",
"secondaryip": [],
"traffictype": "Guest",
"type": "Isolated"
}
],
"osdisplayname": "Other 2.6x Linux (64-bit)",
"ostypeid": "cac8e8aa-f7cc-11f0-bc70-1e00b6000327",
"passwordenabled": false,
"pooltype": "PreSetup",
"publicip": "10.0.52.187",
"publicipid": "5f84bd0b-8c78-4cbe-96f4-16ed55320408",
"receivedbytes": 0,
"rootdeviceid": 0,
"rootdevicetype": "ROOT",
"securitygroup": [],
"sentbytes": 0,
"serviceofferingid": "63b6851c-631c-4b30-81f0-e959e2eb6052",
"serviceofferingname": "Small Instance",
"state": "Running",
"tags": [],
"templatedisplaytext": "TC11 Regular VNF template",
"templateformat": "OVA",
"templateid": "117856e5-6d81-40d9-bd77-7b3f1a706435",
"templatename": "vnf-tc11-regular",
"templatetype": "VNF",
"userid": "1095c455-f7cd-11f0-bc70-1e00b6000327",
"username": "admin",
"vnfnics": [
{
"deviceid": 0,
"management": true,
"name": "management",
"required": true
},
{
"deviceid": 1,
"management": true,
"name": "wan",
"required": true
}
],
"zoneid": "e9594751-da68-4f49-924f-222ba4c15876",
"zonename": "ref-trl-10698-v-Mol8-rositsa-kyuchukova"
}
}
```
</details>
| Device ID | VNF NIC Name (from template) | Network We Specified |
Network VM Actually Got |
|----------:|-----------------------------|-----------------------------|--------------------------|
| 0 | management | vnf-net1 (1st in list) |
vnf-net1 |
| 1 | wan | vnf-net2 (2nd in list) |
vnf-net2 |
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]