Dynamically create proxies, record traffic, and create assets using the REST API

Chris ColosimoChris Colosimo Posts: 95 admin

I was recently at a customer engagement and they had the following requirement:

We would like to create proxies on the fly, record traffic, create the asset, then delete the proxy.

Parasoft has a powerful REST API that can easily facilitate this. This script does the following
1. Creates a new Proxy in record mode
2. Grabs the proxy ID
3. Executes a test (Through the proxy)
4. Turns off the proxy
5. creates a virtual service from traffic
6. (Optional) Deletes the proxy

This script could be used to create multiple recordings and assets by looping through the v6/messageProxies PUT

Enjoy!
#Dynamic Proxy and Asset creator script
#Written 11/7/2019 by Chris Colosimo

#Server Settings
VIRT_USER=admin
VIRT_PASS=admin
VIRT_HOST=localhost
VIRT_PORT=9080

#Proxy Settings
PROXY_NAME=dynamicProxy
PROXY_LISTEN_PATH="/dynamicproxy"
PROXY_SERVICE_HOST="deckofcardsapi.com"
PROXY_SERVICE_PORT=443
PROXY_SERVICE_FORWARD_PATH="/api/"
TRAFFIC_FILE_NAME=cardTraffic.txt

#Asset Settings
VA_SUBFOLDER=scratchpad
ASSET_NAME=dynamicAsset



#===================================================================================

#Create the proxy in record mode
CREATE_PROXY=$(curl -v \
  --user $VIRT_USER:$VIRT_PASS \
  --header "Content-Type: application/json" \
  --header "ParasoftRefresh: true" \
  --request POST \
  --data '{
     "name": "'$PROXY_NAME'",
      "enabled": true,
      "recording": true,
      "description": "",
      "connections": [
        {
          "type": "HTTP",
          "httpProxy": {
            "connection": {
              "proxySettings": {
                "proxyListenPath": "'$PROXY_LISTEN_PATH'"
              },
              "primaryConnection": {
                "serviceHost": "'$PROXY_SERVICE_HOST'",
                "servicePort": '$PROXY_SERVICE_PORT',
                "serviceForwardPath": "'$PROXY_SERVICE_FORWARD_PATH'"
              },
              "secondaryConnection": {
                "useSecondaryConnectionIfPrimaryFails": {
                  "enabled": false,
                  "value": {
                    "serviceHost": "",
                    "servicePort": 80,
                    "serviceForwardPath": "",
                    "recordingOptions": "BOTH_CONNECTIONS"
                  }
                }
              }
            },
            "security": {
              "sslSettings": {
                "useSsl": {
                  "enabled": true,
                  "value": {
                    "trustAllCertificates": false,
                    "acceptSelfSignedCertificates": false,
                    "keyStore": {
                      "keyStorePassword": "AgAAAAA=",
                      "keyStoreType": "PKCS12",
                      "certificate": ""
                    },
                    "trustStore": {
                      "keyStorePassword": "AgAAAAA=",
                      "keyStoreType": "PKCS12"
                    }
                  }
                }
              }
            }
          },
          "recording": {
            "targetFile": {
              "parent": {
                "id": "/VirtualAssets/recorded_traffic"
              },
              "name": "'$TRAFFIC_FILE_NAME'"
            },
            "appendTrafficData": true,
            "newFilePerTransaction": false
          }
        }


  ]
}' \
http://$VIRT_HOST:$VIRT_PORT/soavirt/api/v6/messageProxies)
echo "==================================================================="

#Get the Proxy ID.
PROXY_ID=$(echo $CREATE_PROXY | awk -F "{\"id\":\"" '{print $2}' | awk -F "\",\"url\"" '{print $1}')
echo 'The Proxy ID is: ' $PROXY_ID

#Run Your tests Here
echo "==================================================================="
echo                          Run Your tests Here
echo http://$VIRT_HOST:$VIRT_PORT$PROXY_LISTEN_PATH/deck/new/draw/?count=2
curl http://$VIRT_HOST:$VIRT_PORT$PROXY_LISTEN_PATH/deck/new/draw/?count=2
echo
echo "==================================================================="

#Optional turn off recording and disable the proxy
#You can also use this PUT to enable/disable and change other fields of an existing Proxy
curl -v \
  --user $VIRT_USER:$VIRT_PASS \
  --header "Content-Type: application/json" \
  --header "ParasoftRefresh: true" \
  --request PUT \
  --data '{
     "name": "'$PROXY_NAME'",
      "enabled": false,
      "recording": false,
      "description": "",
      "connections": [
        {
          "type": "HTTP",
          "httpProxy": {
            "connection": {
              "proxySettings": {
                "proxyListenPath": "'$PROXY_LISTEN_PATH'"
              },
              "primaryConnection": {
                "serviceHost": "'$PROXY_SERVICE_HOST'",
                "servicePort": '$PROXY_SERVICE_PORT',
                "serviceForwardPath": "'$PROXY_SERVICE_FORWARD_PATH'"
              },
              "secondaryConnection": {
                "useSecondaryConnectionIfPrimaryFails": {
                  "enabled": false,
                  "value": {
                    "serviceHost": "",
                    "servicePort": 80,
                    "serviceForwardPath": "",
                    "recordingOptions": "BOTH_CONNECTIONS"
                  }
                }
              }
            },
            "security": {
              "sslSettings": {
                "useSsl": {
                  "enabled": true,
                  "value": {
                    "trustAllCertificates": false,
                    "acceptSelfSignedCertificates": false,
                    "keyStore": {
                      "keyStorePassword": "AgAAAAA=",
                      "keyStoreType": "PKCS12",
                      "certificate": ""
                    },
                    "trustStore": {
                      "keyStorePassword": "AgAAAAA=",
                      "keyStoreType": "PKCS12"
                    }
                  }
                }
              }
            }
          },
          "recording": {
            "targetFile": {
              "parent": {
                "id": "/VirtualAssets/recorded_traffic"
              },
              "name": "'$TRAFFIC_FILE_NAME'"
            },
            "appendTrafficData": true,
            "newFilePerTransaction": false
          }
        }


  ]
}' \
http://$VIRT_HOST:$VIRT_PORT/soavirt/api/v6/messageProxies/$PROXY_ID
echo
echo "==================================================================="

#Create the PVA file

curl -v \
  --user $VIRT_USER:$VIRT_PASS \
  --header "Content-Type: application/json" \
  --header "ParasoftRefresh: true" \
  --request POST \
  --data '{
  "inferConstraints": "",
  "parent": {
    "id": "/VirtualAssets/'$VA_SUBFOLDER'/"
  },
  "name": "'$ASSET_NAME'",
  "trafficFile": {
    "id": "VirtualAssets/recorded_traffic/'$TRAFFIC_FILE_NAME'"
  },
  "repositoryConnectionSettings": {
    "host": "localhost",
    "port": 2424,
    "repositoryName": "'$ASSET_NAME'",
    "user": "admin",
    "password": "admin"
  },
  "dataReuse": {
    "dataSetImport": "update"
  },
  "characterEncoding": ""
}' \
http://$VIRT_HOST:$VIRT_PORT/soavirt/api/v6/files/pvas/traffic
echo
echo "==================================================================="

#Optional delete the proxy
curl -X DELETE \
  --user $VIRT_USER:$VIRT_PASS \
  --header "Content-Type: application/json" \
  --header "ParasoftRefresh: true" \
http://$VIRT_HOST:$VIRT_PORT/soavirt/api/v6/messageProxies/$PROXY_ID
echo
echo "==================================================================="

#Finalize 
echo "Your asset is ready, You can access it at the following endpoint" 
echo "http://$VIRT_HOST:$VIRT_PORT/$ASSET_NAME$PROXY_LISTEN_PATH/deck/new/draw"
echo
echo "==================================================================="

Comments

Sign In or Register to comment.