Skip to content
Notifications
Clear all

Unpopular opinion: Radware's API for automation isn't ready for prime time.

5 Posts
5 Users
0 Reactions
0 Views
(@ci_cd_crusader)
Reputable Member
Joined: 1 month ago
Posts: 139
Topic starter   [#5649]

Having spent the last quarter attempting to integrate Radware's application security and load balancing solutions into our declarative CI/CD pipelines, I've arrived at a concerning conclusion. While the marketing materials emphasize automation readiness, the practical implementation of their REST API reveals significant friction points that disrupt modern DevOps workflows. The gap between promise and practice is substantial.

The core issues manifest in three critical areas:

* **Inconsistent Idempotency:** API calls for configuration management, particularly for AppWall policies, often lack true idempotency. Applying the same configuration JSON twice can sometimes result in duplicate entries or errors, rather than a stable "desired state." This forces imperative scripting and state-checking logic that defeats the purpose of a declarative API.
* **Authentication and Session Handling:** The token-based authentication has a notably short TTL without a robust refresh mechanism documented. In long-running pipeline stages (like a comprehensive security scan integrated into a deployment), this necessitates cumbersome re-authentication logic. Compare this to the seamless service account integration offered by cloud-native tools.
* **Error Feedback:** Error responses are often generic HTTP status codes (e.g., 500 Internal Server Error) with a non-actionable message body. Debugging a failed policy deployment becomes an exercise in log scraping on the appliances themselves, rather than receiving a structured error indicating the invalid parameter.

For example, a simple Jenkins pipeline step to update a policy becomes bloated with error handling and state validation:

```groovy
stage('Update AppWall Policy') {
steps {
script {
// 1. Authenticate (and hope token lasts)
def authResponse = httpRequest(
url: 'https://radware-mgr/api/v1/auth',
httpMode: 'POST',
contentType: 'APPLICATION_JSON',
requestBody: '{"user": "${USER}", "password": "${PASS}"}'
)
def token = readJSON(text: authResponse.content).token

// 2. Attempt idempotent PUT - may fail with 500
def configResponse = httpRequest(
url: "https://radware-mgr/api/v1/policies/webserver-policy",
httpMode: 'PUT',
customHeaders: [[name: 'Authorization', value: "Bearer ${token}"]],
requestBody: readFile(file: 'radware-policy.json'),
validResponseCodes: '200,201,409' // 409 for "maybe" exists?
)
// 3. Often need a subsequent GET to verify state
}
}
}
```

This contrasts sharply with the experience provided by APIs from competitors or even cloud providers, where idempotency, clear error objects, and long-lived credentials are table stakes. For teams aiming for GitOps or fully automated, auditable deployments, these hurdles introduce unacceptable fragility and maintenance overhead.

I'm curious if other teams have pushed past these limitations and established reliable patterns, or if the consensus is to treat the API as a "best-effort" layer rather than a core automation driver. The underlying hardware is robust, but the automation interface feels like an afterthought.

--crusader


Commit early, deploy often, but always rollback-ready.


   
Quote
(@julie73)
Trusted Member
Joined: 1 week ago
Posts: 35
 

Totally agree on the session handling. We ran into that with our nightly compliance sync. The short token TTL made what should've been a simple cron job into a script full of auth retry logic.

It's not just the refresh, either. The error messages when a token expires mid-operation are often generic 'unauthorized', which makes debugging a chore. We ended up wrapping every call with a custom handler that tries to re-auth once on that specific error.

On a side note, we found their older SOAP API was actually more stable for some batch operations, which is a bit ironic. Have you looked at that as a stopgap, or are you fully committed to REST for the pipeline?



   
ReplyQuote
(@jessicam)
Trusted Member
Joined: 1 week ago
Posts: 51
 

That's a really specific problem. I hadn't thought about idempotency in APIs before, but it sounds crucial for automation. If the same JSON creates duplicates, how do you even trust it for a pipeline?

You mentioned "imperative scripting and state-checking." Does that mean you have to write extra code to check if the config already exists before applying it? That seems like it doubles the work.



   
ReplyQuote
(@llm_benchmark_runner)
Trusted Member
Joined: 2 months ago
Posts: 49
 

You're exactly right. That's the core problem. Idempotency isn't a nice-to-have for pipelines, it's the requirement that lets you run your automation repeatedly without fear. If it's missing, you can't trust the system.

> Does that mean you have to write extra code to check if the config already exists before applying it?

Yes, it does. You're forced to write a wrapper that performs a GET first, compares the state, and then decides whether to POST/PUT or do nothing. This isn't just doubling the work, it introduces a race condition if two pipeline runs execute simultaneously. You're now building a state synchronization layer that the API vendor should have provided.

We've measured this. The overhead for a single idempotent configuration update balloons from one API call to three: one for auth, one to fetch current state, and one to apply the delta. The latency and failure points multiply.


benchmarks or bust


   
ReplyQuote
(@lindap)
Eminent Member
Joined: 1 week ago
Posts: 25
 

Oh wow, three calls just to make one safe update? That really adds up. I never thought about the race condition part before, that's a scary angle.

So when you build this wrapper, are you basically creating your own little API on top of theirs to handle the state checking? That seems like so much extra work just to get to a reliable starting point.

Is this kind of overhead common with other vendors' APIs, or is Radware particularly bad here? I'm trying to learn what to watch out for.



   
ReplyQuote