f5-appsvcs-extension: Pool members cannot be given object names other than their IP addresses

ISSUE TYPE
  • Feature Idea
AS3 BUILD/ VERSION
f5-appsvcs-3.11.0-3.noarch
BIGIP VERSION
Sys::Version
Main Package
  Product     BIG-IP
  Version     13.1.0.3
  Build       0.0.5
  Edition     Point Release 3
  Date        Mon Feb 12 19:22:50 PST 2018
SUMMARY

When creating a pool in an application, I cannot create a pool member that has a name. The name winds up being the IP address I put into the declaration. For example, this declaration:

 {
     "class": "AS3",
     "action": "deploy",
     "persist": true,
     "declaration": {
         "class": "ADC",
         "schemaVersion": "3.0.0",
         "id": "SomeUID",
         "label": "Sample 1",
         "remark": "Simple HTTP Service with Round-Robin Load Balancing",
         "Sample_01": {
             "class": "Tenant",
             "A1": {
                 "class": "Application",
                 "template": "http",
                 "serviceMain": {
                     "class": "Service_HTTP",
                     "virtualAddresses": [
                         "10.0.1.10"
                     ],
                     "pool": "web_pool"
                 },
                 "web_pool": {
                     "class": "Pool",
                     "monitors": [
                         "http"
                     ],
					"members": [
						{
							"addressDiscovery": "static",
							"servicePort": 443,
							"serverAddresses": [
								"10.138.89.61"
							],
							"hostname": "remark1.hostname.local"
						},
						{
							"addressDiscovery": "static",
							"servicePort": 443,
							"serverAddresses": [
								"10.138.89.62"
							],
							"hostname": "remark2.hostname.local"
						},
						{
							"addressDiscovery": "static",
							"servicePort": 443,
							"serverAddresses": [
								"10.138.89.63"
							],
							"hostname": "remark3.hostname.local"
						}
					]
                 }
             }
         }
     }
 }

I know that the “hostname” declaration only works when the “addressDiscovery” declaration is set to “fqdn”.

In TMSH, I can create pool members with names, but then specify the IP address:

create ltm pool my_test_pool monitor http members add { hostname11.tocci.local:80 { address 10.1.20.111 } hostname12.tocci.local:80 { address 10.1.20.112 } hostname13.tocci.local:80 { address 10.1.20.113 } }

The client I’m working with would like to create the pool members with names. He has other automation that requires this.

STEPS TO REPRODUCE

Basically, allow the “hostname” declaration to work when “addressDiscovery” is set to “static”

See sample declaration above.

EXPECTED RESULTS

To see the hostname in the pool member like this (I know this is TMSH but since I can’t do it in AS3 I have to do this):

ltm pool my_test_pool {
    members {
        hostname11.tocci.local:http {
            address 10.1.20.111
            session monitor-enabled
            state down
        }
        hostname12.tocci.local:http {
            address 10.1.20.112
            session monitor-enabled
            state down
        }
        hostname13.tocci.local:http {
            address 10.1.20.113
            session monitor-enabled
            state down
        }
    }
    monitor http 
}
ACTUAL RESULTS
root@(bigip170)(cfg-sync Standalone)(Active)(/Common)(tmos)# cd ../Sample_01/A1/
root@(bigip170)(cfg-sync Standalone)(Active)(/Sample_01/A1)(tmos)# list ltm pool
ltm pool web_pool {
    members {
        /Sample_01/10.138.89.61:https {
            address 10.138.89.61
            session monitor-enabled
            state down
            metadata {
                source {
                    value declaration
                }
            }
        }
        /Sample_01/10.138.89.62:https {
            address 10.138.89.62
            session monitor-enabled
            state down
            metadata {
                source {
                    value declaration
                }
            }
        }
        /Sample_01/10.138.89.63:https {
            address 10.138.89.63
            session monitor-enabled
            state down
            metadata {
                source {
                    value declaration
                }
            }
        }
    }
    min-active-members 1
    monitor min 1 of { /Common/http }
    partition Sample_01
}

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Reactions: 5
  • Comments: 43 (7 by maintainers)

Most upvoted comments

Another API update. Once we dug in a bit deeper we decided that having a ‘class’ so deep in the declaration was also not idea. Meanwhile, in iRules, we support having an array of objects with a name property so we went with that approach here too. Further, we want to allow for other properties we might add in the future. The resulting schema is

{
    "properties": {
        "serverAddresses": {
            "title": "Server addresses",
            "description": "Static IP addresses of servers (nodes). Shorthand for 'servers' where you only want to specify the address property.",
            "type": "array",
            "items": {
                "title": "Server address",
                "description": "Static IP address for this server (node)",
                "type": "string",
                "format": "f5ip"
            },
            "uniqueItems": true
        },
        "servers": {
            "title": "Servers",
            "description": "Same as serverAddresses, but allowing for further specification of each node.",
            "type": "array",
            "items": {
                "title": "Servers",
                "description": "Static IP address and other details for this server (node)",
                "type": "object",
                "properties": {
                    "address": {
                        "title": "Server address",
                        "description": "Static IP address for this server (node)",
                        "type": "string",
                        "format": "f5ip"
                    },
                    "name": {
                        "title": "Name",
                        "type": "string",
                        "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$",
                        "maxLength": 64
                    }
                },
                "required": [
                    "address"
                ]
            }
        }
    }
}

An example declaration is for a pool is

"web_pool": {
    "class": "Pool",
    "monitors": [
      "http"
    ],
    "members": [
        {
            "servicePort": 80,
            "serverAddresses": [
                "192.0.1.10",
                "192.0.1.11"
            ],
            "servers": [
                {
                    "name": "myNode1.example.com",
                    "address": "192.0.2.10"
                },
                {
                    "name": "myNode2.example.com",
                    "address": "192.0.2.11"
                }
            ],
            "enable": true,
            "connectionLimit": 0,
            "rateLimit": -1,
            "dynamicRatio": 1,
            "ratio": 1,
            "priorityGroup": 0,
            "adminState": "enable",
            "addressDiscovery": "static"
        }
    ]
}