diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 5050d0f72..c89b9e8aa 100755 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -255,7 +255,7 @@ jobs: - name: Install robotframework run: | pip install -r tests/requirements.txt - - name: Run ixia-c-one tests + - name: Run keysight_ixia-c-one tests run: | bash ./tests/rf-run.sh ${{ matrix.runtime }} ./tests/04-basic-ixiacone # upload test reports as a zip file diff --git a/clab/config.go b/clab/config.go index fb9ef542c..40a0dc1b0 100644 --- a/clab/config.go +++ b/clab/config.go @@ -74,7 +74,7 @@ var kinds = []string{ "mysocketio", "host", "cvx", - "ixia-c-one", + "keysight_ixia-c-one", } // Config defines lab configuration as it is provided in the YAML file diff --git a/docs/images/ixia-c-one-ceos.drawio b/docs/images/ixia-c-one-ceos.drawio new file mode 100644 index 000000000..883bbae19 --- /dev/null +++ b/docs/images/ixia-c-one-ceos.drawio @@ -0,0 +1,590 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/lab-examples/ixiacone-ceos.md b/docs/lab-examples/ixiacone-ceos.md index c2d050144..7e0d7f5bf 100644 --- a/docs/lab-examples/ixiacone-ceos.md +++ b/docs/lab-examples/ixiacone-ceos.md @@ -1,136 +1,246 @@ | | | | ----------------------------- | ------------------------------------------------------------------------------------| -| **Description** | A Ixia-c-one node connected back-to-back with Arista cEOS | -| **Components** | [Ixia-c-one][ixia-c], [Arista cEOS][ceos] | +| **Description** | A Keysight ixia-c-one node connected back-to-back with Arista cEOS | +| **Components** | [Keysight ixia-c-one][ixia-c], [Arista cEOS][ceos] | | **Resource requirements**[^1] | :fontawesome-solid-microchip: 2
:fontawesome-solid-memory: 2 GB | -| **Topology file** | [ixiaconeceos.clab.yaml][topofile] | -| **Name** | srlceos01 | -| **Version information**[^2] | `containerlab:0.24.2`, `ixia-c-one:0.0.1-2610`, `ceos:4.25.0F`, `docker-ce:20.10.12`| +| **Topology file** | [ixiacone-ceos.clab.yaml][topofile] | +| **Name** | ixiacone-ceos | +| **Version information**[^2] | `containerlab:0.24.2`, `ixia-c-one:0.0.1-2738`, `ceos:4.26.1F`, `docker-ce:20.10.12`| ## Description -A lab consists of an Ixia-c-one node connected with Arista cEOS via a point-to-point ethernet link. Both nodes are also connected with their management interfaces to the `containerlab` docker network. - +This lab consists of a Keysight ixia-c-one node with 2 ports connected to 2 ports on an Arista cEOS node via two point-to-point ethernet links. Both nodes are also connected with their management interfaces to the `containerlab` docker network. -
+Keysight ixia-c-one is a single-container distribution of [ixia-c][ixia-c], which in turn is Keysight's reference implementation of [Open Traffic Generator API][otg]. +We'll be using a Go client SDK [gosnappi][gosnappi] to configure ixia-c-one. + +
## Use cases -This lab allows users to launch basic interoperability scenarios between Ixia-c-one and Arista cEOS operating systems. - +This lab allows users to: +- Validate an IPv4 traffic forwarding scenario between Keysight ixia-c-one and Arista cEOS. +- Validate a BGP forwarding plane between Keysight ixia-c-one and Arista cEOS. -### BGP -
+### IPv4 Traffic forwarding. +
-This lab demonstrates a simple iBGP peering scenario between Nokia SR Linux and Arista cEOS. Both nodes exchange NLRI with their loopback prefix making it reachable. +This lab demonstrates a simple IPv4 traffic forwarding scenario where +- One Keysight ixia-c-one port acts as a transmit port (IP 1.1.1.1) and the other as receive port (IP 2.2.2.2) +- Arista cEOS is configured to forward the traffic destined for 20.20.20.0/24 to 2.2.2.2 using static route configuration #### Configuration -Once the lab is deployed with containerlab, use the following configuration instructions to make interfaces configuration and enable BGP on both nodes. - -=== "srl" - Get into SR Linux CLI with `docker exec -it clab-srlceos01-srl sr_cli` and start configuration - ```bash - # enter candidate datastore - enter candidate - - # configure loopback and data interfaces - set / interface ethernet-1/1 admin-state enable - set / interface ethernet-1/1 subinterface 0 admin-state enable - set / interface ethernet-1/1 subinterface 0 ipv4 address 192.168.1.1/24 - - set / interface lo0 subinterface 0 admin-state enable - set / interface lo0 subinterface 0 ipv4 address 10.10.10.1/32 - set / network-instance default interface ethernet-1/1.0 - set / network-instance default interface lo0.0 - - # configure BGP - set / network-instance default protocols bgp admin-state enable - set / network-instance default protocols bgp router-id 10.10.10.1 - set / network-instance default protocols bgp autonomous-system 65001 - set / network-instance default protocols bgp group ibgp ipv4-unicast admin-state enable - set / network-instance default protocols bgp group ibgp export-policy export-lo - set / network-instance default protocols bgp neighbor 192.168.1.2 admin-state enable - set / network-instance default protocols bgp neighbor 192.168.1.2 peer-group ibgp - set / network-instance default protocols bgp neighbor 192.168.1.2 peer-as 65001 - - # create export policy - set / routing-policy policy export-lo statement 10 match protocol local - set / routing-policy policy export-lo statement 10 action accept - - # commit config - commit now - ``` -=== "ceos" - Get into cEOS CLI with `docker exec -it clab-srlceos01-ceos Cli` and start configuration - ```bash - # enter configuration mode - configure - ip routing - - # configure loopback and data interfaces - interface Ethernet1 - no switchport - ip address 192.168.1.2/24 - exit - interface Loopback0 - ip address 10.10.10.2/32 - exit - - # configure BGP - router bgp 65001 - router-id 10.10.10.2 - neighbor 192.168.1.1 remote-as 65001 - network 10.10.10.2/32 - exit - ``` +Once the lab is deployed with containerlab, use the following configuration instructions to configure interfaces on Arista cEOS and configure the Keysight ixia-c-one ports to forward and receive traffic from the Device Under Test. + +> If the topology is destroyed after the test, please use `docker volume prune` to remove 500MB+ of persistent volume storage which is left behind after ixia-c-one docker container is removed. + +=== "Arista cEOS" +Get into cEOS CLI with `docker exec -it clab-ixia-c-ceos Cli` and start configuration +```bash +enable +configure terminal +interface Ethernet1 + no switchport + ip address 1.1.1.2/24 +exit +interface Ethernet2 + no switchport + ip address 2.2.2.1/24 +exit +ip route 20.20.20.0/24 2.2.2.2 +ip routing +exit +exit +``` +=== "Keysight ixia-c-one" +Setup to and run `ipv4_forwarding.go` +```bash +# configure IPv4 address on rx port of ixia-c-one (replace `add` with `del` +# to undo this) +docker exec -it clab-ixia-c-ixia-c-one bash -c "./ifcfg add eth2 2.2.2.2 24" +# note down MAC address of DUT interface connected to tx port of ixia-c-one +docker exec -it clab-ixia-c-ceos bash -c "ifconfig eth1 | grep ether" + +# The docker commands above shall not be required for upcoming releases +# of ixia-c-one (which will have ARP/ND capability). + +# install go from https://go.dev/doc/install since we'll need it to run the test +# and setup test environment +mkdir tests && cd tests +go mod init tests +# gosnappi version needs to be compatible to a given release of ixia-c-one and +# can be checked from https://github.com/open-traffic-generator/ixia-c/releases +go get github.com/open-traffic-generator/snappi/gosnappi@v0.7.18 +# manually create a test file from the snippet or download it +curl -kLO https://raw.githubusercontent.com/open-traffic-generator/snappi-tests/main/scripts/ipv4_forwarding.go +# run the test with MAC address obtained in previous step +go run ipv4_forwarding.go -dstMac="" +``` +=== "ipv4_forwarding.go" +```go +/* +Test IPv4 Forwarding with +- Endpoints: OTG 1.1.1.1 -----> 1.1.1.2 DUT 2.2.2.1 ------> OTG 2.2.2.2 +- Static Route on DUT: 20.20.20.0/24 -> 2.2.2.2 +- TCP flow from OTG: 10.10.10.1 -> 20.20.20.1+ + +To run: go run ipv4_forwarding.go -dstMac= +*/ + +package main + +import ( + "flag" + "log" + "time" + + "github.com/open-traffic-generator/snappi/gosnappi" +) + +// hostname and interfaces of ixia-c-one node from containerlab topology +const ( + otgHost = "https://clab-ixia-c-ixia-c-one" + otgPort1 = "eth1" + otgPort2 = "eth2" +) + +var ( + dstMac = "ff:ff:ff:ff:ff:ff" + srcMac = "00:00:00:00:00:aa" + pktCount = 1000 +) + +func main() { + // replace value of dstMac with actual MAC of DUT interface connected to otgPort1 + flag.StringVar(&dstMac, "dstMac", dstMac, "Destination MAC address to be used for all packets") + flag.Parse() + + api, config := newConfig() + + // push traffic configuration to otgHost + res, err := api.SetConfig(config) + checkResponse(res, err) + + // start transmitting configured flows + ts := api.NewTransmitState().SetState(gosnappi.TransmitStateState.START) + res, err = api.SetTransmitState(ts) + checkResponse(res, err) + + // fetch flow metrics and wait for received frame count to be correct + mr := api.NewMetricsRequest() + mr.Flow() + waitFor( + func() bool { + res, err := api.GetMetrics(mr) + checkResponse(res, err) + + fm := res.FlowMetrics().Items()[0] + return fm.Transmit() == gosnappi.FlowMetricTransmit.STOPPED && fm.FramesRx() == int64(pktCount) + }, + 10*time.Second, + ) +} + +func checkResponse(res interface{}, err error) { + if err != nil { + log.Fatal(err) + } + switch v := res.(type) { + case gosnappi.MetricsResponse: + log.Printf("Metrics Response:\n%s\n", v) + case gosnappi.ResponseWarning: + for _, w := range v.Warnings() { + log.Println("WARNING:", w) + } + default: + log.Fatal("Unknown response type:", v) + } +} + +func newConfig() (gosnappi.GosnappiApi, gosnappi.Config) { + // create a new API handle to make API calls against otgHost + api := gosnappi.NewApi() + api.NewHttpTransport().SetLocation(otgHost).SetVerify(false) + + // create an empty traffic configuration + config := api.NewConfig() + // create traffic endpoints + p1 := config.Ports().Add().SetName("p1").SetLocation(otgPort1) + p2 := config.Ports().Add().SetName("p2").SetLocation(otgPort2) + // create a flow and set the endpoints + f1 := config.Flows().Add().SetName("p1.v4.p2") + f1.TxRx().Port().SetTxName(p1.Name()).SetRxName(p2.Name()) + + // enable per flow metrics tracking + f1.Metrics().SetEnable(true) + // set size, count and transmit rate for all packets in the flow + f1.Size().SetFixed(512) + f1.Rate().SetPps(500) + f1.Duration().FixedPackets().SetPackets(int32(pktCount)) + + // configure headers for all packets in the flow + eth := f1.Packet().Add().Ethernet() + ip := f1.Packet().Add().Ipv4() + tcp := f1.Packet().Add().Tcp() + + eth.Src().SetValue(srcMac) + eth.Dst().SetValue(dstMac) + + ip.Src().SetValue("10.10.10.1") + ip.Dst().Increment().SetStart("20.20.20.1").SetStep("0.0.0.1").SetCount(5) + + tcp.SrcPort().SetValue(3250) + tcp.DstPort().Decrement().SetStart(8070).SetStep(2).SetCount(10) + + log.Printf("OTG configuration:\n%s\n", config) + return api, config +} + +func waitFor(fn func() bool, timeout time.Duration) { + start := time.Now() + for { + if fn() { + return + } + if time.Since(start) > timeout { + log.Fatal("Timeout occurred !") + } + + time.Sleep(500 * time.Millisecond) + } +} +``` #### Verification -Once BGP peering is established, the routes can be seen in GRT of both nodes: - -=== "srl" - ```bash - A:srl# show network-instance default route-table ipv4-unicast summary | grep bgp - | 10.10.10.2/32 | 0 | true | bgp | 0 | 170 | 192.168.1.2 (indirect) | None | - ``` - -=== "ceos" - ```bash - ceos>show ip route - - VRF: default - Codes: C - connected, S - static, K - kernel, - O - OSPF, IA - OSPF inter area, E1 - OSPF external type 1, - E2 - OSPF external type 2, N1 - OSPF NSSA external type 1, - N2 - OSPF NSSA external type2, B - BGP, B I - iBGP, B E - eBGP, - R - RIP, I L1 - IS-IS level 1, I L2 - IS-IS level 2, - O3 - OSPFv3, A B - BGP Aggregate, A O - OSPF Summary, - NG - Nexthop Group Static Route, V - VXLAN Control Service, - DH - DHCP client installed default route, M - Martian, - DP - Dynamic Policy Route, L - VRF Leaked, - RC - Route Cache Route - - Gateway of last resort: - K 0.0.0.0/0 [40/0] via 172.20.20.1, Management0 - - B I 10.10.10.1/32 [200/0] via 192.168.1.1, Ethernet1 - C 10.10.10.2/32 is directly connected, Loopback0 - C 172.20.20.0/24 is directly connected, Management0 - C 192.168.1.0/24 is directly connected, Ethernet1 - ``` - -Data plane confirms that routes have been programmed to FIB: -``` -A:srl# ping 10.10.10.2 network-instance default -Using network instance default -PING 10.10.10.2 (10.10.10.2) 56(84) bytes of data. -64 bytes from 10.10.10.2: icmp_seq=1 ttl=64 time=3.47 ms +The test that we ran above will continuously keep checking flow metrics to ensure packet count received on rx port of ixia-c-one are as expected. +If the condition is not met in 10 seconds, the test will timeout, hence indicating failure. + +Upon success, flow metrics should be as noted below. + +```yaml +choice: flow_metrics +flow_metrics: +- bytes_rx: "512000" + bytes_tx: "0" + frames_rx: "1000" + frames_rx_rate: 499 + frames_tx: "1000" + frames_tx_rate: 500 + name: p1.v4.p2 + transmit: stopped ``` +### BGPv4 Forwarding Plane + +This section will soon be update with appropriate details. + +> Support for protocols like BGP and IS-IS is not supported by free distribution of ixia-c-one. Please contact Keysight Support for more details. - -[ixia-c]: https://github.com/open-traffic-generator/ixia-c -[ceos]: https://www.arista.com/en/products/software-controlled-container-networking -[topofile]: https://github.com/srl-labs/containerlab/tree/master/lab-examples/ixiac/ixiaconeceos.clab.yaml +[ixia-c]: https://github.com/open-traffic-generator/ixia-c +[otg]: https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/open-traffic-generator/models/master/artifacts/openapi.yaml +[gosnappi]: https://github.com/open-traffic-generator/snappi/tree/main/gosnappi +[ceos]: https://www.arista.com/en/products/software-controlled-container-networking +[topofile]: ../../lab-examples/ixiac/ixiacone-ceos.clab.yaml -[^1]: Resource requirements are provisional. Consult with the installation guides for additional information. +[^1]: Resource requirements are provisional. Consult with the installation guides for additional information. [^2]: The lab has been validated using these versions of the required tools/components. Using versions other than stated might lead to a non-operational setup process. \ No newline at end of file diff --git a/docs/manual/kinds/ixia-c-one.md b/docs/manual/kinds/ixia-c-one.md index 25ebc7573..92e37a7b4 100755 --- a/docs/manual/kinds/ixia-c-one.md +++ b/docs/manual/kinds/ixia-c-one.md @@ -1,33 +1,113 @@ -# Ixia-c-one +# Keysight ixia-c-one -ixia-c-one is a re-packaged (as a single-container) flavor of multi-container application[ixia-c](https://github.com/open-traffic-generator/ixia-c). -It is identified with `ixia-c-one` kind in the [topology file](../topo-def-file.md). A kind defines a supported feature set and a startup procedure of a `ixia-c-one` node. +Keysight ixia-c-one is a single-container distribution of [ixia-c][ixia-c], which in turn is Keysight's reference implementation of [Open Traffic Generator API][otg]. +Client SDK for configuring ixia-c-one is available in various languages, most prevalent being [gosnappi][gosnappi]. +The corresponding node in containerlab is identified with `keysight_ixia-c-one` kind in the [topology file](../topo-def-file.md). Upon boot up, it comes up with: +- management interface `eth0` configured with IPv4/6 addresses as assigned by docker +- hostname assigned to the node name +- HTTPS service enabled on port 443 (for client SDK to push configuration and fetch metrics) ## Managing ixia-c-one nodes -Ixia-c-one node launched with containerlab can be managed via the following: -=== "bash" - to connect to a `bash` shell of a running ixia-c-one container: +ixia-c-one is a `docker:dind` container hosting two kinds of [ixia-c][ixia-c] containers internally: +- A set of containers acting as API endpoint and managing configuration across multiple test ports +- A set of containers bound to network interface (created by containerlab), treating it as a test port (i.e. for generating or processing traffic, emulating protocols, etc.) + +Request and response to the API endpoint is driven by [Open Traffic Generator API][otg], and can be exercised in following two ways: +- Using client SDK + ```bash + # install go from https://go.dev/doc/install since we'll need it to run the test + # and setup test environment + mkdir tests && cd tests + go mod init tests + # gosnappi version needs to be compatible to a given release of ixia-c-one and + # can be checked from https://github.com/open-traffic-generator/ixia-c/releases + go get github.com/open-traffic-generator/snappi/gosnappi@v0.7.18 + # download a basic IPv4 forwarding test + curl -kLO https://raw.githubusercontent.com/open-traffic-generator/snappi-tests/main/scripts/ipv4_forwarding.go + # run the test with MAC address obtained in previous step + go run ipv4_forwarding.go -dstMac="" + ``` +- Using curl and JSON payloads ```bash - docker exec -it bash + # fetch configuration that was last pushed to ixia-c-one + curl -kL https://clab-ixia-c-ixia-c-one/config + # fetch flow metrics + curl -kL https://clab-ixia-c-ixia-c-one/results/metrics -d '{"choice": "flow"}' ``` ## Interfaces mapping ixia-c-one container uses the following mapping for its linux interfaces: * `eth0` - management interface connected to the containerlab management network -* `eth1` - first data interface +* The other interfaces are the data interfaces which are created using same name as provided in the containerlab topology yaml file. + +When containerlab launches ixia-c-one node, it will set IPv4/6 addresses as assigned by docker to the `eth0` interface and ixia-c-one node will boot with that addresses configured. -When containerlab launches ixia-c-one node, it will set IPv4/6 addresses as assigned by docker to the `eth0` interface and ixia-c-one node will boot with that addresses configured. Data interfaces `eth1+` need to be configured with IP addressing manually. +Data interfaces `eth1+` need to be configured with IP addressing manually if needed (as in the Layer3 forwarding test example). +This is needed when the test port needs to reply to ARP/ND queries from the Device Under Test. + +- To configure an IPv4 address on any data link e.g. eth2 (Could be eth1 or eth3 as well, but never on eth0): + ```bash + docker exec -it clab-ixia-c-ixia-c-one bash -c "./ifcfg add eth2 2.2.2.2 24" + ``` +- To unset an IPv4 address on any data link e.g. eth2 + ```bash + docker exec -it clab-ixia-c-ixia-c-one bash -c "./ifcfg del eth2 2.2.2.2 24" + ``` +- To configure an IPv6 address on any data link e.g. eth1 : + ```bash + docker exec -it clab-ixia-c-ixia-c-one bash -c "./ifcfg add eth1 11::1 64" + ``` +- To unset an IPv4 address on any data link e.g. eth2 + ```bash + docker exec -it clab-ixia-c-ixia-c-one bash -c "./ifcfg del eth1 11::1 64" + ``` ## Features and options - +The free version of ixia-c supports generation of L2 and L3 traffic to test forwarding of Ethernet, IPv4 and IPv6 traffic by switches and routers. For technical support and queries , please log requests at https://github.com/open-traffic-generator/ixia-c/issues or contact us @ https://ixia-c.slack.com/signup#/domain-signup . + +The commercial version of ixia-c supports ARP/ND/Auto destination MAC resolution in data traffic, IPv4 and IPv6 BGP with IPv4 and IPv6 Routes and ISIS with IPv4 and IPv6 routes. Please contact Keysight support for further information regarding this if needed. ## Lab examples -The following labs feature ixia-c-one node: +The following labs feature Keysight ixia-c-one node: -- [Ixia-c-one and Arista cEOS](../../lab-examples/ixiacone-ceos.md) +- [Keysight ixia-c-one and Arista cEOS](../../lab-examples/ixiacone-ceos.md) ## Known issues or limitations - +1. For L3 traffic tests using the free version , there is no in-built support of ARP and ND. + This can be worked around by manually setting IP address on the receive interface (as explained in Interfaces mapping section above) and by learning the MAC of the connected DUT using external means such as gnmi/ssh/reading it from CLI and using it when generating packets. + This limitation will be removed in the ixia-c-one free version in future releases where it is planned to support ARP/ND Request and Reply for emulated interfaces. + +2. Every time a containerlab topology with an ixia-c-one node is removed, it leaves behind a persistent storage. + If there are no other persistent unlinked storages on your system, you can remove it by removing all unlinked persistent storages by giving the command: + ```bash + docker volume prune + ``` + + If you wish to be very safe: + ```bash + # get the volume corresponding ot ixia-c-one node + docker inspect clab-ixia-c-ixia-c-one + # note the volume name from output + "Mounts": [ + { + "Type": "volume", + "Name": "d1e87f85d3352bfb9dac3f8bac8eebee738503802cb9380966b5c4805bd791da", + "Source": "/var/lib/docker/volumes/d1e87f85d3352bfb9dac3f8bac8eebee738503802cb9380966b5c4805bd791da/_data", + "Destination": "/var/lib/docker", + + # remove the volume + docker volume remove d1e87f85d3352bfb9dac3f8bac8eebee738503802cb9380966b5c4805bd791da + ``` + + > This can be optionally be fixed in containerlab with one of the two approaches below: + > i) During docker run pass the --rm flag when starting the containers, or + > ii) During docker rm pass the -v flag when removing the containers. + + +[ixia-c]: https://github.com/open-traffic-generator/ixia-c +[otg]: https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/open-traffic-generator/models/master/artifacts/openapi.yaml +[gosnappi]: https://github.com/open-traffic-generator/snappi/tree/main/gosnappi + diff --git a/docs/manual/kinds/kinds.md b/docs/manual/kinds/kinds.md index 2b273ba8f..87c6848fb 100755 --- a/docs/manual/kinds/kinds.md +++ b/docs/manual/kinds/kinds.md @@ -26,23 +26,23 @@ topology: Containerlab supports a fixed number of kinds. Within each predefined kind we store the necessary information that is used to launch the container successfully. The following kinds are supported or in the roadmap of containerlab: -| Name | Kind | Status | -| ------------------- | ------------------------------------- | ------------ | -| **Nokia SR Linux** | [`srl`](srl.md) | supported | -| **Nokia SR OS** | [`vr-sros`](vr-sros.md) | supported | -| **Arista cEOS** | [`ceos`](ceos.md) | supported | -| **Arista vEOS** | [`vr-veos`](vr-veos.md) | supported | -| **Juniper cRPD** | [`crpd`](crpd.md) | supported | -| **Juniper vMX** | [`vr-vmx`](vr-vmx.md) | supported | -| **Juniper vQFX** | [`vr-vqfx`](vr-vqfx.md) | experimental | -| **Cisco XRv9k** | [`vr-xrv9k`](vr-xrv9k.md) | supported | -| **Cisco XRv** | [`vr-xrv`](vr-xrv.md) | supported | -| **Dell FTOS** | [`vr-ftosv`](vr-ftosv.md) | supported | -| **SONiC** | [`sonic`](sonic-vs.md) | supported | -| **Linux container** | [`linux`](linux.md) | supported | -| **Linux bridge** | [`bridge`](bridge.md) | supported | -| **OvS bridge** | [`ovs-bridge`](ovs-bridge.md) | supported | -| **mysocketio node** | [`mysocketio`](../published-ports.md) | supported | -| **Ixia-c-one** | [`ixia-c-one`](ixia-c-one.md) | supported | +| Name | Kind | Status | +| ----------------------- | -------------------------------------- | ------------ | +| **Nokia SR Linux** | [`srl`](srl.md) | supported | +| **Nokia SR OS** | [`vr-sros`](vr-sros.md) | supported | +| **Arista cEOS** | [`ceos`](ceos.md) | supported | +| **Arista vEOS** | [`vr-veos`](vr-veos.md) | supported | +| **Juniper cRPD** | [`crpd`](crpd.md) | supported | +| **Juniper vMX** | [`vr-vmx`](vr-vmx.md) | supported | +| **Juniper vQFX** | [`vr-vqfx`](vr-vqfx.md) | experimental | +| **Cisco XRv9k** | [`vr-xrv9k`](vr-xrv9k.md) | supported | +| **Cisco XRv** | [`vr-xrv`](vr-xrv.md) | supported | +| **Dell FTOS** | [`vr-ftosv`](vr-ftosv.md) | supported | +| **SONiC** | [`sonic`](sonic-vs.md) | supported | +| **Linux container** | [`linux`](linux.md) | supported | +| **Linux bridge** | [`bridge`](bridge.md) | supported | +| **OvS bridge** | [`ovs-bridge`](ovs-bridge.md) | supported | +| **mysocketio node** | [`mysocketio`](../published-ports.md) | supported | +| **Keysight ixia-c-one** | [`keysight_ixia-c-one`](ixia-c-one.md) | supported | Refer to a specific kind documentation article to see the details about it. \ No newline at end of file diff --git a/lab-examples/ixiac/enable_ssh_ceos.cfg b/lab-examples/ixiac/enable_ssh_ceos.cfg index aa8cfddaf..32327331a 100644 --- a/lab-examples/ixiac/enable_ssh_ceos.cfg +++ b/lab-examples/ixiac/enable_ssh_ceos.cfg @@ -1,5 +1,4 @@ -! Command: show running-config -! device: localhost (cEOSLab, EOS-4.26.0F-21792469.4260F (engineering build)) +transceiver qsfp default-mode 4x10G ! service routing protocols model ribd ! @@ -20,4 +19,11 @@ username admin privilege 15 role network-admin nopassword ! management api gnmi transport grpc default + ssl profile octa-ssl-profile + provider eos-native +! +management security + ssl profile octa-ssl-profile + certificate gnmiCert.pem key gnmiCertKey.pem +! end \ No newline at end of file diff --git a/lab-examples/ixiac/ixiacone-ceos.clab.yaml b/lab-examples/ixiac/ixiacone-ceos.clab.yaml new file mode 100644 index 000000000..a6de52e0e --- /dev/null +++ b/lab-examples/ixiac/ixiacone-ceos.clab.yaml @@ -0,0 +1,19 @@ +name: ixia-c + +topology: + kinds: + keysight_ixia-c-one: + image: ghcr.io/open-traffic-generator/ixia-c-one:0.0.1-2738 + ceos: + image: ceos:4.26.1F + nodes: + ixia-c-one: + kind: keysight_ixia-c-one + ceos: + kind: ceos + startup-config: enable_ssh_ceos.cfg + enforce-startup-config: true + + links: + - endpoints: ["ixia-c-one:eth1", "ceos:eth1"] + - endpoints: ["ixia-c-one:eth2", "ceos:eth2"] diff --git a/lab-examples/ixiac/ixiaconeceos.clab.yaml b/lab-examples/ixiac/ixiaconeceos.clab.yaml deleted file mode 100644 index ddd6068cf..000000000 --- a/lab-examples/ixiac/ixiaconeceos.clab.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: ixiaconeceos - -topology: - kinds: - ixia-c-one: - image: ghcr.io/open-traffic-generator/ixia-c-one:0.0.1-2610 - ceos: - image: ceos:4.26.1F - nodes: - ixia-c-one-node1: - kind: ixia-c-one - ceos-1: - kind: ceos - startup-config: enable_ssh_ceos.cfg - enforce-startup-config: true - - links: - - endpoints: ["ixia-c-one-node1:eth1", "ceos-1:eth1"] - - endpoints: ["ceos-1:eth2", "ixia-c-one-node1:eth2"] diff --git a/mkdocs.yml b/mkdocs.yml index 06b17ad5a..7d76696ca 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,7 +27,7 @@ nav: - linux - Linux container: manual/kinds/linux.md - bridge - Linux bridge: manual/kinds/bridge.md - ovs-bridge - Openvswitch bridge: manual/kinds/ovs-bridge.md - - ixia-c-one - Ixia-c: manual/kinds/ixia-c-one.md + - keysight_ixia-c-one - Keysight ixia-c-one: manual/kinds/ixia-c-one.md - Configuration artifacts: manual/conf-artifacts.md - Network wiring concepts: manual/network.md - Packet capture & Wireshark: manual/wireshark.md @@ -80,7 +80,7 @@ nav: - Cumulus Linux and FRR: lab-examples/cvx01.md - Cumulus Linux (docker runtime) and Host: lab-examples/cvx02.md - BGP VPLS between Nokia and Juniper: lab-examples/bgp-vpls-nok-jun.md - - Ixia-c-one and Arista cEOS: lab-examples/ixiacone-ceos.md + - Keysight ixia-c-one and Arista cEOS: lab-examples/ixiacone-ceos.md - Multi-node labs: lab-examples/multinode.md - Templated labs: - Leaf-spine topology: lab-examples/templated01.md diff --git a/nodes/ixiac_one/ixiac-one.go b/nodes/ixiac_one/ixiac-one.go index eb2ec05fb..75c541178 100755 --- a/nodes/ixiac_one/ixiac-one.go +++ b/nodes/ixiac_one/ixiac-one.go @@ -58,7 +58,7 @@ func (l *ixiacOne) Deploy(ctx context.Context) error { } func (l *ixiacOne) PostDeploy(ctx context.Context, _ map[string]nodes.Node) error { - log.Infof("Running postdeploy actions for ixia-c-one '%s' node", l.cfg.ShortName) + log.Infof("Running postdeploy actions for keysight_ixia-c-one '%s' node", l.cfg.ShortName) return ixiacPostDeploy(ctx, l.runtime, l.cfg) } @@ -80,7 +80,7 @@ func (*ixiacOne) SaveConfig(_ context.Context) error { return nil } -// ixiacPostDeploy runs postdeploy actions which are required for ixia-c-one node +// ixiacPostDeploy runs postdeploy actions which are required for keysight_ixia-c-one node func ixiacPostDeploy(ctx context.Context, r runtime.ContainerRuntime, cfg *types.NodeConfig) error { ixiacOneCmd := fmt.Sprintf("ls %s", ixiacStatusConfig.readyFileName) statusInProgressMsg := fmt.Sprintf("ls: %s: No such file or directory", ixiacStatusConfig.readyFileName) diff --git a/nodes/node.go b/nodes/node.go index 56d9136aa..5a5e10519 100644 --- a/nodes/node.go +++ b/nodes/node.go @@ -45,7 +45,7 @@ const ( NodeKindVrXRV = "vr-xrv" NodeKindVrXRV9K = "vr-xrv9k" NodeKindVrNXOS = "vr-nxos" - NodeKindIXIACONE = "ixia-c-one" + NodeKindIXIACONE = "keysight_ixia-c-one" ) // a map of node kinds overriding the default global runtime diff --git a/schemas/clab.schema.json b/schemas/clab.schema.json index 4e1acc58f..57d4b2027 100644 --- a/schemas/clab.schema.json +++ b/schemas/clab.schema.json @@ -39,7 +39,7 @@ "ovs-bridge", "mysocketio", "host", - "ixia-c-one" + "keysight_ixia-c-one" ] }, "license": { @@ -452,7 +452,7 @@ "host": { "$ref": "#/definitions/node-config" }, - "ixia-c-one": { + "keysight_ixia-c-one": { "$ref": "#/definitions/node-config" } } diff --git a/tests/04-basic-ixiacone/01-ixiacone.robot b/tests/04-basic-ixiacone/01-ixiacone.robot index bd7a9cb03..ddf8fd05f 100755 --- a/tests/04-basic-ixiacone/01-ixiacone.robot +++ b/tests/04-basic-ixiacone/01-ixiacone.robot @@ -26,14 +26,14 @@ Get node mgmt IP ... sudo docker inspect clab-${lab-name}-${node1-name} -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' Should Be Equal As Integers ${rc} 0 -Verify link eth1 in ixia-c-one node n1 +Verify link eth1 in keysight_ixia-c-one node n1 ${rc} ${output} = Run And Return Rc And Output ... sudo containerlab --runtime ${runtime} exec -t ${CURDIR}/${lab-file-name} --label clab-node-name\=n1 --cmd "docker exec -t ixia-c-port-dp-${ifc1-name} ip link show ${ixiacone-ns-ifc-name}" Log ${output} Should Be Equal As Integers ${rc} 0 Should Contain ${output} state UP -Verify link eth2 in ixia-c-one node n1 +Verify link eth2 in keysight_ixia-c-one node n1 ${rc} ${output} = Run And Return Rc And Output ... sudo containerlab --runtime ${runtime} exec -t ${CURDIR}/${lab-file-name} --label clab-node-name\=n1 --cmd "docker exec -t ixia-c-port-dp-${ifc2-name} ip link show ${ixiacone-ns-ifc-name}" Log ${output} diff --git a/tests/04-basic-ixiacone/04-ixiacone01-clab.yml b/tests/04-basic-ixiacone/04-ixiacone01-clab.yml index 439b4de17..9b9f5c276 100755 --- a/tests/04-basic-ixiacone/04-ixiacone01-clab.yml +++ b/tests/04-basic-ixiacone/04-ixiacone01-clab.yml @@ -6,11 +6,11 @@ name: 04-01-ixiacone topology: kinds: - ixia-c-one: + keysight_ixia-c-one: image: ghcr.io/open-traffic-generator/ixia-c-one:0.0.1-2610 nodes: n1: - kind: ixia-c-one + kind: keysight_ixia-c-one links: - endpoints: ["n1:eth1", "n1:eth2"]