F5Networks / f5-appsvcs-extension

F5 BIG-IP Application Services 3 Extension
Apache License 2.0
163 stars 52 forks source link

AS3 will not allow changes to the Service_Address class' virtualAddress value #799

Open ghost opened 5 months ago

ghost commented 5 months ago

Environment

Summary

When I deploy an application with a custom virtualAddress, the deployment works fine. If I change the IP address in the Service_Address class under virtualAddress, I receive the following error:

status: 422: /declare failed with status of 422, Failed to send declaration: /declare failed with status of 422, declaration failed The Service Address virtualAddress property cannot be modified. Please delete /CaaS-Clusters_iten/custom-address and recreate it.

If I send in the same declaration with the modified IP address AND also modify the virtual-address name, the configuration is updated properly.

Steps To Reproduce

Steps to reproduce the behavior:

  1. Submit the following declaration:

    {
    "$schema": "https://raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/master/schema/latest/as3-schema.json",
    "applicationDescription": "github_bug_report",
    "applicationName": "my_test_app",
    "appSvcsDeclaration": {
        "class": "AS3",
        "declaration": {
            "class": "ADC",
            "label": "LAB",
            "remark": "Deployment using http",
            "target": {
                "address": "10.1.1.7"
            },
            "schemaVersion": "3.36.0",
            "id": "93249234923-42349239523",
            "my_test_tenant": {
                "class": "Tenant",
                "my_test_app": {
                    "class": "Application",
                    "my_test_pool": {
                        "class": "Pool",
                        "monitors": [
                            "http"
                        ],
                        "members": [
                            {
                                "servicePort": 80,
                                "serverAddresses": [
                                    "192.168.1.100"
                                ]
                            }
                        ]
                    },
                    "my_test_vs": {
                        "pool": "my_test_pool",
                        "class": "Service_HTTP",
                        "snat": "auto",
                        "virtualPort": 80,
                        "redirect80": true,
                        "profileHTTP": {
                            "use": "Custom_HTTP_Profile"
                        },
                        "profileAnalyticsTcp": {
                            "bigip": "/Common/tcp-analytics"
                        },
                        "virtualAddresses": [
                            {
                                "use": "custom-address"
                            }
                        ],
                        "persistenceMethods": [
                            "source-address"
                        ]
                    },
                    "custom-address": {
                        "class": "Service_Address",
                        "virtualAddress": "10.1.1.100",
                        "arpEnabled": false,
                        "icmpEcho": "disable",
                        "routeAdvertisement": "selective"
                    },
                    "Custom_HTTP_Profile": {
                        "class": "HTTP_Profile",
                        "remark": "An HTTP Profile",
                        "insertHeader": {
                            "name": "X-Forwarded-IP",
                            "value": "[expr {[IP::client_addr] }]"
                        }
                    }
                }
            }
        }
    }
    }
  2. Observe the following successful response:

    {
    "id": "198ca36b-b2b4-453e-b31f-808237e0e523",
    "kind": "cm:global:tasks:deploy-to-application:deploycomponentapptoglobalapptaskstate",
    "status": "FINISHED",
    "selfLink": "https://localhost/mgmt/cm/global/tasks/deploy-to-application/198ca36b-b2b4-453e-b31f-808237e0e523",
    "username": "admin",
    "generation": 9,
    "currentStep": "DONE",
    "endDateTime": "2024-02-06T13:59:40.758-0800",
    "startDateTime": "2024-02-06T13:59:17.757-0800",
    "userReference": {
        "link": "https://localhost/mgmt/shared/authz/users/admin"
    },
    "ownerMachineId": "e8b6a888-24e4-426c-8088-542f69f6f78d",
    "applicationName": "my_test_app",
    "lastUpdateMicros": 1707256780808599,
    "appSvcsDeclaration": {
        "generation": 0,
        "declaration": {
            "id": "93249234923-42349239523",
            "class": "ADC",
            "label": "LAB",
            "remark": "Deployment using http",
            "target": {
                "address": "10.1.1.7"
            },
            "schemaVersion": "3.36.0",
            "my_test_tenant": {
                "class": "Tenant",
                "my_test_app": {
                    "class": "Application",
                    "my_test_vs": {
                        "pool": "my_test_pool",
                        "snat": "auto",
                        "class": "Service_HTTP",
                        "redirect80": true,
                        "profileHTTP": {
                            "use": "Custom_HTTP_Profile"
                        },
                        "virtualPort": 80,
                        "virtualAddresses": [
                            {
                                "use": "custom-address"
                            }
                        ],
                        "persistenceMethods": [
                            "source-address"
                        ],
                        "profileAnalyticsTcp": {
                            "bigip": "/Common/tcp-analytics"
                        }
                    },
                    "my_test_pool": {
                        "class": "Pool",
                        "members": [
                            {
                                "servicePort": 80,
                                "serverAddresses": [
                                    "192.168.1.100"
                                ]
                            }
                        ],
                        "monitors": [
                            "http"
                        ]
                    },
                    "custom-address": {
                        "class": "Service_Address",
                        "icmpEcho": "disable",
                        "arpEnabled": false,
                        "virtualAddress": "10.1.1.100",
                        "routeAdvertisement": "selective"
                    },
                    "Custom_HTTP_Profile": {
                        "class": "HTTP_Profile",
                        "remark": "An HTTP Profile",
                        "insertHeader": {
                            "name": "X-Forwarded-IP",
                            "value": "[expr {[IP::client_addr] }]"
                        }
                    }
                }
            }
        },
        "lastUpdateMicros": 0
    },
    "identityReferences": [
        {
            "link": "https://localhost/mgmt/shared/authz/users/admin"
        }
    ],
    "applicationDescription": "github_bug_report",
    "requiredNewApplication": false
    }
  3. Now, change the virtualAddress value and re-submit.

{
    "$schema": "https://raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/master/schema/latest/as3-schema.json",
    "applicationDescription": "github_bug_report",
    "applicationName": "my_test_app",
    "appSvcsDeclaration": {
        "class": "AS3",
        "declaration": {
            "class": "ADC",
            "label": "LAB",
            "remark": "Deployment using http",
            "target": {
                "address": "10.1.1.7"
            },
            "schemaVersion": "3.36.0",
            "id": "93249234923-42349239523",
            "my_test_tenant": {
                "class": "Tenant",
                "my_test_app": {
                    "class": "Application",
                    "my_test_pool": {
                        "class": "Pool",
                        "monitors": [
                            "http"
                        ],
                        "members": [
                            {
                                "servicePort": 80,
                                "serverAddresses": [
                                    "192.168.1.100"
                                ]
                            }
                        ]
                    },
                    "my_test_vs": {
                        "pool": "my_test_pool",
                        "class": "Service_HTTP",
                        "snat": "auto",
                        "virtualPort": 80,
                        "redirect80": true,
                        "profileHTTP": {
                            "use": "Custom_HTTP_Profile"
                        },
                        "profileAnalyticsTcp": {
                            "bigip": "/Common/tcp-analytics"
                        },
                        "virtualAddresses": [
                            {
                                "use": "custom-address"
                            }
                        ],
                        "persistenceMethods": [
                            "source-address"
                        ]
                    },
                    "custom-address": {
                        "class": "Service_Address",
                        "virtualAddress": "10.1.1.101",
                        "arpEnabled": false,
                        "icmpEcho": "disable",
                        "routeAdvertisement": "selective"
                    },
                    "Custom_HTTP_Profile": {
                        "class": "HTTP_Profile",
                        "remark": "An HTTP Profile",
                        "insertHeader": {
                            "name": "X-Forwarded-IP",
                            "value": "[expr {[IP::client_addr] }]"
                        }
                    }
                }
            }
        }
    }
}
  1. Observe the following error response:
{
    "id": "678f2140-874c-428b-8323-ab89efbec84d",
    "kind": "cm:global:tasks:deploy-to-application:deploycomponentapptoglobalapptaskstate",
    "status": "FAILED",
    "selfLink": "https://localhost/mgmt/cm/global/tasks/deploy-to-application/678f2140-874c-428b-8323-ab89efbec84d",
    "username": "admin",
    "generation": 3,
    "currentStep": "GET_APP_SVCS",
    "endDateTime": "2024-02-06T14:02:00.315-0800",
    "errorMessage": "status: 422: /declare failed with status of 422, Failed to send declaration: /declare failed with status of 422, declaration failed The Service Address virtualAddress property cannot be modified. Please delete /my_test_tenant/custom-address and recreate it. ",
    "startDateTime": "2024-02-06T14:01:41.226-0800",
    "userReference": {
        "link": "https://localhost/mgmt/shared/authz/users/admin"
    },
    "ownerMachineId": "e8b6a888-24e4-426c-8088-542f69f6f78d",
    "applicationName": "my_test_app",
    "lastUpdateMicros": 1707256920365591,
    "appSvcsDeclaration": {
        "generation": 0,
        "declaration": {
            "id": "93249234923-42349239523",
            "class": "ADC",
            "label": "LAB",
            "remark": "Deployment using http",
            "target": {
                "address": "10.1.1.7"
            },
            "schemaVersion": "3.36.0",
            "my_test_tenant": {
                "class": "Tenant",
                "my_test_app": {
                    "class": "Application",
                    "my_test_vs": {
                        "pool": "my_test_pool",
                        "snat": "auto",
                        "class": "Service_HTTP",
                        "redirect80": true,
                        "profileHTTP": {
                            "use": "Custom_HTTP_Profile"
                        },
                        "virtualPort": 80,
                        "virtualAddresses": [
                            {
                                "use": "custom-address"
                            }
                        ],
                        "persistenceMethods": [
                            "source-address"
                        ],
                        "profileAnalyticsTcp": {
                            "bigip": "/Common/tcp-analytics"
                        }
                    },
                    "my_test_pool": {
                        "class": "Pool",
                        "members": [
                            {
                                "servicePort": 80,
                                "serverAddresses": [
                                    "192.168.1.100"
                                ]
                            }
                        ],
                        "monitors": [
                            "http"
                        ]
                    },
                    "custom-address": {
                        "class": "Service_Address",
                        "icmpEcho": "disable",
                        "arpEnabled": false,
                        "virtualAddress": "10.1.1.101",
                        "routeAdvertisement": "selective"
                    },
                    "Custom_HTTP_Profile": {
                        "class": "HTTP_Profile",
                        "remark": "An HTTP Profile",
                        "insertHeader": {
                            "name": "X-Forwarded-IP",
                            "value": "[expr {[IP::client_addr] }]"
                        }
                    }
                }
            }
        },
        "lastUpdateMicros": 0
    },
    "identityReferences": [
        {
            "link": "https://localhost/mgmt/shared/authz/users/admin"
        }
    ],
    "applicationDescription": "github_bug_report",
    "requiredNewApplication": false
}

Expected Behavior

AS3 should realize that, in order to fulfill this request, the virtual server needs to be deleted, the virtual address needs to be deleted, and then both objects added back. The workaround is to either change the Service_Address class' name (for example, custom-address-new) or delete the application and re-deploy.

Actual Behavior

The error above is received and no updates are made to the configuration.

sunitharonan commented 4 months ago

Please reach out to us at automation_toolchain_pm@f5.com in order for us to prioritize. Thanks.