0

Get pool members

by
Published today

List the members of an LTM pool with their address, session and state. Pool is the pool name (with partition) or its full path, e.g. /Common/web_pool.

Script f5_bigip Verified

The script

Submitted by hugo989 Typescript (fetch-only)
Verified 6 hours ago
1
//native
2

3
async function connect(auth: RT.F5Bigip): Promise<{
4
  base: string
5
  headers: { [key: string]: string }
6
  release: () => Promise<void>
7
}> {
8
  const base = auth.base_url.replace(/\/+$/, "")
9
  if (auth.auth_method === "basic") {
10
    return {
11
      base,
12
      headers: {
13
        Authorization: `Basic ${btoa(`${auth.username}:${auth.password}`)}`,
14
      },
15
      release: async () => {},
16
    }
17
  }
18
  const login = await fetch(`${base}/mgmt/shared/authn/login`, {
19
    method: "POST",
20
    headers: { "Content-Type": "application/json", Accept: "application/json" },
21
    body: JSON.stringify({
22
      username: auth.username,
23
      password: auth.password,
24
      loginProviderName: auth.login_provider_name || "tmos",
25
    }),
26
  })
27
  if (!login.ok) {
28
    throw new Error(`${login.status} ${await login.text()}`)
29
  }
30
  const token: string = (await login.json()).token.token
31
  return {
32
    base,
33
    headers: { "X-F5-Auth-Token": token },
34
    release: async () => {
35
      await fetch(
36
        `${base}/mgmt/shared/authz/tokens/${encodeURIComponent(token)}`,
37
        {
38
          method: "DELETE",
39
          headers: { "X-F5-Auth-Token": token },
40
        }
41
      )
42
    },
43
  }
44
}
45

46
// "/Common/web" or "web" + partition -> "~Common~web" (iControl REST object reference);
47
// "%" (route domains, e.g. 10.0.0.1%2:80), "?" and "#" are escaped
48
function ref(name: string, partition: string | undefined) {
49
  const path = name.startsWith("/") ? name : `/${partition || "Common"}/${name}`
50
  return path.replace(/\//g, "~").replace(/[%?#]/g, encodeURIComponent)
51
}
52

53
/**
54
 * Get pool members
55
 * List the members of an LTM pool with their address, session (user-enabled / user-disabled) and state (up, down, user-down…).
56
 */
57
export async function main(
58
  auth: RT.F5Bigip,
59
  pool: string,
60
  partition: string | undefined
61
) {
62
  const f5 = await connect(auth)
63
  try {
64
    const response = await fetch(
65
      `${f5.base}/mgmt/tm/ltm/pool/${ref(pool, partition)}/members`,
66
      { headers: { ...f5.headers, Accept: "application/json" } }
67
    )
68

69
    if (!response.ok) {
70
      throw new Error(`${response.status} ${await response.text()}`)
71
    }
72

73
    return await response.json()
74
  } finally {
75
    await f5.release()
76
  }
77
}
78