Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

L4-7 models #263

Draft
wants to merge 34 commits into
base: master
Choose a base branch
from
Draft

L4-7 models #263

wants to merge 34 commits into from

Conversation

waseembaig
Copy link

@waseembaig waseembaig commented Aug 29, 2022

Below are the features added for L4-7 model
-> Added App under config for l4-7 configurations
-> Added TCP and HTTP model on App . The profile can be used in traffic and can be scaled for TCP and HTTP configs
-> Added Traffic in App for L4-7 traffic configurations such as client, server , endpoints and objectives configs
-> it resolves discussed functionality in issue: #238

View the proposed changes using the redocly API viewer

Sample snippet

def configure_ixload(api):
    conf_obj = api.config()
    port_1 = conf_obj.ports.port(name="p1", location='10.22.40.53/1/1')[-1]
    port_2 = conf_obj.ports.port(name="p2", location='10.22.40.53/1/2')[-1]

    #rx and tx varible naming is to differentiate between client and server configs.
    rx_device, tx_device  = conf_obj.devices.device(name="client").device(name="server")

    rx_device.port_name = port_1.name
    tx_device.port_name = port_2.name
    #Client Configuration
    rx_eth = rx_device.ethernet
    rx_eth.name = "rx_eth"
    rx_eth.mac = "00:00:00:00:65:01"
    rx_eth.mtu = 1500

    rx_ipv4 = rx_eth.ipv4
    rx_ipv4.name = "rx_ipv4"
    rx_ipv4.address = "21.1.1.2"
    rx_ipv4.prefix = "24"
    rx_ipv4.gateway = "21.1.1.1"

    server_app = conf_obj.apps.app()[-1]
    #TCP config
    rx_tcp = server_app.tcp.tcp()[-1]
    rx_tcp.name = "tcp1"
    rx_tcp.keep_alive_time = 700
    rx_tcp.receive_buffer_size = 4096
    rx_tcp.transmit_buffer_size = 4096
    #HTTP Server config
    http_server = server_app.http_server.server()[-1]
    http_server.transport_name = rx_tcp.name
    http_server.name = "http_server1"
    http_server.http_version = "2.0"
    http_server.http_port = "8080"

    #HTTP client config
    tx_eth = tx_device.ethernet
    tx_eth.name = "tx_eth"
    tx_eth.mac = "00:00:00:00:70:01"
    tx_eth.mtu = 1500

    tx_ipv4 = tx_eth.ipv4
    tx_ipv4.name = "tx_ipv4"
    tx_ipv4.address = "21.1.1.2"
    tx_ipv4.prefix = "24"
    tx_ipv4.gateway = "21.1.1.1"

    client_app = conf_obj.apps.app()[-1]
    #TCP config
    tx_tcp = client_app.tcp.tcp()[-1]
    tx_tcp.name = "tcp2"
    tx_tcp.keep_alive_time = 700
    tx_tcp.receive_buffer_size = 4096
    tx_tcp.transmit_buffer_size = 4096
 
    #HTTP Client config
    http_client  = client_app.http_client.client()[-1]
    http_client.transport_name = tx_tcp.name
    http_client.name = "http_client1"
    http_client.http_version = "2.0"
    #Method.post will configure the post configuration for HTTP POST config.
    post_method = http_client.method.post()
    post_method.url= "http_server1"
    post_method.page = "/a.html"
    #Method.get will configure the post configuration for HTTP POST config.
    get_method = http_client.method.get()
    get_method.server= "http_server1"
    get_method.page = "/a.html"

    #Traffic configs
    traffic = client_app.stateful_flows.stateful_flow()[-1]
    traffic_cl = traffic.client()
    traffic_c_ep = traffic_cl.endpoints.endpoints()[-1]
    traffic_c_ep.ip_interface_name = tx_ipv4.name
    traffic_c_ep.ports.values = [80,81,82,84,85]
    traffic_cl.protocol = http_client.name
 
    traffic_sl = traffic.server()
    traffic_sl_ep = traffic_sl.endpoints.endpoints()[-1]
    traffic_sl_ep.dest.name = rx_ipv4.name
    traffic_sl_ep.dest.ports.values = [80,81,82,84,85]
    traffic_sl.protocol = http_server.name

    objt= traffic.objective.throughput()
    objt.value = 100
    objt.ramp_up_value = 30
    objt.sustain_value = 120
    objt.ramp_down_value = 30
    api.set_config(conf_obj)

L4-7 Model support for TCP and HTTP
app/app.yaml Outdated
schemas:
App:
description: >-
A container for emulated protocol and traffic configuration.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"emulated protocol" description can also apply to "devices" in the OTG tree. Need to be more precise in what this is and how it is different from devices.

app/app.yaml Outdated
x-field-uid: 1
http:
description: >-
The properties of HTTP and its children,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this just HTTP or also HTTPS? If it is also HTTPS then update comment to "HTTP(S)".

app/app.yaml Outdated
x-field-uid: 3
traffic:
description: >-
Traffic configuration of endpoints
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to be more precise as to how this differs from 'flows'. That is also traffic configuration.

HTTP Version
type: integer
default: 1
x-field-uid: 3
Copy link
Contributor

@ankur-sheth ankur-sheth Oct 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this '3' and not '2'? It shouldn't matter from a correctness standpoint. Just curious as to why it was skipped. If we change this to '2' then the ones below also should be updated.

http_version:
description: >-
HTTP Version
type: integer
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be an enum instead of an integer? What is the usual convention followed in the rest of the model? In the PR the line is as shown below, which indicates that this is a string :

http_client.http_version = "2.0"

properties:
transport_name:
description: >-
TCP interface name
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to clearly indicate that this is the TCP "on top of which" this HTTP is running.

x-field-uid: 4
max_sessions:
description: >-
Max HTTP sessions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this simultaneous sessions? Is this number of simultaneous sessions that the client will initiate? Does this apply to both HTTP client and HTTP server?

type: integer
default: 1
x-field-uid: 5
max_streams:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same question as 'max_sessions'.

description: >-
Command timeout timer in seconds
type: integer
default: 600
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the rationale for the value 600? Is it coming from the HTTP specification?

@@ -55,6 +55,13 @@ components:
options:
$ref: '#/components/schemas/Config.Options'
x-field-uid: 8
app:
description: |-
The emulated Application configured on devices interface.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The emulated Application(s) configured on devices?

@@ -22,3 +22,17 @@ components:
description: >-
A empty container that is used to indicate a null choice.
type: object

Value.Object:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is this used? I couldn't find any location where this is used.

schemas:
App.Traffic:
description: >-
Traffic config.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Application traffic configuration.

items:
$ref: './endpoints.yaml#/components/schemas/Endpoints.Server'
x-field-uid: 1
protocol:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be an enum?

schemas:
Traffic.Server:
description: >-
Server traffic configs .
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Traffic configuration for server(s)?

Copy link
Contributor

@ankur-sheth ankur-sheth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes to HTTP (to separate out client and server properties) are still pending.

@@ -33,7 +33,7 @@ components:
x-field-uid: 3
cookie_reject_probability:
description: >-
cookie_reject_probability indicates the probability, from 0 to 1, that a client will reject a request for a cookie’s contents from the server. (only if enable_cookie_support is enabled)
cookie_reject_probability indicates the probability, from 0 to 1, that a client will reject a request for a cookie(s) contents from the server. (only if enable_cookie_support is enabled)
type: integer
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be an integer or some other type?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated with boolean

@@ -33,7 +33,7 @@ components:
x-field-uid: 3
request_timeout:
description: >-
The amount of seconds that the server will wait for input on an open connection before closing the session with a 408 error.
The amount of seconds that the server will wait for input on an open connection before closing the session with a 408 error.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The amount of seconds --> The number of seconds

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in PR

@@ -39,7 +39,7 @@ components:
x-field-uid: 1
ramp_up_type:
description: >-
Ramp up type for test.
Ramp up type to either bring up users at a certain rate.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description is still not fully clear to me.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in PR

@waseembaig
Copy link
Author

Changes to HTTP (to separate out client and server properties) are still pending.

@ankur-sheth Have added client and server properties separate.

Below are the snippet

http

Copy link
Contributor

@ajbalogh ajbalogh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is my one armed test sample. I think the intermediate http add isn't needed. I also think the method post is missing content. Would it make sense to have a way to configure methods that can be reused in multiple clients?

import snappi


def test_app_one_armed():
    """A one armed test to simulate many users requesting a single page, and
    posting data to a single server.
    """
    api = snappi.api()

    # create the config with one ipv4 device
    config = api.config()
    e1 = config.devices.add(name="d1").ethernets.add(name="e1")
    e1.connection.port_name = config.ports.add(name="p1").name
    ipv41 = e1.ipv4_addresses.add(name="i1")

    # create an http client application
    app1 = config.apps.add(name="app1")
    tcp1 = app1.tcp.add(name="tcp1")
    http1 = app1.http.add(name="http1")
    http_client1 = http1.client(name="http_client1", transport_name=tcp1.name)
    method1 = http_client1.methods.add()
    method1.get.server = "1.1.1.1"
    method1.get.page = "index.html"
    method2 = http_client1.methods.add()
    method2.post.server = "1.1.1.1"
    method2.post.page = "upload.html"
    method2.post.content = "asdfasdfasdfasdf"

    # create a stateful flow using the http client application and ipv4 device
    flow1 = app1.stateful_flows.add(name="f1")
    flow1.client.protocol = http1.name
    endpoint1 = flow1.client.endpoints.add(ip_interface_name=ipv41.name)
    endpoint1.ports.value = 6001
    flow1.objectives.simulated_user.value = 10000

@@ -0,0 +1,62 @@
components:
schemas:
App.Http:
Copy link
Contributor

@ajbalogh ajbalogh Nov 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The http array seems redundant. It should be removed and two separate properties, an array of http_client and and array of http_server should be created.

@ajbalogh Updated the changes . Please review updated models: https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/open-traffic-generator/models/Ixload-models/artifacts/openapi.yaml&nocors#tag/Configuration/operation/set_config

@@ -0,0 +1,13 @@
components:
schemas:
App.Ssl:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also does this enable ssl for all the http clients/servers in the app? Having it on the client/server itself would be more flexible?

app/statefull_flow/client.yaml Outdated Show resolved Hide resolved
app/app.yaml Outdated
items:
$ref: './ssl/ssl.yaml#/components/schemas/App.Ssl'
x-field-uid: 3
statefull_flows:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo - should be stateful_flows

Copy link
Author

@waseembaig waseembaig Nov 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes to HTTP (to separate out client and server properties) are still pending.

@ankur-sheth updated the changes . Please review updated models: https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/open-traffic-generator/models/Ixload-models/artifacts/openapi.yaml&nocors#tag/Configuration/operation/set_config

Throughput value.
type: integer
x-field-uid: 1
sutain_time:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo - sustain_time

type: number
x-field-uid: 3

Objective.Conn_curr:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove underscore - create full name? - ie Objective.Connection.Concurrent

Value applied to ramp_up_type to either bring up users at a certain rate.
type: integer
x-field-uid: 3
sutain_time:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo - sustain_time

x-field-uid: 4
ramp_down_time:
description: >-
Rampu down time in seconds.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

@@ -0,0 +1,115 @@
components:
schemas:
Statefull_flow.Objective:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo - StatefulFlow.Objective

Endpoint destination config for server.
type: object
properties:
choice:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expand the choice to differentiate between ipv6_address and ipv4_address, the type will be string and the format will be ipv4 and ipv6 respectively

Copy link
Author

@waseembaig waseembaig Nov 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in PR.

choice

@winstonliu1111
Copy link

@lemoncrust FYI.

schemas:
App:
description: >-
A container for emulated TCP/UDP , application protocols, attacks and it's traffic configurations.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's -> its

default: "v10"
cookie_jar_size:
description: >-
cookie_jar_size the number of cookies that will be saved for each client. The maximum value of this is 300. (only if enable_cookie_support is enabled)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cookie_jar_size the number -> The number

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not define max for this field to be 300?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably need rewording of (only if enable_cookie_support is enabled). when enable_cookie_support is on, this is the number of cookies ...

x-field-uid: 5
command_timeout:
description: >-
HTTP command timeout timer in seconds

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

declare reasonable min/max please, so that it is testable within reasons.

@@ -0,0 +1,12 @@
components:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does it make sense to just have this wrap HttpClient.Client which is defined in the client.yaml file?

meaning, are there common client properties that we envision to be among all kinds of clients other than HTTP? If yes, that would go to client.yaml, but the httpclient specific options should just be in this file?

same comment for httpserver.yaml vs. server.yaml

description: >-
The number of seconds that the server will wait for input on an open connection before closing the session with a 408 error.
type: integer
default: 300

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reasonable min/max?

@@ -0,0 +1,22 @@
components:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

directory name statefull_flow -> stateful_flow

schemas:
StatefulFlow.Objective:
description: >-
objective config such simulated user, thoughput, conncurrent connections.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thoughput -> throughput

objective config such simulated user, thoughput, conncurrent connections.
type: object
properties:
choice:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we mentioned that iperf can be mapped to this model overall. will any of these 3 objectives map to iperf? If yes, how? examples?

iperf has a mode that is able to just seek max bandwidth/tput, but how would. someone map the throughput objectives defined here to iperf to make sense? what can we measure?

Copy link
Author

@waseembaig waseembaig Jan 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@winstonliu1111 @ajbalogh
we could map tcp and other iperf, nperf properties in proposed model. To measure max throughput as iperf/nperf in L47 model, following are the proposal .

    Objective.Throughput:
      description: >-
        Throughput traffic 
      type: object
      required: [choice]
      properties:
        choice:
          description: |-
            The throughput test value or max throughput .
          type: string
          default: value
          x-field-uid: 1
          x-enum:
            value:
              x-field-uid: 1
            max_throughput:
              x-field-uid: 2
        value:
          type: integer
          x-field-uid: 2
        max_throughput:
          type: boolean
          default: 0
          x-field-uid: 3
    #for L4-7 desire throughput
    objt= traffic.objective.throughput()
    objt.value = 100

    #for Max Throughput
    objt= traffic.objective.throughput()
    objt.max_throughput = True

@waseembaig
Copy link
Author

@bortok @vinod @ankur-sheth
Following are use cases and sample code snippet.

  1. Emulation of HTTP Client and Server, HTTP client and server as endpoints.
  2. Emulation of TCP and TCP as endpoints.
  3. One arm use case - Emulation of HTTP client with real server, HTTP client and real server as endpoints.

snappi_diagram

api = snappi.api(location="http://127.0.0.1:5000", verify=False)

config = api.config()
#use case 1 - Emulation of HTTP client and server
port_1 = config.ports.port(name="p1", location="10.39.46.4/11/3")[-1]
port_2 = config.ports.port(name="p2", location="10.39.46.4/11/7")[-1]
(device_3, device_4) = config.devices.device(name="device_3").device(name="device_4")
(eth_3,) = device_3.ethernets.ethernet(name="device_3.eth_3")
eth_3.connection.port_name = "p1"
eth_3.mac = "00:00:01:00:00:01"
(eth_4,) = device_4.ethernets.ethernet(name="device_4.eth_4")
eth_4.connection.port_name = "p2"
eth_4.mac = "00:00:02:00:00:01"
(ipv4_3,) = eth_3.ipv4_addresses.ipv4(name="eth_3.ipv4")
ipv4_3.address = "173.173.173.10"
ipv4_3.gateway = "0.0.0.0"
(ipv4_4,) = eth_4.ipv4_addresses.ipv4(name="eth_4.ipv4")
ipv4_4.address = "173.173.173.20"
ipv4_4.gateway = "0.0.0.0"

(app_1, app_2) = config.apps.app(name="app_1").app(name="app_2")
(tcp_1,) = app_1.tcp.tcp(name="tcp1")
tcp_1.keep_alive_time = 120
(tcp2,) = app_2.tcp.tcp(name="tcp2")
tcp2.keep_alive_time = 120

(http_client_1,) = app_1.http_client.httpclient()
http_client_1.client.name="HTTP_client1"
http_client_1.client.transport_name = tcp_1.name
http_client_1.client.command_timeout = 60
http_client_1.client.cookie_reject_probability = False
(m1,) = http_client_1.client.methods.get()
m1.server = "Traffic2_HTTPServer1:80"
m1.page = "/64k.html"


(http_client_2,) = app_2.http_server.httpserver()
#http_client_2.server.name="HTTP_server1"
http_client_2.server.name = "HTTP_server1"
http_client_2.server.transport_name = tcp2.name
http_client_2.server.http_port = 80

#Traffic configs

traffic = app_1.stateful_flows.statefulflow()[-1]
traffic.client.protocol = http_client_1.client.name
traffic_c_ep=traffic.client.endpoints.client()[-1]
traffic_c_ep.ip_interface_name = ipv4_3.name

traffic_c_ep.ports.values = [1]

traffic.server.protocol = http_client_2.server.name  
traffic_sl_ep = traffic.server.endpoints.server()[-1]
traffic_sl_ep.dest.name = ipv4_4.name
traffic_sl_ep.ports.values = [1]

#Use case 2: Testcase for tcp as endpoints

port_5 = config.ports.port(name="p5", location="10.39.46.4/11/5")[-1]
port_6 = config.ports.port(name="p6", location="10.39.46.4/11/6")[-1]
(device_5, device_6) = config.devices.device(name="device_5").device(name="device_6")
(eth_5,) = device_5.ethernets.ethernet(name="device_5.eth_5")
eth_5.connection.port_name = "p5"
eth_5.mac = "00:00:01:00:00:01"
(eth_6,) = device_6.ethernets.ethernet(name="device_6.eth_6")
eth_6.connection.port_name = "p6"
eth_6.mac = "00:00:02:00:00:01"
(ipv4_5,) = eth_5.ipv4_addresses.ipv4(name="eth_5.ipv4")
ipv4_5.address = "173.173.173.10"
ipv4_5.gateway = "0.0.0.0"
(ipv4_6,) = eth_6.ipv4_addresses.ipv4(name="eth_6.ipv4")
ipv4_6.address = "173.173.173.20"
ipv4_6.gateway = "0.0.0.0"

(app_3, app_4) = config.apps.app(name="app_3").app(name="app_4")
(tcp_3,) = app_3.tcp.tcp(name="tcp_3")
tcp_3.keep_alive_time = 120
(tcp_4,) = app_4.tcp.tcp(name="tcp_4")
tcp_4.keep_alive_time = 120


#stateful_2 configs

stateful_2 = app_3.stateful_flows.statefulflow()[-1]
stateful_2.client.protocol = tcp_3.name
stateful_2_c_ep=stateful_2.client.endpoints.client()[-1]
stateful_2_c_ep.ip_interface_name = ipv4_5.name

stateful_2_c_ep.ports.values = [1]

stateful_2.server.protocol = tcp_4.name
stateful_2_sl_ep = stateful_2.server.endpoints.server()[-1]
stateful_2_sl_ep.dest.name = ipv4_6.name
stateful_2_sl_ep.ports.values = [1]

# Use case 3 - Testcase for One arm test

port_1 = config.ports.port(name="p7", location="10.39.46.4/11/7")[-1]
(device_7,)= config.devices.device(name="device_7")
(eth_7,) = device_7.ethernets.ethernet(name="device_7.eth_7")
eth_7.connection.port_name = "p7"
eth_7.mac = "00:00:01:00:00:01"
(ipv4_7,) = eth_7.ipv4_addresses.ipv4(name="eth_7.ipv4")
ipv4_7.address = "173.173.173.10"
ipv4_7.gateway = "0.0.0.0"

(app_5,)  = config.apps.app(name="app_5")
(tcp_5,) = app_5.tcp.tcp(name="tcp_5")
tcp_5.keep_alive_time = 120

(http_client_1,) = app_5.http_client.httpclient()
http_client_1.client.name="HTTP_client1"
http_client_1.client.transport_name = tcp_5.name
http_client_1.client.command_timeout = 60
http_client_1.client.cookie_reject_probability = False
(m1,) = http_client_1.client.methods.get()
m1.server = "10.10.10.100"
m1.page = "/64k.html"

#stateful_3 configs
traffic = app_5.stateful_flows.statefulflow()[-1]
traffic.client.protocol = http_client_1.client.name
traffic_c_ep=traffic.client.endpoints.client()[-1]
traffic_c_ep.ip_interface_name = ipv4_7.name
traffic_c_ep.ports.values = [1]

traffic_sl_ep = traffic.server.endpoints.server()[-1]
traffic_sl_ep.dest.ipv4_address = "10.10.10.100"

response = api.set_config(config)
print(response)

response = api.get_config()
print(response)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants